2015-04-02 67 views
0

我想在C#中使用OpenSSL生成的密钥对和Bouncy Castle实现字符串加密 - 解密。C#使用OpenSSL密钥和充气城堡实现RSA

OpenSSL授予我密钥对,我在两个文件中分开。现在我使用Bouncy Castle的Pemreader来读取这些键并将它们更改为AsymmetricKeyParameters。

下面的代码会运行,但解密后的字符串与原来的不一样 - 我得到了一堆?的。

如果我打印出键,它们看起来就像在文本文件中一样。

有人能指出我做错了什么吗?直译程序或引擎使用似乎是原因。没有填充的情况下,2048位密钥的加密有多强?

 string test = "qwerty12345"; 
     AsymmetricKeyParameter keyparmeter = readPublicKey(public_path); // Read public key into string 

     /* Print the test key */ 
     Console.WriteLine("test key = " + test); 

     /* Convert test to byte array */ 
     byte[] bytes = new byte[test.Length * sizeof(char)]; 
     System.Buffer.BlockCopy(test.ToCharArray(), 0, bytes, 0, bytes.Length); 

     byte[] cipheredbytes = null; 

     /* Initiate rsa engine */ 
     RsaEngine e = new RsaEngine(); 
     e.Init(true, keyparmeter);   // initialize engine true, encrypting 

     /* Crypt! */ 
     cipheredbytes = e.ProcessBlock(bytes, 0, bytes.Length); 

     // ## NOW DECRYPTION ## 

     /* Get the private key */ 
     AsymmetricKeyParameter privkeyparameter = readPrivKey(privkey_path); 

     byte[] reversedbytes = null; 

     /* Initiate rsa decrypting engine */ 
     RsaEngine d = new RsaEngine(); 
     d.Init(false, privkeyparameter);   // initialize engine false, decrypting 

     /* Decrypt! */ 
     reversedbytes = d.ProcessBlock(cipheredbytes, 0, cipheredbytes.Length); 

     char[] chars = new char[cipheredbytes.Length/sizeof(char)]; 
     System.Buffer.BlockCopy(cipheredbytes, 0, chars, 0, cipheredbytes.Length); 
     string reversedtest = new string(chars); 

    ### PEMREADING ### 
    /* Convert PEM into AsymmetricKeyParameter */ 
    private AsymmetricKeyParameter readPublicKey(string path_to_key) 
    { 
     RsaKeyParameters asmkeypar; 

     using(var reader = File.OpenText(path_to_key)) 
      asmkeypar = (RsaKeyParameters) new PemReader(reader).ReadObject(); 

     return asmkeypar; 
    } 

    /* Convert PEM into AsymmetricKeyParameter */ 
    private AsymmetricKeyParameter readPrivKey(string path_to_key) 
    { 
     AsymmetricCipherKeyPair asmkeypar; 

     using (var reader = File.OpenText(path_to_key)) 
      asmkeypar = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject(); 

     return (RsaKeyParameters) asmkeypar.Private; 
    } 

回答

1

您正在使用基本RSA算法。这也被称为原始或教科书RSA。基本上它执行模幂运算,但它不会执行填充或不填充。所以你所得到的是明文+零值已经放在值的前面,因为无填充似乎没有发生。

最后,你应该执行字符编码来代替System.Buffer.BlockCopy,后者可能会弄得一团糟了它,因为它必须在.NET中的Unicode编码的字符串操作。

我可以在加密上引用你的this question,它试图列出原始/教科书RSA上所有可能的攻击。有很多,你的代码安全的可能性大约为零。