我理解基本数学形式的模运算,例如:
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)
有人可以向我解释一下吗?
答案 0 :(得分:1)
key_c = ord(key[i % len(key)])
%
用于避免IndexError
- 它只是在密钥短于消息时将消息包裹在消息周围。
在
encryped.append(chr((msg_c + key_c) % 127))
%
用于将结果chr
保留在7位ascii
范围内。
在这里考虑%
就像时钟一样:
如果它比x
时钟晚y
小时,那就是(x+y) % 12
'时钟。
旁注:我认为这一点显而易见,我想提及它:这个" cipher"当然远离安全。
答案 1 :(得分: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之间。这通常用于散列函数和其他函数,其中我们需要一些大整数映射到列表索引,不大于列表的长度。
答案 2 :(得分:0)
127 us的模块化以确保您保持ASCII边界(基本上它是可读的)。加密模块只是一个可以撤消的设置,并且是随机的。但是,鉴于密钥简单,加密可以很容易地以与完成相同的方式撤消。
我建议将密钥更改为'key',然后记下加密步骤,然后解密。之后,模式将是显而易见的。如果您有任何疑问,请随时提出。