我正在使用Perl使用Crypt :: CBC库执行CBC DES加密:
#!/usr/bin/perl
use Crypt::CBC;
$key = "\x4A\x6F\xC2\x2A\x44\xE2\xA4\x48";
$iv = "\x00\x00\x00\x00\x00\x00\x00\x00";
$data = "\x51\x55\x45\x53\x54\x49\x4F\x4E";
print "TXT->", $data, "\n";
print "HEX->", unpack("H*", $data), "\n";
$cipher = Crypt::CBC->new(-literal_key => 1,
-key => $key,
-iv => $iv,
-header => 'none');
$ciphertext = $cipher->encrypt($data);
print "ENC->", unpack("H*", $ciphertext), "\n";
代码的输出是:
TXT->QUESTION
HEX->5155455354494f4e
ENC->8220553e09f1b31ba7691f3f7fb52416
我的数据方便,大小为64位(16位十六进制数字),符合DES标准。根据维基百科
DES是原型块密码 - 一种算法,它采用固定长度的明文位串,并通过一系列复杂的操作将其转换为相同长度的另一个密文位串
为什么编码输出的字节长度比原始输入长?
感谢。
答案 0 :(得分:3)
从第二个块(a7691f3f7fb52416)向后工作得到8a285d3601f9bb13,与第一个块(8220553e09f1b31b)的XORed给出0808080808080808(HEX)。正在产生块值0808080808080808作为第二个输入块值。
所以你要做的就是找出退格字符作为第二个块输入的来源。
请参阅https://metacpan.org/pod/Crypt::CBC
此:
#!/usr/bin/perl
use Crypt::CBC;
$key = "\x4A\x6F\xC2\x2A\x44\xE2\xA4\x48";
$iv = "\x00\x00\x00\x00\x00\x00\x00\x00";
$data = "\x51\x55\x45\x53\x54\x49\x4F\x4E";
print "TXT->", $data, "\n";
print "HEX->", unpack("H*", $data), "\n";
$cipher = Crypt::CBC->new(-literal_key => 1,
-key => $key,
-iv => $iv,
-header => 'none',
-padding => 'null');
$ciphertext = $cipher->encrypt($data);
print "ENC->", unpack("H*", $ciphertext), "\n";
都给:
david_koontz @ Macbook:cbc_des
TXT-> QUESTION
六角形> 5155455354494f4e
ENC-> 8220553e09f1b31b
david_koontz @ Macbook:
我犯了错误,因为我对DES非常了解,而不是perl。
在我学会了如何将Crypt :: CBC和Crypt :: DES添加到perl库之后,添加padding null似乎可以解决问题。
我使用http://code.google.com/p/dpades/source/browse/trunk/simu_js/JS-DES.html进行必要的加密和解密,以弄清楚发生了什么。使用视图原始文件按钮并在本地保存JS-DES.html,使用浏览器打开它。
答案 1 :(得分:0)
加密消息更长,因为它包含IV。顺便说一句,一个固定的IV没有意义,它应该是随机的,并且每个消息都是新生成的。