0

这似乎是一个愚蠢的问题,但我一直在寻找最后一个半小时。我有一条使用 RSA 密钥对的 PRIVATE 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 说没有密钥集。我需要标记一些东西以让它知道我想使用公钥解密吗?

4

3 回答 3

2

所有这一切都是抛出一个 CryptographicException 说没有密钥集。我需要标记一些东西以让它知道我想使用公钥解密吗?

不,中高级密码库不支持私钥加密、公钥解密等异常操作。如果需要,您需要使用数学原语来实现 RSA。

也许,您需要一个数字签名机制?

于 2013-04-03T13:09:17.590 回答
1

大多数人不使用公钥解密,因为使用公钥定义的“解密”仅仅是使用公钥验证签名的一个组成部分。因此 RSACryptoServiceProvider 只是做验证哈希,并用公钥加密。

您包含的示例代码_session.EncryptionKey表明您正在尝试实现混合密码系统。如果你正在实施的这个密码系统使用公钥来解密,那么你就没有秘密了。

我编写了谷歌高级加密框架 keyczar 的 C# 实现,它包括一个易于使用的混合加密

于 2013-04-03T12:46:36.143 回答
0

根据 Pavel 的回答,我们决定最好自己计算。我们结束了

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();

(中间有一些未填充但与问题无关,我省略了它)

感谢所有的答案 :)

于 2013-04-03T23:06:57.510 回答