欧拉计划 59

电脑上的每个字符都有一个唯一编码,通用的标准是
ASCII (American Standard Code for Information Interchange 美国信息交换标准编码)。
例如大写A = 65, 星号(*) = 42,小写k = 107。

一种现代加密方法是用一个密钥中的给定值,与一个文本文件中字符的ASCII值进行异或。
使用异或方法的好处是对密文使用同样的加密密钥可以得到加密前的内容。
例如,65 XOR 42 = 107, 然后 107 XOR 42 = 65。

对于不可攻破的加密,密钥的长度与明文信息的长度是一样的,而且密钥是由随机的字节组成的。
用户将加密信息和加密密钥保存在不同地方,只有在两部分都得到的情况下,信息才能被解密。

不幸的是,这种方法对于大部分用户来说是不实用的。
所以一种修改后的方案是使用一个密码作为密钥。
如果密码比信息短,那么就将其不断循环直到明文的长度。
平衡点在于密码要足够长来保证安全性,但是又要足够短使用户能够记得。

你的任务很简单,因为加密密钥是由三个小写字母组成的。
文件 cipher1.txt (右键另存为)包含了加密后的ASCII码,并且已知明文是由常用英语单词组成。
使用该文件来解密信息,然后算出明文中字符的ASCII码之和。

# 空格出现最多,32
all_the_text = open('euler59.txt').read()
encrypted_val = [int(v) for v in all_the_text.split(',')]
ascii_sum = 0
for i in range(3):
    key_list = [encrypted_val[j] ^ 32 for j in range(i, len(encrypted_val), 3)]
    key_ = max(key_list, key=key_list.count)
    print(key_)
    ascii_sum += sum([encrypted_val[j] ^ key_ for j in range(i, len(encrypted_val), 3)])
print(ascii_sum)

你可能感兴趣的:(欧拉计划)