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))

%用于将结果保持在chr7 位ascii范围内。

像时钟一样思考%这里:当它xy'o clock'晚几个小时时,它是(x+y) % 12'o clock。

附带说明:我认为这一定很明显,但我还是想提一下:这个“密码”当然远非安全。

于 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 回答
0

127 us 的模块化确保您保持在 ASCII 范围内(基本上是可读的)。用于加密的模块只是做了一个可以撤消的设置,并且看起来是随机的。然而,鉴于密钥的简单性,加密可以很容易地以相同的方式撤消。

我建议将密钥更改为“密钥”,并写下加密步骤,然后解密。之后的模式会很明显。如果您有任何问题随时问。

于 2014-10-21T21:45:29.230 回答