1
auser 2014-05-05 12:15:17 +08:00
实现过DES和AES.
DES真实密钥真有56位,不说了。 AES密钥长度128、192、256位,换算成字节分别是16、24、32个,如果一个字符算一个字节,分别是16、24、32个字符。通常你的密码连16都达不到。这时,要么把你的密码直接当成密钥用来加密,不够补零,要么就使用key stretching(自行查阅维基百科)。 我理解的正常情况下,密文不可能全部是可打印的ASCII字符。所以这里的密文很可能是转换过的(很可能有多次)。 通常对称加密的输出是“纯密文”,不包括加密参数(比如算法、密钥长度)的任何信息。如果你要做一个加密软件,那么就需要设计一个协议,并把它作为加密后文件的头(或其它)部分。协议里可能记录采用的加密算法、密钥长度、块加密模式、初始化向量(IV)等解密时必须的信息。 综上,无解。 |
2
duzhe0 2014-05-05 13:06:14 +08:00
1.你给的密钥应该是256位的2进制数据的hex值, 不是64个字符
2.密文应该是base64的 |
3
dong3580 2014-05-05 13:13:36 +08:00
你这个有点像是RSA加密的嘛,不过位数怎怎么长,结尾一个==,无解。
eOUP+q78QFyELsBHs6jpvr9EtDO+Dzdev2qBiElSzmAPImqSpSs5PQfqUpYMFMbNXiGH09ppJM/1+qNH0AXd6RCE5FWr/dBXyoDhAbkQyFXn3kLPGkFbfr5yM+XgryrAmS0b7aGmCJwxUNBhmIzFEZNDyaVwb0KTaiMBQNFcLk4= |
4
standin000 OP @duzhe0 那密钥是32个字节,但base64加密是不需要密钥的,这个怎么解释?
|
5
standin000 OP |
6
duzhe0 2014-05-05 13:45:01 +08:00
@standin000 多次加密,最后一次是base64
|
7
oott123 2014-05-05 14:19:43 +08:00 via Android 1
base64 是编码,不是加密。
由于你通过各种算法加密出来的可能是一堆二进制数据,不便于传输或者怎样,所以加密完之后做个 base64 。 回到算法问题,我认为没有可以判断的方法。 |
8
xierch 2014-05-05 17:02:23 +08:00
考虑到原文应当是有意义的数据而非随机数据
应该还是有可能推测出加密算法的(?) |
9
auser 2014-05-05 20:00:55 +08:00
@standin000 这个密钥长度256位,属于正常长度,不是“太长”,但对AES来说已经是(我理解中能接触到的)最强的加密强度了。
AES算法的原型是Rijndael算法(相当于我要制定一个加密标准A,然后有a、b、c等各路算法投稿,最后算法a成为了加密标准A),它支持的相关参数选项要比AES多。 再多说一点吧:例如AES加密,每次加密的输入必须是128位,如果不足128位(通常是最后一组数据),需要用到填充算法,这个可以搜索维基百科中密码学下的Padding词条。你能保证原文(明文)长度一定是16字节的整数倍吗? 因此,你这个问题真的是无解的,不用想了。当然,假设问题成立,各个组合试一试总会有正确答案。即便如此,你知道了加密算法,比如是AES,你照样需要花费非常多的时间去暴力破解(前提是它加密用到了CBC、IV Padding之类的东东,是真正的加密)。 (其它对称加密算法不清楚,不知道哪些支持密钥长度是256位的) |
10
raptium 2014-05-05 20:18:34 +08:00 via Android
密文看起来是 base64 编码的
解码后看到开头 4 个 byte 像是“信息长度” 其他就不知道了 |
11
standin000 OP |
12
raptium 2014-05-05 21:04:40 +08:00 via Android
@standin000 挺像长度的啊 才差了十几个 byte
|
13
auser 2014-05-05 22:40:37 +08:00 via iPad
@standin000 AES是块加密,自行搜索块加密。每次加密输入是128位,对应128位输出。假如你要加密00001111(二进制串),你不填充到128位怎么加密?我之前实现用的是pkcs7. 其它还有很多填充标准。题外话,MD5算法也要用填充,用的是位填充,貌似必须补齐512位,记不清了。
为了防止相同块加密后的相同输出,通常会用到初始化向量和块加密工作模式。你潜意识里根本没有这些概念,以为加密只有这些就行了是不对的。 里边细节问题很多。想知道的话自己搜吧。 EOF |
14
lsylsy2 2014-05-05 22:47:26 +08:00
其实我倒觉得这个问题是可解的,如果这是完整的密文(没有CBC之类)……
加密算法构建的目的基本都是“知道算法,知道密文,不知道密钥的情况下无法获取明文”,而不是知道密文密钥不知道算法。 考虑写个程序,试验下各种算法吧,费点事而且不一定有结果就是了 |
15
ccidcce32167 2014-05-06 11:46:12 +08:00
说下我的进展:我刚才查了一下base64的信息 base64编码表里有 [/] 但是是没有 [\] 的。所以密文里有 [\] 应该是没道理的,于是我把密文用 [\] 拆成三段分别用base64去解码,不幸的是第一段解出来依然是乱码,第二段解出来是
I: c? ^45PxNQ2 ] 5U! #q<4@% }aoZJ N O=| J9|& F L 第三段解出来是 ^0$.iKw f kf +~@ to1,<l: ",nj4I|+]aR 33 C rikG HZ5Wn /C #i0 c'C4w cCZ ^[O rVL@ 6L K bz%Ptqi]@ 就到这了。。。 |
16
zoho 2014-05-06 16:25:06 +08:00 via iPad
@ccidcce32167 不是有三个 \ 么?应该拆成四段啊。
|
17
xurubin 2014-05-06 19:50:23 +08:00
看密文的熵还是很高的,所以应该不是自己发明的某种煞笔加密方法。不过32字节的key,我总以为AES256没什么人用呢。
base64解码以后是376 = 23 * 16 + 8个字节。即使考虑到密文前四个字节更像是某种header或者length,如果是AES的ECB CBC之类的分块模式的话长度也不对,所以要么就是密文里还包含了MAC,或者就是CTR/GCM/EAX模式。如果能肯定是AES的话,就暴力穷举把密文分成几段尝试解密,用熵来判断是否是有意义的明文就行。 楼主说说这密文哪里扒来的,说不定有帮助。 |
18
standin000 OP |
19
xurubin 2014-05-06 21:23:44 +08:00
@standin000 统计每个byte出现的次数,然后用熵的定义来算。不过这里才300多个byte,可能不是很准确。可以改成统计4-bit nibble。
如果是抓取的,你怎么知道密钥是你给的那个?有可能他内部计算用的不是这个呢。 |
20
standin000 OP @xurubin 密文和密钥都是发给服务器的,所以应该是配对的。
|
21
xurubin 2014-05-06 23:44:56 +08:00
@standin000 把密文和密匙一起发给服务器那加密还有什么意义。普通的协议都是服务器和客户端先协商一个密匙,然后通讯的时候用这个加密。
这么猜加密算法的成功率太低了,你有客户端的话直接逆向工程要爽快多了。 |
22
standin000 OP |
23
standin000 OP @xurubin 是我理解有误,现在明白了,见附言!
|
24
liuxurong 2014-05-10 22:46:07 +08:00
好像是Discuz的cookie密文?
|
25
standin000 OP @liuxurong 怎么看出来的?
|
26
liuxurong 2014-05-15 02:43:06 +08:00
@standin000 是么?貌似看过类似的
|
27
standin000 OP @liuxurong 不是cookie密文。
|