【问题标题】:Perl DES CBC encryption results in more bytesPerl DES CBC 加密导致更多字节
【发布时间】:2014-03-21 00:36:00
【问题描述】:

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

的密文位串

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

谢谢。

【问题讨论】:

    标签: perl encryption des cbc-mode


    【解决方案1】:

    从第二个块 (a7691f3f7fb52416) 向后工作得到 8a285d3601f9bb13,与第一个块 (8220553e09f1b31b) 进行异或得到 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->问题
    十六进制->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保存在本地,用浏览器打开。

    【讨论】:

    • 谢谢大卫,这真的很有帮助,我从没想过向后工作。我现在看到,如果有一个空闲字节,“标准”填充选项将填充 01,如果有两个空闲字节,则填充 0202,如果有三个空闲字节,则填充 030303 等等。为什么它们填充一个完全空的块超出了我的范围,但是你的答案解决了我的问题。
    • 感谢您告诉我有关填充字节的信息。看着 CBC.pm,我的眼睛呆滞了。
    【解决方案2】:

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

    【讨论】:

    • 呃,不。请参阅填充的答案,注意显示初始向量如何与明文组合的框图。问题似乎是意外的填充,一个退格字符块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多