Не может декодировать зашифрованную строку в python из пакета сообщений (Ruby openssl)
У меня проблемы с декодированием некоторых данных, которые я получаю из сокетного соединения через пакет сообщений, и, следовательно, дешифрования их. Я получаю строку из веб-приложения Ruby on Rails в UTF-8 и использую пакет сообщений, чтобы связать все это и отправить его в службу python с помощью сокетов. Другие данные встречаются хорошо: строки, числа, массивы и т. Д. Но мой зашифрованный пароль взломан.
https://github.com/msgpack/msgpack/issues/15 этом обсуждении предлагалось заставить ascii, что я и сделал в коде rails, а также здесь, в python. Если я форсирую ascii в ruby и ничего не делаю inpython, я получаю ненужную строку, но в конце у меня есть правильный незашифрованный пароль. Если я пытаюсь заставить ASCII в моем скрипте Python, я получаю ошибку декодирования
while 1:
buf = clientsocket.recv(1024)
unpacker.feed(buf)
for obj in unpacker:
print obj #works great! => ['3', [['really long url', [87987234, 'gobbledyguck of password']]]]
#key.decrypt(obj[1][0][1][1]) roughly gives "YD3zt�(-�½ï¿½ï¿½=you suck"
print key.decrypt(obj[1][0][1][1].decode('ascii'))
шифрование выполняется с использованием открытых / закрытых ключей (Crypto.PublicKey RSA в Python, openssl в ruby). я могу расшифровать и зашифровать хорошо в каждом скрипте (не отправляя его через сокет через пакет сообщений)
какие-нибудь мысли вообще?
РЕДАКТИРОВАТЬ:
После некоторых экспериментов и размышлений я понял, что тот факт, что пароль выходит очень хорошо, интересен. проблема заключается в лишнем мусоре в начале строки. Я просто не знаю, откуда это... или безопасно ли его урезать.
2 ответа
Решение закончилось тем, что на выходе были правильные незашифрованные данные с пухом. Несколько быстрых Google привели к тому, что я узнал, что в реализации ruby openssl открытых ключей RSA по умолчанию включена поддержка PKCS#1... было трудно быстро найти хороший модуль python, поэтому быстрое и грязное решение было найдено здесь.
http://kfalck.net/2011/03/07/decoding-pkcs1-padding-in-python
который работал как шарм!
в качестве альтернативного (и, возможно, более чистого) решения http://stuvel.eu/files/python-rsa-doc/usage.html выглядел хорошо.
Глядя на рубиновый апидок, чтобы найти способ не использовать отступы, не было интуитивно понятно http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/PKey/RSA.html
надеюсь, это поможет кому-то еще
Недавно у меня были проблемы с тем, что, очевидно, сеть испортила мои символы шифрования. Я попытался зашифровать шифр в base64 до отправки его по сети, и, как по волшебству, он работал отлично.
использовать:
require 'base64'
cipher = Base64.encode64(cipher)
отправить по сети
cipher = Base64.decode64(cipher)