Python:有没有一种好方法可以检查文本是否加密?

Mic*_*ith 5 python encryption chat stream-cipher

我一直在玩cryptocat,这是一个有趣的在线聊天服务,允许你用密钥加密你的消息,这样只有拥有相同密钥的人才能阅读你的消息.该服务的一个有趣方面(在我看来)是这样一个事实,即使用您正在使用的密钥以外的密钥加密的文本仅显示为"[encrypted]",而不是一堆垃圾密文.我的问题是,在Python中,是否有一种很好的方法来确定给定的文本是否是密文?我在这个例子中使用RC4,因为它是我能实现的最快的东西(基于维基百科上的伪代码.谢谢.

and*_*oke 14

没有保证的方法可以告诉你,但在实践中你可以做两件事:

  1. 检查许多非ascii字符(如果您希望人们发送英文文本).

  2. 检查值的分布.在普通文本中,有些字母比其他字母更常见.但在加密文本中,所有角色的可能性大致相同.

执行后者的一种简单方法是查看是否有任何字符超过(N/256)+ 5*sqrt(N/256)次(总共有N个字符),在这种情况下,它可能是一种自然语言(未加密).

在python中(颠倒上面的逻辑,加密时给出"true"):

def encrypted(text):
    scores = defaultdict(lambda: 0)
    for letter in text: scores[letter] += 1
    largest = max(scores.values())
    average = len(text) / 256.0
    return largest < average + 5 * sqrt(average)
Run Code Online (Sandbox Code Playgroud)

数学来自平均数,是围绕平均值的高斯分布,方差等于平均值​​ - 它不完美,但它可能足够接近.默认情况下(少量文本,当它不可靠时)这将返回false(抱歉;早些时候我的版本不正确"max()",其中小数字的逻辑是错误的方式).


emb*_*oss 5

每个名副其实的密码都会产生看起来完全随机的输出。您可以利用这一事实进行快速测试,无论您正在处理加密文本还是遵循某些未知协议的数据。如果数据是加密的,那么您可以检查可以窃听的字节流中字节值的分布 - 如果所有值均匀分布,那么您很有可能正在处理加密文本。

为了对决策越来越有信心,您可以将测试范围扩大到更复杂的内容,例如分析字节对或三元组的分布等。

另一方面,您还可以将您感兴趣的特定语言的二元组和三元组的统计数据与您观察到的数据中的出现情况进行比较(另请参阅此处)。如果您的数据表现相似,那么您更有可能观察到纯文本。