2011-02-07 11 views
2

私はアクティブ状態のpythonレシピの1つを調べていて、次のコードを見つけました。私は次の4つの質問を思いついた。どんな指導や説明にも非常に感謝しています。ファイルの暗号化と復号化のためのPythonスクリプト

Q :: Imは、「k = long(sys.argv [2])」の最初の場所にあるユーザーから「キーランダムシード」​​が取り出された理由を正確に理解できませんか?特に、この値 'k'はコードの後半部分で使用されていないようですか?

第2に、暗号化と復号化のコードの部分では、 "bytearray [i] -random.randint(0,255)%256"というステートメントの正確な意味は何ですか?これは、各文字のユニコード値が暗号化中にシフトまたは置換され、復号化されたときに元の値に戻されることを意味しますか?

第3に、「bytearray = map(ord、f1.read())」は、ファイル内のすべての文字のユニコードポイント値を計算しますか?

最後に、暗号化と復号化に乱数が使用されるため、暗号化されたファイルの復号化が正確であることを保証する要因は何ですか?種の値 "k"はこれと何か関係がありますか?

以下は私が勉強しているコードです。

が大幅ご指導に感謝します、事前に感謝

# encdec.py 

import sys 
import random 

if len(sys.argv) != 5: 
    print "Usage: encdec.py e/d longintkey [path]filename1 [path]filename2" 
    sys.exit() 

k = long(sys.argv[2]) # key 
random.seed(k) 

f1 = open(sys.argv[3], "rb") 
bytearr = map (ord, f1.read()) 
f2 = open(sys.argv[4], "wb") 

if sys.argv[1] == "e": # encryption 

    for i in range(len(bytearr)): 
     byt = (bytearr[i] + random.randint(0, 255)) % 256 
     f2.write(chr(byt)) 


if sys.argv[1] == "d": # decryption 

    for i in range(len(bytearr)): 
     byt = ((bytearr[i] - random.randint(0, 255)) + 256) % 256 
     f2.write(chr(byt)) 

f1.close() 
f2.close() 

答えて

6

random.seed(k)は、同じkのための乱数の同じリストを提供することを、いくつかの状態に乱数ジェネレータを設定します。

import random 
print [random.randint(0,255) for i in xrange(5)] 

は、スクリプトを実行するたびに異なる数値を返します。

import random 
random.seed(2) 
print [random.randint(0,255) for i in xrange(5)] 

は、スクリプトを実行するたびに[244, 242, 14, 21, 213]を返します。

具体的な値がkseedの乱数ジェネレータを使用すると、指定されたファイルをエンコードしてデコードするための非常に特殊な乱数のリストを得ることができます。

2番目の質問 - はい。一度に1バイトで動作するので、256の異なる値があります。

3番目の質問 - はい、毎回1文字の文字列の整数序数を計算します。 bytearr = [ ord(c) for c in f1.read() ]と同じです - 一度に文字を読み、その値のリスト(0〜255)を作成します。

最後に - 上記を参照してください。

そして、二つのループのためだけのニシキヘビのヒント...あなたは、配列を反復すれば、あなたは

for c in bytearr: 

を使用して、代わりに

for i in range(len(bytearr)): 

bytearr[i]を使用してのcを使用することができます。

したがって、たとえば:

for c in bytearr: 
    byt = (c + random.randint(0, 255)) % 256 
    f2.write(chr(byt)) 

あなたの質問:私はピコを使用して復号化されたファイルを開くと、その理由イムは奇妙な文字を見ていますか?彼らはちょうどいくつかのランダムなアルファベットと数字であってはなりませんか?

No.ルックhere。 2 * 26 = 52文字、10桁、印刷可能な文字と印字可能な文字(改行、タブなど)があります。あなたは 'decimal'の値(0-255)をエンコード/デコードし、あなたのピコは 'char'カラムの文字を表示します。

+1

+1の速度!私が加えたいのは、ユニコードはそれと関係がないということです。ファイルはバイナリモードで開き、そのように処理されます。 – DSM

+0

ありがとう!それは私の疑問のほとんどを解決する。私はまだ、「bytearr = map(ord、f1.read())」が実際に何をしているのかはっきりしていませんか? – Nura

+0

ありがとう@DSM!ピコを使って暗号化されたファイルを開くと、ちょっと変わったことがあります。彼らはちょうどいくつかのランダムなアルファベットと数字であってはなりませんか? – Nura