无法从messagepack解码python中的加密字符串(Ruby openssl)

时间:2012-08-20 15:46:59

标签: python ruby msgpack messagepack

我无法解码通过messagepack从套接字连接获得的一些数据,并因此无法解密。我从UTF-8的Ruby on Rails Web应用程序中获取字符串,并使用messagepack将其全部捆绑并使用套接字将其发送到python服务。其他数据很好:字符串,数字,数组等。但我的加密密码已被破坏。

https://github.com/msgpack/msgpack/issues/15这个讨论建议强制ascii,我在rails代码中以及在python中执行此操作。 如果我在ruby中强制执行ascii并且在python中不执行任何操作我会在字符串中收到垃圾邮件但最后我有正确的未加密密码。 如果我尝试在我的python中强制执行ascii脚本我得到解码错误

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'))

加密是使用公钥/私钥完成的(Python中的Crypto.PublicKey RSA,ruby中的openssl)。我可以在每个脚本中解密和加密(不通过messagepack通过套接字发送)

任何想法都可以?

修改
经过一些实验和一点思考,我意识到密码出来的事实很有意思。问题是字符串开头的额外垃圾。我只是不知道它来自哪里......或者是否可以截断它。

2 个答案:

答案 0 :(得分:0)

我最近遇到的问题显然是网络弄乱了我的密码字符。我尝试在通过网络发送密码之前在base64中对密码进行编码,并且像魔术一样完美地工作。

使用:

require 'base64'

cipher = Base64.encode64(cipher)

- 通过网络发送密码 -

cipher = Base64.decode64(cipher)

答案 1 :(得分:0)

解决方案的最终结果是输出具有正确的未加密数据和绒毛。几个快速的谷歌导致我了解到ruby的RSA公钥的openssl实现默认情况下已启用PKCS#1填充...很难快速找到一个好的python模块,因此这里找到了快速而肮脏的解决方案

http://kfalck.net/2011/03/07/decoding-pkcs1-padding-in-python

这就像一个魅力!

作为替代(可能更清洁)的解决方案http://stuvel.eu/files/python-rsa-doc/usage.html看起来不错。

查看ruby apidock以获取不使用填充的方法并不直观http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/PKey/RSA.html#method-i-public_encrypt

希望这有助于其他人