2011-02-25 7 views
3

C#에서 RSA 알고리즘을 사용하여 짧은 메시지를 암호화하고 python 스크립트를 사용하여 메시지의 암호를 해독하려고합니다..NET에서의 RSA 암호화, 파이썬에서의 암호 해독

저는 C# 측에 .NET 클래스를 사용하고 파이썬 측에 pycrypto을 사용하고 싶습니다. 나는 .NET이 표준 PEM/DER 형식을 직접 지원하지 않기 때문에 사소한 것이 아니었던 동일한 키를 사용하기 위해 양측을 관리했습니다. 암호화/복호화는 양측에서 독립적으로 작동합니다.

(I는 C# 측 (RSACryptoServiceProvider.Encryptfalse에의 fOAEP 매개 변수를 설정)에 PKCS에게 # 1 패딩을 사용하고, 그래서 파이썬에서 블록 암호를 해독 한 후 나는 일반 텍스트의 어떤 종류를 볼 것으로 기대 즉 내를 함께 패딩 바이트 "메시지")

그러나 내가 보는 모든 쓰레기 :(이다.

내가 양쪽에 잘 모르는 것 같아요 어떤주의/함정이 있습니까? 나는 아이디어에서 가지입니다. ..

thx 마틴

키 전송을 위해

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

샘플 코드

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

파이썬/암호 해독 나는 RSACryptoServiceProviderToXmlString() 방법을 사용하고 있습니다. 생성 된 XML 파이썬을 파싱하고 pycrypto -RSA 객체 modulus, exponent, d, pq가 특정 .NET RSAParameters 구조의 각각의 필드이다

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

으로 초기화된다. (내가 언급했듯이, 파이썬에서이 키를 사용하여 메시지를 암호화/암호 해독 할 수 있습니다. p*q 수확량이 modulus이므로 키 가져 오기가 올바르게 작동하는 것 같습니다 ...)

+0

Java와 C# 사이에 동일한 문제가 있습니다. 가장 큰 문제는 두 언어간에 인코딩이 다르기 때문에 string.getbytes가 동일한 인코딩으로 처리해야한다는 것입니다. – Victor

+0

현재 ASCII 문자 만 사용하고 있습니다. C#에서는 입력'byte []'매개 변수를'encrypt()'로 확인했습니다. 이것은 괜찮습니다. 파이썬은 8 비트 문자열 (최소한 버전 2.7)을 사용하며 바이트 수준에서 결과를보고 있으므로 인코딩 문제라고 생각하지 않습니다. 어쨌든 고마워! – MartinStettner

+1

암호화/해독 코드의 일부 발췌 물을 게시 할 수 있습니까? – Jcs

답변

2

그래, 내 잘못 이었어. 단지 결과를 보이지 않았다 : 선행 제로 (PKCS # 1 패딩에서) (16 진수에) 보이는 파이썬 결과 문자열의 일부처럼되지 않습니다 : 시작 지점에서 그래서

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 패딩을 기다리고 있었다 ...). 마지막 0 바이트 이후의 6 바이트는 정확히 "메시지"입니다. 그러나 보통 print은 0 바이트로 표시되지 않았습니다.

+0

Python은 "00"의 최상위 비트 이후 "00" 02 "는 0이므로 숫자의 부호를 나타내는"00 "이 필요하지 않습니다. PKCS # 1 (PKCS # 1 v1.5의 섹션 8.1)을 가정하면 패딩이 정확 해 보입니다. 02 -> 공개 키 작업 a2--99 -> 0이 아닌 임의의 데이터 4d 61 72 74 69 6e -> "Martin"의 ASCII 인코딩 :) – Jcs

관련 문제