什么加密算法会得到这样的密文?
我们的看法是密文数据段的开头一个空字节有可能是PHP的serialize函数在处理类成员的保护或私有属性时加上的,但依照文档和网上的例子,应该还有一个空字节与之配对,但是在密文sample中没有找到,所以这个猜测还有待考证。如果数据整体就是一个密文的话,有可能是经过类似RC4或类似的Stream Cipher与一个密钥进行某种异或xor计算后得到的。如果真是这样的话,就可以解释开头空字节的问题了。只要明文与密钥的开头字节相等就会得到空字节的输出,这种情况还是有几率发生的。还有一点能支持Stream Cipher一说的,就是观察这些密文的二进制编码,大部分字节的MSB都是0。而UTF-8编码中只有U+0000到U+007F范围的MSB为0,其余都为1。所以,如果明文与密钥都是UTF-8编码,且含有大量中文的话其xor后的结果就会出现大量MSB为0的密文字节。当然这只是个推测,而且不仅限于UTF-8,别的编码也有大量MSB为1的情况,由于不熟悉就不做分析了。
既然s:28:"";是serialize()函数的输出格式,那么unserialize之后也不过是得到里面那串乱码字符串而已。不懂serialize后再base64encode的意义何在。。就这样看这些数据的话起码可以确定绝对不是明文结果,因为据我所知还没有哪种文字编码开头有00字节的。这么说来,我高亮部分的数据才是密文咯。那就要考虑什么样的加密算法会产生如此近似的密文。可以肯定的是这些数据的明文也应该是相近的内容。仅靠这些条件那么猜测会有很多啊,一些不带PRNG的Stream Cipher和Block Cipher的简单实现都有可能对相似输入产出相似输出。但是具体是什么样的算法,是不是标准的算法仅靠这点sample凭我的经验是看不出来的。