这似乎是一个愚蠢的问题,但我一直在寻找最后一个半小时。我有一条使用RSA密钥对的PRIVATE KEY加密的消息。我有用于解密消息的PUBLIC KEY。我一直在寻找一种方法将公钥导入RSACryptoProvider,但似乎无法找到方法。我只是将BigInteger对象作为模数和指数(构成公钥)。我似乎无法找到解密任何东西的方法。我试过了
System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
rsa.ImportParameters(new System.Security.Cryptography.RSAParameters { Exponent = BitConverter.GetBytes(12345), Modulus = BigInteger.Parse("HEX of public key", System.Globalization.NumberStyles.HexNumber).ToByteArray() });
_session.EncryptionKey = rsa.Decrypt(_session.EncryptionKey, false);
所有这一切都会引发一个CryptographicException,说没有密钥集。有什么东西需要标记让它知道我想用公钥解密吗?
答案 0 :(得分:2)
所有这一切都会引发一个CryptographicException,说没有密钥集。有什么东西需要标记让它知道我想用公钥解密吗?
没有。高级和中级加密库不支持私钥加密和公钥解密等异常操作。如果需要,您需要使用数学原语实现RSA。
也许,你需要一个数字签名机制呢?
答案 1 :(得分:1)
大多数人不使用公钥解密,因为使用公钥定义的“解密”仅仅是使用公钥验证签名的一个组件。因此,RSACryptoServiceProvider只执行VerifyHash,并使用公钥进行加密。
包含_session.EncryptionKey
的示例代码表明您正在尝试实施hybrid cryptosystem。如果您正在实施的此加密系统使用公共密钥进行解密,那么您就没有保密。
我编写了谷歌高级加密框架keyczar的C#实现,它包含一个易于使用的hybrid crypto。
答案 2 :(得分:0)
根据帕维尔的回答,我们决定最好自己做数学。我们最终得到了
var encryptionKey = new BigInteger(_session.EncryptionKey);
var result = encryptionKey.modPow(12345, BigInteger.Parse("HEX of public key", System.Globalization.NumberStyles.HexNumber).ToByteArray());
_session.EncryptionKey = result.ToByteArray();
(中间有一些unpadding,但由于这与问题无关,我省略了它)
感谢所有答案:)