自定义Python加密算法

2 投票
3 回答
19546 浏览
提问于 2025-04-16 12:36

嘿,我已经在这个问题上琢磨了一段时间了,我记得我哥哥曾经教过我这个算法。

其实,这个算法就是把密钥和短语中每个字符的ASCII值加在一起。

我可以用这个方法来加密:

def encrypt(key, string):
    encoded = ''
    for i in range(len(string)):
        key_c = ord(key[i % len(key)])
        string_c = ord(string[i % len(string)])
        encoded += chr((key_c + string_c) % 127)
    return encoded

但是我好像记不起来我们是怎么解密的。反向操作有点难 :P 你有什么想法吗?

3 个回答

0

但是你不需要对模数进行反操作,只需要处理 + key_c 这一部分,对吧?所以只需要加上 128,然后减去 key_c,最后再对 127 取模,这样就能保持在范围内了。(除了最后一行,其他的行和加密时是一样的。)

2

解密的过程和加密差不多,只不过是用减法代替加法。

15

这很简单,让我们看看它是怎么工作的。首先,加密的信息是通过减去密钥得到的。

enc = msg + key (mod 127)

那么我们怎么能得到原始信息呢?很简单,双方都减去密钥就可以了。

enc - key = msg + key - key (mod 127)

这样我们就得到了:

enc - key = msg (mod 127)

想了解更多细节,可以参考一下 模运算,我觉得它应该属于群/域/环中的一种。我对数学不是很精通,如果想深入了解,可以看看 数论。这里是优化后的代码:

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)

输出

Message: 'Hello world'
Key: 'This_is_my_awsome_secret_key'
Encrypted: '\x1dNV`O\nkO`fD'
Decrypted: 'Hello world'

撰写回答