Unk*_*ech 3 language-agnostic encryption
我有大量数据在备份之前由第三方工具加密,现在我们无法再访问该工具了,我需要数据,这是尝试确定数据加密方式的最有效方法?
希望不会丢失.有一个很好的变化,你可以弄清楚使用了什么加密,并可能解密它.首先,在Cygwin或unix中,键入文件命令:
$ file mydata
mydata: SQLite 3.x database
Run Code Online (Sandbox Code Playgroud)
文件将查看前几个字节并尝试确定其内容.数据如何加密有几种可能性:
如果幸运的话,file命令将知道文件的文件,并且不会加密数据的结构.这很常见,因为当程序更新数据时,它通常不想重写整个文件.此外,如果数据不是实际数据库,而是导出,则可以对其进行压缩.文件将告诉您它是否使用通用压缩格式.
接下来,使用'strings'命令.
$ strings mydata
Run Code Online (Sandbox Code Playgroud)
这将输出任何明文数据.如果您看到数据的证据,则可能无需解密.有些程序只是执行密码检查而根本不进行任何加密.即使供应商表示他们正在"加密"您的数据,情况也是如此.
如果你仍然处理一堆随机的字节,而字符串和文件只是告诉你它的二进制数据,那么你需要开始探索数据.
接下来的两件重要事情是查看文件的总长度.文件大小的模数可以告诉您有关加密算法的信息.第二件事是查看数据的直方图.
$ ruby -e 'ARGF.each_byte {|b| puts b >> 4; }' < mydata | sort -n | uniq -c
Run Code Online (Sandbox Code Playgroud)
如果字节均匀分布在0-255范围内,那么您处理的是正确的加密算法.如果您的数据不平衡,则可能很容易检测到并破坏加密.例如,看看这个输出:
15 0
54 2
93 3
248 4
165 5
177 6
135 7
Run Code Online (Sandbox Code Playgroud)
频率计数在第一个桶中,数据在第二个桶中.在这里,您可以看到数据中不包含127以上的字符.这意味着数据接近ASCII文本.再次运行直方图,并将数据放在一个字节桶中.只需离开右移操作员即可.
$ ruby -e 'ARGF.each_byte {|b| puts b; }' < mydata | sort -n | uniq -c
Run Code Online (Sandbox Code Playgroud)
现在,您可能会看到ASCII分布,或者数据可能是base64编码或base96编码.您可以通过解码器运行流,并再次尝试上述所有步骤.
如果您发现处理工业强度算法,那么您需要弄清楚哪一个.如果您有任何程序副本,代码本身通常会很容易地放弃使用的算法.如果没有,你必须看看像长度这样的东西.如果数据长度始终是模数8,则可能使用像河豚这样的对称块密码进行加密.
如果您可以确定使用的密码,那么您必须弄清楚密钥.如果程序需要密码,则密钥可能基于密码,或者密码本身.如果幸运的话,程序不会要求输入密钥,只有程序本身才能知道密钥.在这种情况下,如果您可以开始使用该程序,那么您可以从程序中提取密钥,因为它必须包含密钥才能加密和解密.
我的经验是大多数供应商软件都没有使用真正的加密技术,程序员在编写数据之前会尝试对数据进行异或操作.如果它使用真正的加密,软件通常会附带有关出口限制的披露.
你需要两个:
最简单的方法是(如果可能的话)去做那件事的人或公司并问他们.
我并不羡慕你这个任务,因为除非加密像XOR一样无用,否则你的工作就会很严重.
首先,您可能想告诉我们该工具的名称.从问题中扣留信息只会让你更难,而且你不需要:-)
我认为已经涵盖了所有正常的想法,但这里有几个长镜头.
尝试查看原始数据,尤其是前四个字节.运行搜索前四个十六进制字节,看看你是否幸运并得到一个命中(即看看供应商是否在标题中使用了一个魔术字节).
您可以尝试的另一件事是通过像'strings'这样的实用程序运行原始文件(或者只是浏览文件,如果它相对较小).看看该工具是否在生成的文件中嵌入了版权声明等 - 至少值得一试.
当然,您也可以尝试将文件发布到互联网上并查看其他人可以提出的内容,但我猜这会破坏您的目的(即它是机密数据 - 为什么它会在第一名).