App EngineでPyCryptoを使用したPython UnicodeEncodeError

暗号化されたクエリ文字列を別のURLに渡そうとしています。

次のコードは私にこのエラーを与えます:

UnicodeEncodeError: 'ascii'コーデックで文字u '\ u04b7'をエンコードできません   ポジション7:序数が範囲外(128)

The encryption module is PyCrypto

App EngineでのPython 2.5.2の実行

ページA

    import Crypto
    from Crypto.Cipher import ARC4

    obj=ARC4.new('stackoverflow')
    msg = 'This is my secret msg'
    encrypted = obj.encrypt(msg);

    self.redirect('/pageb?' + urllib.urlencode({'q': encrypted}))

ページB

    import Crypto
    from Crypto.Cipher import ARC4

    encrypted = self.request.get('q')
    obj=ARC4.new('stackoverflow')
    decrypted = obj.decrypt(encrypted)

    get_data = cgi.parse_qs(decrypted)

    self.response.out.write(decrypted)
    self.response.out.write(pprint.pprint(get_data))

トレースバック

トレースバック (most recent call last):
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\_webapp25.py", line 701, in __call__
    handler.get(*groups)
  File "C:\Program Files\Google\google_appengine\demos\guestbook\guestbook.py", line 47, in get
    decrypted = obj.decrypt(encrypted)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u04b7' in position 7: ordinal not in range(128)
2
情報は今そこにありますが、問題は依然として最高に暗示されています。
追加された 著者 Karl Knechtel,
リクエストで必要な内部APIビットを呼び出したり、機密情報をサーバー側でセッション制御で保存するのではなく、リクエスト間で暗号化しようとすると、アプリケーション内の別のURLにリダイレクトされるのはなぜですか?これは不必要に複雑なようです。
追加された 著者 geoffspear,
これは、最小限の担保で、事実であると思われる。有用な情報に裏付けられた、トレースバックのような質問をしてみてください。
追加された 著者 John Machin,
@ JohnMachinありがとう、私はポストを更新しました。
追加された 著者 Chad,

2 答え

一般的なガイドライン:暗号化されたものにbase64エンコード/デコードのステップを追加します。

import base64

base64_encrypted_message = base64.b64encode(encrypted_message)
// send your message via POST as GET can be seen on system logs

encrypted_message = base64.b64decode(base64_encrypted_message)
// decrypt your message

For the other error, try reading up on unicode & utf-8 encoding of non-ascii characters. You need this step before passing it to your de/encrypt function.

6
追加された
John Machinはbase64について言及しましたが、答えはより直接的でした。
追加された 著者 Chad,

使用できる情報から推測できることは、何かがバイトテストを期待しているが、Unicode文字U + 04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDERを含む unicode オブジェクトを供給しているということです。コースはASCII(デフォルトのエンコーディング)でエンコードできないため、エラーメッセージが表示されます。

これまで最善の答え:それをしないでください。

Update 1: You still haven't asked a question. Nonetheless:

だから、「何か」とは、暗号化ガジェットの decrypt メソッドです。確かに str オブジェクトが必要です。 print repr(encrypted)はあなたに何を伝えますか?ランダムなごみ(暗号化されたものでなければならない)のように見える場合、何とか str オブジェクトから unicode オブジェクトに変換されています。これがどのように起こっているかを見るには、バックトラックする必要があります。 encrypted が意味のあるテキストのように見える場合、暗号化プロセスは壊れています。

ステップ1:既知の平文で始まり、それを暗号化し、GAE装置の外の簡単なスクリプトで再度解読する。各段階でprint repr()を使用して、次のステップへの合理的な期待を持ってください。

ステップ2:GAEを使用してステップ1を繰り返し、各データのタイプと内容を調べます。

Update 2 It appears that you have a urlencode in page A, but no corresponding urldecode in page B; is this (part of) the problem?

1
追加された
あなたは2つのURLの間で暗号化されたメッセージを送信します。これは、任意のバイトテストを送信するのと同じ方法です:base64のようなarmourplateによって適切に保護され、到着時にarmourplateを削除します。どの言語でも、単純な文字列をエンコード/デコードするための「研究/頭痛の日」は必要ありません。どの言語でも問題解決の方法論的な方法が必要です。
追加された 著者 John Machin,
あなたの "repr(暗号化)の出力"はページAまたはページBからですか?プレーンテキスト入力どこにでも \ x04 \ xb7 が入っているようには見えません。
追加された 著者 John Machin,
私はmsgを "hello"に変更してエラーを解消しましたが、まだ解読されています。それは空です。 URL間で暗号化メッセージをどのように送信しますか?私は非常にpython(前日に始まった)私は通常、私は非常に限られているので、PHPを使用して新しいです。 PHPが単純な文字列をエンコード/デコードするための研究や頭痛の日を要さないため、PHPがウェブを支配しているのはこのためだと思います。
追加された 著者 Chad,
さて、それを試してみましょう。ありがとう。 PS:私はすでに暗号化されたファイルを直接出力しようとしていましたが、疑問符を付けてたくさんの黒い菱形文字を含むギベッシュ文字を取得しました。
追加された 著者 Chad,
'\ xf0 "\ xfe \ xe8I)\ x0bxCq \ xd1 \ x1e \ xa1v \ xc38 \ xb1 \ xd2 \ xb7 ^ \ x85'
追加された 著者 Chad,
私は同じ時間にそのページを暗号化/復号化しました。入力テキストは 'This is my secret msg'
追加された 著者 Chad,
ところで、私が使用しているコードは、この回答から得ました: stackoverflow.com/questions/2794942/…
追加された 著者 Chad,
基本的に私はそれを複製しようとしていますが、それは私の目的のためには機能していませんが、それはその質問に対して最良の答えが選ばれたので機能するはずです。
追加された 著者 Chad,
また、urllibにはurlencodeがありますが、明らかにurldecodeはありません:AttributeError: 'module'オブジェクトには属性 'urldecode'
追加された 著者 Chad,