Python加密(不对称)

2024-04-16 17:45:12 发布

您现在位置:Python中文网/ 问答频道 /正文

不久前我对加密产生了兴趣,我决定用Python编写自己的加密脚本。我遇到了一些问题。我相信解决办法很简单,但就我的一生而言,我想不出来。你知道吗

所以:这里是我的加密/解密脚本放在一个脚本中:

def encrypt(key1, msg):
    encrypted =[]
    for i, c in enumerate(msg):
            msg_c = ord(c)
            encrypted.append(unichr((msg_c + key1) % (key1+key2)))
    return ''.join(encrypted)

def decrypt(key2, encryped):
    decrypted = []
    for i, c in enumerate(encryped):
        enc_c = ord(c)
        decrypted.append(unichr((enc_c + key2) % (key1+key2)))
    return ''.join(decrypted)

if __name__ == '__main__':
    key1 = int(raw_input("Key 1: "))
    key2 = int(raw_input("Key 2: "))
    msg = raw_input("Message to Encrypt: ")
    encrypted = encrypt(key1, msg)
    decrypted = decrypt(key2, encrypted)

print 'Encrypted: ', repr(encrypted)
print 'Decrypted: ', repr(decrypted)

因此,如果我将密钥1设置为5521,将密钥2设置为223,并将消息设置为Encrypt Test,则会收到以下输出:

Encrypted:  u'\u15e5\u15f6\u1604\u1605'
Decrypted:  u'Test'

所以,这是可行的。这很好也很神奇。它显示将使用密钥1和密钥2加密的测试。不过,我想把它分成两个独立的脚本。一个加密另一个解密。你知道吗

所以我的加密脚本是这样的:

def encrypt(key1, msg):
    encrypted =[]
    for i, c in enumerate(msg):
            msg_c = ord(c)
            encrypted.append(unichr((msg_c + key1) % (key1+key2)))
    return ''.join(encrypted)
if __name__ == '__main__':
    key1 = int(raw_input("Key 1: "))
    key2 = int(raw_input("Key 2: "))
    msg = raw_input("Message to Encrypt: ")
    encrypted = encrypt(key1, msg)

print 'Encrypted: ', repr(encrypted)

使用与第一个脚本相同的输入,我得到以下输出:

Encrypted:  u'\u15e5\u15f6\u1604\u1605'

所以,这也行。它给了我和以前一样的加密字符串。不过,这是我的解密脚本:

def decrypt(key2, encryped):
    decrypted = []
    for i, c in enumerate(encryped):
        enc_c = ord(c)
        decrypted.append(unichr((enc_c + key2) % (key1+key2)))
    return ''.join(decrypted)

if __name__ == '__main__':
    key1 = int(raw_input("Key 1: "))
    key2 = int(raw_input("Key 2: "))
    encrypted = raw_input("Message to Decrypt: ")
    decrypted = decrypt(key2, encrypted)

print 'Decrypted: ', repr(decrypted)

现在,如果我输入相同的两个密钥,然后输入要解密的消息:u'\u15e5\u15f6\u1604\u1605',我得到以下输出:

Decrypted:  u'\u0154\u0106\u013b\u0154\u0110\u0114\u0144\u0114\u013b\u0154\u0110\u0114\u0145\u0115\u013b\u0154\u0110\u0115\u010f\u0113\u013b\u0154\u0110\u0115\u010f\u0114\u0106'

如果我修改输入以排除u'',并只放入\u15e5\u15f6\u1604\u1605部分,则得到以下结果:

Decrypted: u'\u013b\u0154\u0110\u0114\u0144\u0114\u013b\u0154\u0110\u0114\u0145\u0115\u013b\u0154\u0110\u0115\u010f\u0113\u013b\u0154\u0110\u0115\u010f\u0114'

你知道我做错了什么吗?似乎我应该得到与“u'Test”相同的输出,但由于某些原因我没有。你知道吗


Tags: key脚本inputrawmsgencryptedintkey2