知道了明文,如何发现所使用的加密方案?[关闭]
-
04-07-2019 - |
题
我的 DBF 表中有一些 char() 字段,这些字段由项目中过去的开发人员加密。
不过,我知道几条记录解密的明文结果。如何确定解密原始数据的函数/算法/方案?这些是一些示例字段:
对于密文:
b5 01 02 c1 e3 0d 0a
明文应该是:
3543921 or 3.543.921
对于密码文本:
41 c3 c5 07 17 0d 0a
明文应该是
1851154 or 1.851.154
我相信 0d 0a
只是填充。来自以 win-1252 编码收集的数据(不知道是否重要)
编辑: 这是为了好奇心和学习。我希望能够理解所使用的加密(看起来很简单,尽管是二进制数据)来恢复我不知道其明文的元组的字段值。
编辑2: 添加了几个示例。
解决方案
一般情况下没有简单的方法。这个问题太笼统了。尝试发布这些纯文本+加密字符串。
编辑:
- 为了学习,您可以阅读这篇文章: 维基百科上的密码学
如果您真的相信加密很简单 - 检查它是否是字节(或字)级异或 - 请参阅以下伪代码
for (i in originalString) { newString[i] = originalString[i] ^ CRYPT_BYTE; }
其他提示
假设它不像替换密码那样简单(尝试频率分析)或应用不良的XOR(例如,重用密钥;尝试对已知明文的两个密文进行异或,然后看看结果是否是明文的异或;或者尝试对密文进行异或,并将自身移动一些字节数),您应该假设它是一个众所周知的带有未知密钥的流/分组密码(很可能由ASCII字符组成)。如果你有足够大的密文 - 明文对样本,你可以先检查具有相同前几个字符/字节的明文是否具有相同的第一个字符/字节的密文。在那里你可能还会看到它是块还是流密码以及是否涉及任何反馈机制。填充(如果存在)也可能表明它是块密码而不是流密码。
从您提供的信息中我们可以看出一些信息:
- 在每种情况下,密文长度均为 7 个字节,它不太可能是分组密码(因为分组密码一次加密一个块,因此它们的长度将是块大小的倍数,并且 56 位的块大小不太可能*) 。
- 密文的长度和明文中的字符数在每种情况下都是相同的,因此可以将数字直接编码为应用流密码的 ascii。
- 将明文(如 ascii)和密文异或在一起既不会给出单个重复的八位字节,也不会给出相同的加密流,因此它不是一个简单的密码。它也不是使用相同密钥的简单流密码,除非某些密文字节是 IV。
- 最后两个字节在密文中是相同的,但在明文中则不同。这可能是巧合,但也可能表明您所建议的填充。如果它们是填充,则必须使用其他编码机制。
你知道加密的值是否都是整数,或者其他值也是可能的吗?
确定没有相应密钥的算法可能并不完全有用。
如果文字足够小,并且你有明文,你为什么要弄明白呢?当然,除了好奇之外,还有什么呢?
没有确定的方法可以说明,但密文中经常会有提示。它是否真的加密(带某种键)?或者它只是哈希和(可能)腌制。
如果它是哈希,你可以很幸运,只需谷歌一对匹配(假设你有任何词典单词),因为已经有预先散列的词典在线。
如果您有密文的示例,可以发布,有人可能会识别密码格式...
我认为XOR是一种易于解密的方案,这是一种误解。理论上最强的加密形式是一次性填充:只是一串预定位,你用你的明文和... ...
另一方面,有限XOR ...