RSA-шифрование в .NET, дешифрование в python - PullRequest
3 голосов
/ 25 февраля 2011

Я пытаюсь зашифровать короткое сообщение с использованием алгоритма RSA в C # и расшифровать сообщение с помощью скрипта Python.

Я бы хотел использовать классы .NET на стороне C # и pycrypto на стороне Python. Мне удалось обеим сторонам использовать один и тот же ключ (который даже не был тривиальным, поскольку .NET напрямую не поддерживает стандартный формат PEM / DER). Шифрование / дешифрование работает с обеих сторон независимо друг от друга.

Я использую дополнение PKCS # 1 на стороне C # (для параметра fOAEP для RSACryptoServiceProvider.Encrypt установлено значение false), поэтому я ожидаю, что после расшифровки блока в 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)

Для передачи ключей я использую ToXmlString() метод RSACryptoServiceProvider. Результирующий XML анализируется в python, и объект pycrypto -RSA инициализируется с помощью

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

, где modulus, exponent, d, p и q - соответствующие поля структуры .NET- RSAParameters. (как я уже говорил, я могу зашифровать / расшифровать сообщение, используя этот ключ в python, также p*q дает modulus, поэтому я думаю, что импорт ключа работает правильно ...)

1 Ответ

2 голосов
/ 25 февраля 2011

Хорошо, это была моя ошибка, я просто не смотрел на результаты: ведущий ноль (из отступа 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 не показывал их только из-за нулевого байта ...

...