Python 理解加密示例中的模块化算法

Python 理解加密示例中的模块化算法,python,encryption,modular-arithmetic,Python,Encryption,Modular Arithmetic,我理解模运算的基本数学形式,例如: 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)

我理解模运算的基本数学形式,例如:

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)
有人能给我解释一下吗?

部分

密钥c=ord(密钥[i%len(密钥)])

%
用于避免出现
索引器
——当密钥比消息短时,它只是将密钥包裹在消息周围


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

%
用于将生成的
chr
保持在7位
ascii
范围内

像时钟一样思考
%
: 当它比
y
'点钟晚
x
小时时,它是
(x+y)%12
'点钟


另一方面:我认为这是显而易见的,尽管如此,我还是想提一提:这个“密码”当然远不是安全的。

mod操作符可以以多种不同的方式使用。在这种情况下,它用于约束某些值并使其“旋转”。 例如:

如图所示,函数f向每个索引添加4,并计算所有结果值的x mod 6,从而生成一个数组,该数组实际上将相同的值以循环方式向右移动了4个位置。
在许多情况下,如果我们调用x mod n,我们是说我们希望值介于0和n-1之间。这通常用于散列函数和其他函数,在这些函数中,我们需要一些大整数来映射到列表索引,不大于列表的长度。

127 us的模块确保您保持在ASCII边界内(基本上是可读的)。加密模块只是建立了一个可以撤消的设置,并且看起来是随机的。然而,考虑到密钥的简单性,加密可以很容易地以相同的方式撤消


我建议将密钥改为“key”,并写下加密和解密的步骤。在那之后,这种模式将是显而易见的。如果您有任何问题,请随时提问。

欢迎来到Stack!给出反馈、接受和回答是礼貌的。你不必在stackoverflow的标题中使用这种语言,只要它作为标签出现。请把标题尽量简短。当然,我也表示欢迎:)谢谢你的欢迎,谢谢你的建议,我以后会记住的。很抱歉,我没有给出反馈或接受回答,我的电脑一直有问题。对不起,我没有立即回复你。我的电脑一直有问题。有没有办法让它更安全?没有。这是安全的,当且仅当您使用的是一个完全随机的密钥,该密钥至少与消息一样长,并且不再使用。
>>> a = [0,1,2,3,4,5]
>>> f = lambda x : (x + 4) % 6
>>> print map(f,a)
[5, 0, 1, 2, 3, 4]