我的问题如下:
我有很多这样的字符串,它们是用Java Inflater工具压缩的,用base64编码的,为此,我编写了下面的python代码来反向求解明文。
当我尝试短密文时,压缩和解压缩前后的值是相同的,但当我尝试长密文时,压缩和解压缩前后的值会发生变化。
我的密码如下。
import base64
import zlib
cobj = zlib.compressobj(wbits=-zlib.MAX_WBITS)
dobj = zlib.decompressobj(wbits=-zlib.MAX_WBITS)
# read ciphertext
with open("base64str", "r") as f:
b = f.read()
lenth = len(b)
# decode base64
d = base64.b64decode(b)
# decompress
data_string = dobj.decompress(d)
data_string += dobj.flush()
# wirte into file
with open('data_string', 'wb') as f:
f.write(data_string)
# read plaintext
with open('data_string', 'rb') as f:
data_string = f.read()
# compress
data1 = cobj.compress(data_string)
data1 += cobj.flush()
# encode base64
data2 = base64.b64encode(data1)
# write into file
with open('data2', 'wb') as f:
f.write(data2)
示例密文如下所示:
***短***的是
第一个月c9d18bZw13UJdDbW9QoMcYsMBwA=
长的那个是
VdC7asNAEAXQH7Jg3g91chDGYBQh4iKEFCncB6ImBP97xohVSLFb7FzOzM7bz/r9eetPyzhOh6/1Y70NvSFwgiImGQqjuG+lY995OKEDAmiGV4zxftiM4+U6NqJLRHdiRGRTqItkN9SolHpVc3nEUpoxX5f58qeEVxMxdc2sGHtCU4xqFMFQVjcVJI6GPC/DdNoRCXDEqHowu0q1bUYXUfMHK7gBCZGkNuTpddgX0lEQMlfUIgwN6jQDy4+I6g/oAZb/FzIv5+llyw59x6hcHTOVuYKShs1Rqn9CqIoxqxbo9/df
您可以将其复制到文件中:base64str
和try,这在我的代码第7行中看到。
最后,您可以比较两个文件base64str
和data2
之间的差异,
顺便说一句,文件data_string
是明文。
我尝试了许多密文这样的,但得到不同的结果
我想知道是什么原因导致这种情况发生,以及如何确保一致的结果,无论密文有多长?
1条答案
按热度按时间wwtsj6pe1#
你的代码和你的问题相反。你的问题在标题中写着“压缩和解压缩”,在正文中写着“压缩和解压缩之后”。但是你的代码先解压缩,然后再压缩。*x -〉compress -〉decompress -〉y a和x -〉decompress -〉compress -〉y是完全不同的。
一个无损压缩器保证压缩后再解压缩会给予你完全一样的东西回来。然而,有 * 没有 * 保证,无论是解压缩后再压缩会给你相同的压缩数据,你开始。如果压缩器不同的压缩设置,它是如何提供给它,或压缩器本身不同,无论是在版本或只是不同的代码,那么压缩后的数据很可能是不同的。2只有对于非常短的文本,大多数压缩器才会给予相同的结果,因为几乎没有什么选择可以使输出的大小最小化。