Mic*_*ith 5 python encryption chat stream-cipher
我一直在玩cryptocat,这是一个有趣的在线聊天服务,允许你用密钥加密你的消息,这样只有拥有相同密钥的人才能阅读你的消息.该服务的一个有趣方面(在我看来)是这样一个事实,即使用您正在使用的密钥以外的密钥加密的文本仅显示为"[encrypted]",而不是一堆垃圾密文.我的问题是,在Python中,是否有一种很好的方法来确定给定的文本是否是密文?我在这个例子中使用RC4,因为它是我能实现的最快的东西(基于维基百科上的伪代码.谢谢.
and*_*oke 14
没有保证的方法可以告诉你,但在实践中你可以做两件事:
检查许多非ascii字符(如果您希望人们发送英文文本).
检查值的分布.在普通文本中,有些字母比其他字母更常见.但在加密文本中,所有角色的可能性大致相同.
执行后者的一种简单方法是查看是否有任何字符超过(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()",其中小数字的逻辑是错误的方式).
| 归档时间: |
|
| 查看次数: |
3005 次 |
| 最近记录: |