让我们假设我正在收听网络,并且我获得了一些位,但我想知道是否有办法确定位是否已加密?存在什么方法或算法?我的意思是如果这些位没有意义,它意味着加密,但是有更多的技术方法或算法可以从位确定 让我们说我有0101010100001011001001100001001,你怎么知道这是加密的呢?
答案 0 :(得分:1)
一般来说,你不能。在几乎所有情况下,加密数据都与随机或高度压缩的数据无法区分。
在某些情况下,可能会有间接证据表明您看到的数据已加密。例如,它可以包含TLS或SSH特有的标头,或者它可以在通常用于加密数据的端口上传输(例如,对于HTTPS来说是443)。然而,这完全是猜测的问题 - 如果你不认识数据,它可能是任何东西。
答案 1 :(得分:1)
你不能。
考虑这个简单的例子(python):
def xor(s1, s2): return ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1, s2))
key = '\x07\x07\x04\x16\x00\x1b\x12N\x17\x1a\x0eHO\x14T\x03\x10\x17R\n\x16V\x04\n\x06\x00\r\x1e'
message = 'this is such a secret message'
ciphertext = xor(message, key)
这是一个简单的xor-cipher,可用于例如在一次性垫。显然没有任何问题,但是如果你打印ciphertext
,你会得到:'some random output obviously'
。
秘密消息已正确加密,但输出看起来根本不加密。
我通过xoring消息和示例输出选择了密钥;-)但是像这样的密钥基本上是随机的,可以是任何随机数生成器的结果。
您无法通过查看位来判断数据是否经过加密,编码,压缩,屏蔽等等,因为这些位看起来像未经加密的内容,即使它们是未加密的。这也是OTP无法强制执行的原因,因为您无法判断强制明文是否是正确的明文:http://en.wikipedia.org/wiki/One-time_pad#Attempt_at_cryptanalysis
亲自尝试:
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def xor(s1, s2): return ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1, s2))
...
>>> key = '\x07\x07\x04\x16\x00\x1b\x12N\x17\x1a\x0eHO\x14T\x03\x10\x17R\n\x16V\x04\n\x06\x00\r\x1e'
>>> message = 'this is such a secret message'
>>> ciphertext = xor(message, key)
>>> print ciphertext
some random output obviously
答案 2 :(得分:1)
无法证明数据是否已加密,但您可以分析数据值的频率,以过滤掉可能要加密的数据包。
正确加密的数据几乎与随机噪声无法区分。因此,如果您正在寻找加密数据,您应该看到相当均匀的字符表示。有一个很棒的工具叫pcaphistogram.pl
,用于以这种方式分析数据包。你可以在这里得到它:http://www.willhackforsushi.com/code/pcaphistogram.pl.txt
以下是正确加密数据的示例直方图:
以下是纯文本数据的示例直方图。注意值是如何在可打印区域中聚集的。如果将其与ASCII表进行比较,您将看到许多小写字母(61-7a),一些大写字母(41-5a),空格(20)和回车符(0a):
下面是使用XOR加密的文本数据的示例直方图。 XOR移动了所有字符,但基本形状与未加密的集合相同。
请注意,您需要一个相当大的数据样本才能使用此技术。
图片由http://www.packetstan.com/2010/11/packet-payloads-encryption-and-bacon.html提供