2

我无法对通过消息包从套接字连接获得的一些数据进行解码,并因此对其进行解密。我从 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)。我可以在每个脚本中很好地解密和加密(而不是通过消息包通过套接字发送)

有什么想法吗?

编辑:
经过一些实验和思考后,我意识到密码出来就好了这一事实很有趣。问题是字符串开头的多余垃圾。我只是不知道它来自哪里......或者截断它是否安全。

4

2 回答 2

0

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

采用:

require 'base64'

cipher = Base64.encode64(cipher)

-通过网络发送密码-

cipher = Base64.decode64(cipher)
于 2012-08-21T01:30:13.797 回答
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

希望这对其他人有帮助

于 2012-08-21T19:44:47.630 回答