3

我正在尝试使用 C# 中的 RSA 算法加密一条短消息,并使用 python 脚本解密该消息。

我想在 C# 端使用 .NET 类,在 python 端使用pycrypto。我已经管理双方使用相同的密钥(这甚至不是微不足道的,因为 .NET 不直接支持标准 PEM/DER 格式)。加密/解密在双方独立工作。

我在 C# 端使用 PKCS#1 填充(将fOAEP参数设置为RSACryptoServiceProvider.Encryptto false),所以我希望在 python 中解密块后,我应该看到某种明文(即我的“消息”和填充字节)

但我看到的都是垃圾:(。

是否有任何我不知道的警告/陷阱?我有点没主意了...

谢谢马丁

示例代码

C# / 加密

Console.Write("Input string:");
var s = Console.ReadLine();
var b = Encoding.Default.GetBytes(s);
var encrypted = rsa.Encrypt(b, false);
using (var file = new FileStream(filename, FileMode.Create)) {
  file.Write(encrypted, 0, encrypted.Length);
  file.Flush();
  file.Close();
}

Python / 解密

f = open(filename, "rb")
msg = f.read()
f.close()
decrypted = rsa.decrypt(msg)
print "Decrypted message:"
print_hex(decrypted)

对于密钥传输,我使用的ToXmlString()RSACryptoServiceProvider. 生成的 XML 在 python 中解析,pycrypto -RSA 对象初始化为

r = Crypto.PublicKey.RSA.construct((modulus, exponent, d, p, q))

其中modulusexponentd和是 .NET结构p的各个字段。(正如我所提到的,我可以在 python 中使用这个密钥加密/解密消息,也可以产生,所以我认为密钥导入工作正常......)qRSAParametersp*qmodulus

4

1 回答 1

2

好的,这是我的错,我只是没有查看结果:前导零(来自 PKCS#1 填充)不是 python 结果字符串的一部分,看起来(以十六进制表示)如下:

02 a2 16 4e 51 45 aa 8d 
94 b0 de 64 4d 4c 4c bd 
0b 01 b8 d2 de dc ed 23 
0b 25 c2 11 6c 0a 0b 1f 
4f 19 d0 33 18 db e0 81 
25 33 f6 e3 70 8d 97 d2 
c7 ef 32 ef 27 3c c0 ac 
47 68 c0 5b 7b 6d 0d ba 
44 da cb bf e8 71 75 d3 
2f 9a b1 97 6b 70 4f ff 
98 6f 5a 9a 74 3c 65 94 
eb 57 52 8a 2f 73 1f 14 
7d 76 08 d3 e5 8b 82 b8 
5d ed 2b 75 52 29 b5 22 
af 76 55 bc 5d e9 41 99 
00 4d 61 72 74 69 6e 

所以,02一开始就指向随机填充(不知何故,我期待 0xff 填充......)。最后 6 个字节(在零之后)正是我所期待的“消息”,但print由于零字节,正常并没有显示它们......

于 2011-02-25T12:24:57.817 回答