2011-02-25 50 views
3

我想在C#中使用RSA算法加密短消息,并使用python skript解密消息。.NET中的RSA加密,python中的解密

我想在C#端使用.NET类,在Python端使用pycrypto。我管理双方都使用相同的密钥(由于.NET不直接支持标准的PEM/DER格式,所以它不是微不足道的)。加密/解密独立工作在双方。

我使用PKCS#1填充在C#侧(设置的RSACryptoServiceProvider.EncryptfalsefOAEP参数),所以我期望在Python解密块后,我应该看到某种明文(即我“消息”与填充字节一起)

但我看到的是垃圾:(。

是否有什么注意事项/陷阱,我不知道的任何一方?我有点出出主意。 ..

Thx Martin

示例代码

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) 

对于重点转移我使用的RSACryptoServiceProviderToXmlString()方法。将得到的XML被解析蟒和pycrypto -RSA对象与

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

modulus其中,exponentdpq是.NET- RSAParameters结构的相应字段进行初始化。 (正如我所说,我可以加密/解密使用蟒蛇此密钥的消息,也p*q产生modulus,所以我认为主要进口工作正常...)

+0

我在Java和C#之间有同样的问题。主要问题是两种语言的编码不同,所以string.getbytes必须使用相同的编码处理! – Victor 2011-02-25 11:40:02

+0

目前,我只使用ASCII字符。在C#中,我已经验证输入'byte []'参数为'encrypt()',这没问题。 Python使用8位字符串(至少在2.7版本中),我在字节级查看结果,所以我不认为这是一个编码问题。不管怎么说,还是要谢谢你! – MartinStettner 2011-02-25 11:44:45

+1

你能发表一些你的加密/解密代码片段吗? – Jcs 2011-02-25 11:48:42

回答

2

好吧,这是我的错,我只是不看结果:前导零(从PKCS#1填充)是不是蟒蛇结果字符串,它看起来(十六进制)的一部分,如:

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没有显示它们,只是因为零字节......

+0

Python可能会删除任何前导“00”,因为最重要的位“ 02“为0,因此不需要用”00“来表示号码的符号。 假设PKCS#1(PKCS#1 v1.5的第8.1节),您的填充似乎正确: 02 - >公钥操作 a2--99 - >非零随机数据 4d 61 72 74 69 6e - > “Martin”的ASCII编码:) – Jcs 2011-02-25 12:40:09