2012-02-19 17 views
1

私は2つのボタンとテキストフィールドでGUIを表示する小さなスクリプトをPythonで書いています。テキスト領域に入力して暗号化をクリックすると、突然テキストが狂ったように見えます。 coooooool。私のpython暗号化ソフトウェアが動作していません

ですが、復号化すると元に戻りません。コードはここにあります

from Tkinter import * 
import ttk 

root = Tk() 
textArea = Text(root, state = "normal") 

def encrypt(): 
    message = textArea.get('1.0', 'end') 
    newMessage = '' 
    lastChar = '' 

    for c in message: 
     if lastChar != '': 
      newMessage += chr((ord(c) + ord(lastChar)) % 256) 
      lastChar = chr((ord(c) + ord(lastChar)) % 256) 
     else: 
      newMessage += chr((ord(c) + 5) % 256) 
      lastChar = chr((ord(c) + 5) % 256) 

    textArea.delete('1.0', 'end') 
    textArea.insert('end', newMessage) 

def decrypt(): 
    message = textArea.get('1.0', 'end') 
    newMessage = '' 
    lastChar = '' 

    for c in message: 
     if lastChar != '': 
      newMessage += chr((ord(c) - ord(lastChar)) % 256) 
      lastChar = chr((ord(c) - ord(lastChar)) % 256) 
     else: 
      newMessage += chr((ord(c) - 5) % 256) 
      lastChar = chr((ord(c) - 5) % 256) 

    textArea.delete('1.0', 'end') 
    textArea.insert('end', newMessage) 

encrypt = ttk.Button(root, text = "Encrypt", command = encrypt) 

encrypt.pack({"side": "top"}) 

decrypt = ttk.Button(root, text = "Decrypt", command = decrypt) 

decrypt.pack({"side": "top"}) 

textArea.pack({"side": "bottom"}); 

mainloop() 

問題はそれが元のテキストを表示しないことです。それはちょうどそれをより秘密にするようです。何がここに間違っていますか?助けてください。

更新: は5を追加するだけで変更されています。つまり、最後の文字にコード値を追加する部分です。それでも問題は1つあります。新しい行とこの奇妙な行の文字(パイプではなく---> |)を追加します。

コードは修正されました。ありがとう。ここでの結果は次のとおりです。 WW1ueCVueCV1d2p5eX4laHR0cTMlWW1mc3AlfnR6JXh5ZmhwJXR7andrcXR8JWt0dyV5bWolZnN4fGp3Mw8 =

それは5を奪うしないように、私は復号化を行った後、それが働きました。再度、感謝します。

答えて

5

テキスト領域に任意のバイトを配置することはできません。

あなたの暗号化アルゴリズムは純粋にバイトで行われ、文字の数値に作用します。バイト0はASCII NUL(特別扱い)であり、バイト127(「Z」、文字122は5だけシフトしたときになる)がDEL文字であるため、これはASCIIの場合でも機能しません。欲しいです!現実世界のUTF-8には、ASCIIを超えて数千もの無効なバイトシーケンスがあります。

このようなバイト暗号化を使用する場合は、結果をテキストフィールドに入れることはできません。バイナリデータです。テキストフィールドに入ることができるようにするには、制御文字なしの有効テキスト、NULバイト、または無効なバイトシーケンスであることを確認する必要があります。

バイナリサニタリーを作成する簡単な方法の1つは、暗号化時にBase64エンコードし、復号の最初のステップをBase64デコードにすることです。

最後の注意:テキストエリアの最後にも改行を暗号化しています。おそらくあなたがしたいことではないでしょう。

+0

だけでなく、長い新しいラインが復号化されますよう、それは何を問題ではありませんか?私はちょうどあなたがメッセージを書いてそれを暗号化し、おそらく友人にそれを送り、彼にそれを解読させる小さなことであることを望んでいました。助けてくれてありがとう –

+0

@AidanMuellerそれは問題ありません。データをBase64でエンコーディングし、文字列型として格納しないでください。大丈夫です。 – Borealid

+0

私はこれがばかな質問ではないことを願っています。どうすればいいのですか? –

2

これは、ほんの些細な "暗号化"が破られているようです。ソースを持っている人は誰でもあなたのメッセージを読むことができます。安全な暗号システムは、安全であるアルゴリズムに依存すべきではない。

Python暗号化ツールキット(www.dlitz.net/software/pycrypto/)を使用できます。これにはさまざまな暗号化アルゴリズムが用意されています。 あなたはそれをどのように使用するかの例を見つけることができます:http://www.laurentluce.com/posts/python-and-cryptography-with-pycrypto/

標準エンコーディングの1つ(標準ライブラリ参照の7.8 'コーデック'を参照)。

シーザー暗号:

>>> res = 'this is a test'.encode('rot_13') 
>>> print res 
guvf vf n grfg 
>>> print res.decode('rot_13') 
this is a test 

Base64エンコーディングは:

>>> res = 'this is a test'.encode('base64') 
>>> print res 
dGhpcyBpcyBhIHRlc3Q= 

>>> print res.decode('base64') 
this is a test 
+0

努力をいただきありがとうございます。私はちょうどそれの楽しさのためにこれを作った。私はYouTubeからアイデアを得ました。 gigafideには暗号化に関するビデオがあります。彼はVBで簡単な暗号化を行います。だから、私はPythonで作った。私は既存の方法があることを知っています。しかし、それは何が楽しいですか?私はあなたの答えを投票しました。なぜなら、あなたは31の回答ポイントしか持っておらず、あなたの答えは役に立ちましたからです。 –

関連する問題