1

我正在使用 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 是原型块密码——一种算法,它采用固定长度的明文位串,并通过一系列复杂的操作将其转换为另一个相同长度的密文位串

为什么编码输出的字节长度比原始输入长?

谢谢。

4

2 回答 2

3

从第二个块 (a7691f3f7fb52416) 向后工作得到 8a285d3601f9bb13,与第一个块 (8220553e09f1b31b) 进行异或得到 0808080808080808 (HEX)。某些东西正在生成块值 0808080808080808 作为第二个输入块值。

CBC 价值观

因此,您所要做的就是找出退格字符作为第二个块输入的来源。

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
HEX->5155455354494f4e
ENC->8220553e09f1b31b
david_koontz@Macbook:

我犯了一个错误,因为我对 DES 了解很多,而不是 perl。

在我学会了如何将 Crypt::CBC 和 Crypt::DES 添加到 perl 库之后,添加填充 null 似乎可以解决问题。

我使用http://code.google.com/p/dpades/source/browse/trunk/simu_js/JS-DES.html来进行必要的加密和解密以弄清楚发生了什么。使用查看原始文件按钮并在本地保存 JS-DES.html,用浏览器打开它。

于 2014-02-20T09:29:39.510 回答
0

加密的消息更长,因为它包含 IV。顺便说一句,固定的 IV 没有意义,它应该是随机的并且是为每条消息新生成的。

于 2014-02-20T08:53:39.777 回答