0

たとえば、モジュラー算術の基本的な数学的形式を理解しています。

38 = 2 mod 12

ただし、次の暗号化と復号化のコード例では、他の数学と一緒に使用されており、何に使用されているのかわかりません。

def encrypt(key, msg):
    encryped = []
    for i, c in enumerate(msg):
        key_c = ord(key[i % len(key)])
        msg_c = ord(c)
        encryped.append(chr((msg_c + key_c) % 127))
    return ''.join(encryped)

def decrypt(key, encryped):
    msg = []
    for i, c in enumerate(encryped):
        key_c = ord(key[i % len(key)])
        enc_c = ord(c)
        msg.append(chr((enc_c - key_c) % 127))
    return ''.join(msg)

if __name__ == '__main__':
    key = 'This_is_my_awsome_secret_key'
    msg = 'Hello world'
    encrypted = encrypt(key, msg)
    decrypted = decrypt(key, encrypted)

    print 'Message:', repr(msg)
    print 'Key:', repr(key)
    print 'Encrypted:', repr(encrypted)
    print 'Decrypted:', repr(decrypted)

誰か説明してくれませんか?

4

3 に答える 3

1

部品で key_c = ord(key[i % len(key)])

%を回避するために使用されます。IndexErrorキーがメッセージよりも短い場合に、キーをメッセージにラップするだけです。

encryped.append(chr((msg_c + key_c) % 127))

は、結果を 7 ビット範囲%に保つために使用されます。chrascii

%ここを時計のように考えてください。「時」xより数時間遅れたら、「時」です。y(x+y) % 12

余談ですが、それは明らかだと思いますが、それでも言及したいのですが、この「暗号」はもちろん安全とはほど遠いものです。

于 2014-10-21T21:38:32.953 に答える
0

mod 演算子はさまざまな方法で使用できます。この場合、特定の値を制約し、それらを「回転」させるために使用されます。例:

>>> a = [0,1,2,3,4,5]
>>> f = lambda x : (x + 4) % 6
>>> print map(f,a)
[5, 0, 1, 2, 3, 4]

ここに示すように、関数 f は各インデックスに 4 を加算し、結果のすべての値に対して x mod 6 を計算します。これにより、同じ値が循環的に右に 4 桁移動した配列が得られます。多くの場合、x mod n を呼び出すと、値が 0 から n-1 の間にあることを意味します。これは、ハッシュ関数や、リストの長さを超えない大きな整数をリスト インデックスにマップする必要があるその他の関数でよく使用されます。

于 2014-10-21T21:42:53.717 に答える