2

メッセージパックを介してソケット接続から取得した一部のデータのエンコードを解除し、結果として暗号化を解除するのに問題があります。UTF-8 で Ruby on Rails Web アプリケーションから文字列を取得し、メッセージパックを使用してすべてをバンドルし、ソケットを使用して Python サービスに送信します。文字列、数値、配列など、他のデータは正常に表示されます。しかし、暗号化されたパスワードは壊れています。

https://github.com/msgpack/msgpack/issues/15このディスカッションでは、Rails コードと Python で行った ascii の強制が提案されました。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

解決策は、出力に綿毛のある正しい暗号化されていないデータが含まれているという事実にありました。いくつかの簡単なGoogleの結果、RSA公開鍵のrubyのopenssl実装では、デフォルトでPKCS#1パディングがオンになっていることがわかりました...適切なPythonモジュールをすばやく見つけるのは困難だったため、ここで迅速で汚い解決策を見つけました

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

チャームのように機能しました!

代替の(そしておそらくよりクリーンな)ソリューションとして、http://stuvel.eu/files/python-rsa-doc/usage.htmlは良さそうに見えました。

パディングを使用しない方法についてRubyapidockを調べることは、直感的ではありませんでした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 に答える