使用c#中收到的pem或pkcs密钥解密字符串

时间:2015-04-29 02:07:16

标签: c# encryption rsa

鉴于pem格式的键与

类似
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,DE1BB301BDE4BB45

msUEpZKZ0uaOmhGXBPnh2GoNSXyExdeqETd9w71l0G1bk1cCbiV4EOnmR7bcN+OE
(20 lines)
YoIx/E+tFHkt3gQcFhVUNgSOe/5+huXwRwUC5dthPzzZFlDCXHfwfrrBzOSGxZpX
uBs1JxY4qOLRdZVaZlQespForxBTYD6RuHi1UI5lqEW7363VyCLho9QYgGFM0LUi
qbln5WV37PTmayxMfzlGUB2XazwON+WU3obbXuCFXAy96Y6VGzv0lQ==
-----END RSA PRIVATE KEY-----

加密的字符串(使用公钥加密)我尝试用以下代码解密

TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.IV = HextoByte("DE1BB301BDE4BB45");                
des.Padding = PaddingMode.None;
des.Mode = CipherMode.CBC;   
des.Key = Convert.FromBase64String(//Key from above from ms.. to ==);                                                                  
byte[] encrypted = Convert.FromBase64String("");
byte[] decrypted = des.CreateDecryptor().TransformFinalBlock(encrypt, 0, encrypt.Length);
string decryptedString = Encoding.UTF8.GetString(decrypted) 

分配密钥时会导致异常 "指定密钥不是此算法的有效大小"

密钥是使用(也尝试使用192)生成的

openssl genrsa -des3 -out Key.pem 2048

使用

生成公钥
openssl rsa -in Key.pem -pubout > Key.pub

有人能帮助我指出我遗失或做错了吗?

谢谢

2 个答案:

答案 0 :(得分:0)

C#中3DES的最大键大小为192位。另请参阅MSDN文档here

因此,您需要确保nc -v xx.xxx.xxx.xx 9292确实返回24个字节。

请同时查看以下问题/答案:

答案 1 :(得分:0)

您正在使用带有3DES密码的RSA密钥。这是错误的钥匙。

您的问题中的私钥已使用3DES加密,可能使用基于密码的加密。您需要密钥才能解密私钥,然后才能将其用于任何事情。

恢复RSA私钥后,很可能会使用它来解密对称密钥。通常,每个加密的消息将包括用接收者的公钥加密的对称密码密钥。这就是您使用您恢复的RSA私钥解密的内容。

获得第二个对称密钥后,您可以使用它来解密实际邮件,如您在问题中所示。

在伪代码中:

rsaPvtKey = passwordDecrypt(password, encryptedPrivateKey)
contentKey = rsaDecrypt(rsaPvtKey, encryptedContentKey)
message = tripleDesDecrypt(contentKey, encryptedMessage)

原始问题中的代码非常接近。问题是密钥是从密码派生的,而消息是base-64编码的信息。成功解密这将产生PKCS#8格式的RSA私钥,而.NET应该有一个用于加载它的API。

OpenSSL密钥派生不是标准的(并且它不是很好)。您需要使用MD5哈希算法查找或编写一些代码以使用密码创建DES-EDE3密钥。

d0 = md5(password || iv)        /* Hash password and IV */
d1 = md5(d0 || password || iv)  /* Hash first hash, password, and IV */
key = subarray(d0 || d1, 0, 24) /* Take the first 24 bytes of d0 + d1 */

JavaScience code包含一个函数GetOpenSSL3deskey来执行此密钥派生。您可以使用提取的iv,密码,count为1,miter为2来调用它。

执行此操作后,请将其分配给原始代码中的des.Key。已分配给des.Key的内容应分配给encrypt。 (这是DecodeOpenSSLPrivateKey函数的作用。)完成解密后,字节数组decrypted将包含PKCS#1的中文剩余定理格式的RSA私钥。应该有一些.NET API来构建一个RSA私钥。 (请参阅DecodeRSAPrivateKey函数。)

然后可以使用此RSA私钥解密其他消息。