【发布时间】:2015-09-01 01:10:57
【问题描述】:
我已经阅读了很多关于这个问题的文章,但我似乎找不到解决我的错误的答案。
我有 WCF 服务;我的应用程序发送生成的公钥 RSA 密钥,服务返回一组用公钥加密的 AES 密钥+IV,但是当我的应用程序尝试解密密钥时,我要么得到“解码 OAEP 填充时出错”(如果我将 true 传递给 useOAEP)或“参数不正确”(如果我将 false 传递给 useOAEP)。为简单起见,这是使用的整个代码放在一起,抛开异常处理:
public static string EncryptAES(byte[] aesKey, byte[] aesIV, string publicRSAKey)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(publicRSAKey);
byte[] encryptedKey = rsa.Encrypt(aesKey, true);
byte[] encryptedIV = rsa.Encrypt(aesIV, true);
return string.Format("{0}{1}{2}", Convert.ToBase64String(encryptedKey), "\n", Convert.ToBase64String(encryptedIV));
}
}
public static byte[] Decrypt(string aesKeyorIV)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
byte[] buffer = Convert.FromBase64String(aesKeyorIV);
rsa.FromXmlString(RSA_Private_Key);
return rsa.Decrypt(buffer, true); //Exception thrown here
}
}
(RSA_Private_Key在静态构造函数中使用rsa.ToXmlString(true)生成)
(publicRSAKey 通过在静态构造函数中发送rsa.ToXmlString(false) 传递给服务)
我尝试使用Encrypt/Decrypt(byte[], false),但没有任何区别。我也试过Array.Reverse(encryptedKey),然后Array.Reverse(buffer)。
私钥在设置后永远不会发送/修改,因此不可能。
我没有想法,调试 WCF 服务非常糟糕。
【问题讨论】:
-
@zespri,我说我正在使用 RSA 加密 AES 密钥。此外,我没有收到任何关于错误长度的错误。
-
@zespri 我正在修改整个代码以寻找可能的错误,我找不到任何会导致这种情况的东西。此外,这曾经在实现 WCF 服务之前起作用。
-
@zespri 我刚刚使用我当前的解决方案进行了测试:加密中从 Convert.ToBase64String(encryptedkey) 返回的内容与解密方法接收到的完全相同相同,即 128 字节-长字节[]。此外,我在 RSA 解密之前运行了一个 HMAC 函数,以保证消息在任何时候都不会改变。我明天(这里几乎是午夜)尝试创建一个测试用例。
标签: c# wcf encryption rsa