2011-02-25 56 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