Помогите проверить подписанный RSA текст с помощью Python

Используя Java, я создал пары ключей RSA. Используя Java, я могу использовать эти ключи для подписи и проверки текста. Я также могу «экспортировать» эти ключи в формат PEM и загрузить их в тестовый скрипт Python. Попав в скрипт Python, я могу использовать эти ключи для подписи и проверки текста с помощью M2Crypto.

Я еще не смог проверить в Python подпись, которую я создал на Java.

Прямо сейчас я просто пытаюсь заставить работать кроссплатформенную подписку и проверку.

Вот фрагмент Java:

Signature sig = Signature.getInstance("MD5WithRSA");
sig.initSign(key.getPrivate());
sig.update("This is a message.".getBytes("UTF8"));
byte[] signatureBytes = sig.sign();     
return Base64.encodeBytes(signatureBytes, Base64.DO_BREAK_LINES);

Что генерирует:

PIp4eLhA941xmpdqu7j60731R9oWSNWcHvwoVADKxABGoUE02eDS0qZ4yQD2vYBdRDXXxHV4UjtW
YQwv9nsOzCBWeDQ0vv6W0dLVfTBuk79On7AALuwnTFr8s0y5ZN5RINvPPR60mwONav26ZbPj4ub3
NZqUS/zkqyO8Z8D2zUjk0pqAhWDGbFBaWPQJBPOY9iRt8GlsAUkGfYGeIx9DNU8aiJmQ3NnUHbs4
5NEr3xydbNJjwK96kkNJ9vyKZRfnNd4eW2UllPiwJSRQgefCQfh79ZuiYeQEuk3HMh7Si4iYl7uU
rWCgYFl4fGV1X/k+BSHR4ZZFWGQ3IPfafYHyNw==

А вот и открытый ключ:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg+N7xQHVHU3VHMZ9VGFdUf6ud3rAL8YS
sfWv2zFMnKAjh6XacwDGX6jJR/0/pyDriRGw/uodBDSFvgn9XEM/srMYtbJ1KQ9R9ChDifixF3Hx
yzbzPRvFoEfZnS/63+d1r0wnafz7xx0eDEYE3TgRKTMikwOsuIOFWa7GhA4BvP7ad79bI5ORJdLu
9Je+k+4dbt0xk2t7YopxYmyU+4zhZMxuthJTr69rXgqhgsCRdK6kFIGm3YuJ1WQcci8OVwH+3o7F
XzJHpSTxH57m6PX5lXaywIDCbUauTpBV3w+0vTeGI/2o+U40qhLBkpZT9GSVKxgXl5a0XxrkwTGn
61XZqQIDAQAB
-----END PUBLIC KEY-----

Затем в Python загружается ключ и предпринимается попытка проверки подписи:

from M2Crypto import RSA, EVP
pub_key = RSA.load_pub_key('public_key.pem')
verify_evp = EVP.PKey()
verify_evp.assign_rsa(pub_key)
verify_evp.verify_init()
verify_evp.verify_update("This is a message.")
if verify_evp.verify_final(sig_string.decode('base64')) == 1:
    print "Good"
else:
    print "Bad"

И это не подтверждает. Я подозреваю, что это какие-то начальные или конечные символы или странности кодировки, которых я не понимаю.

У меня нет особой привязанности к M2Crypto, и я тоже немного поигрался с модулями gdata.tlslite.

Обратите внимание, что ключи работают, и что текст и подпись выше проверяются на Java, а ключи (открытые и частные) могут использоваться в Python для подписи и проверки текста. Проблема где-то в том, как сгенерированная Java подпись и / или текст сообщения попадают в код Python.

Что я делаю неправильно?


person Joseph Santaniello    schedule 16.06.2011    source источник
comment
Это работает. Это сообщение. был unicode в моем реальном коде (в отличие от опубликованного упрощенного кода), поэтому добавление .encode('ascii') заставило его работать. Мне нужен кофе.   -  person Joseph Santaniello    schedule 16.06.2011
comment
возможно, используйте .encode('utf_8'), чтобы точно соответствовать Java. Я сейчас пью кофе.   -  person President James K. Polk    schedule 18.06.2011
comment
Это была моя первая линия атаки, и по какой-то причине она не сработала. Полагаю, недостаточно кофе.   -  person Joseph Santaniello    schedule 20.06.2011


Ответы (1)


M2Crypto.EVP по умолчанию - sha1 (SHA1), а вы используете MD5WithRSA. Я думаю, вам следует переключить SHA1WithRSA (MD5 - очень слабый алгоритм).

person Mathias Brossard    schedule 20.06.2011
comment
Я переключился на SHA1withRSA где-то по ходу дела, чисто случайно пробуя разные вещи, покопавшись в источнике M2Crypto и других местах. Я не знал, что это лучший выбор. Спасибо за совет. - person Joseph Santaniello; 21.06.2011
comment
А теперь работает? Если да, закройте вопрос. Если нет, у вас есть дополнительная информация? - person Mathias Brossard; 21.06.2011