当前位置: 首页 > 知识库问答 >
问题:

Perl DES CBC加密会产生更多字节

贝钧
2023-03-14

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

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

谢谢

共有2个答案

卢光远
2023-03-14

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

呼延晋
2023-03-14

从第二个块(a7691f3f7fb52416)向后工作得到8a285d3601f9bb13,与第一个块(8220553e09f1b31b)异或得到08080808(十六进制)。有东西正在生成块值08080808作为第二个输入块值。

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

看见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-

我犯了一个错误,因为我对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,用浏览器打开它。

 类似资料:
  • 在Java代码中,我应该解密一个加密的单词,如下所示: 我是加密新手,但是我发现了一些如何用Java加密/解密一些AES/CBC的示例。但是它需要盐、密钥和Iv。我发现OpenSsl正在从“密码”中导出这些值,但我没有发现如何Java解密加密值。 有人知道它是怎么工作的吗?盐、钥匙和/或Iv是否存储在加密值中?谢谢你的回答。

  • 我使用DexGuard,用这个在发布模式下构建项目: 一切都很好,但现在我需要阻止另一个类进行加密,我添加了行以不加密ExampleBuilder: 现在,当我尝试使用库时,我得到一个错误: 生成的清单(来自dexguard影响的AAR),其中是此错误,片段中是错误:

  • 问题内容: 我正在写一种加密会话密钥的方法。它需要这样做,以便可以通过已成功测试的其他程序解密密钥。解密程序无法更改。我受困的是使我的加密工作与解密例程保持一致。 首先让我给出解密例程。请记住,这不能改变: 这是我正在编写的加密例程。我生成base64编码的文本,但最终无法解密。值得注意的是,我已验证解密例程正确获取了加密例程的结果(两者之间没有握手问题)。 我真的被卡住了。任何帮助表示赞赏。谢谢

  • 本文向大家介绍利用Python产生加密表和解密表的实现方法,包括了利用Python产生加密表和解密表的实现方法的使用技巧和注意事项,需要的朋友参考一下 序言: 这是我第一次写博客,有不足之处,希望大家指出,谢谢! 这次的题目一共有三个难度,分别是简单,中等偏下,中等。对于一些刚刚入门的小伙伴来说,比较友好。废话不多说,直接进入正题。 正文: 简单难度: 【题目要求】: 实现以《三国演义》为密码本,

  • 在测试CRC实现时,我注意到0x01的CRC通常(?)似乎是多项式本身。然而,当试图手动进行二进制长除法时,我总是以丢失多项式的前导“1”告终,例如,当消息为“0x01”和多项式“0x1021”时,我将得到 通过查看https://en.wikipedia.org/wiki/computation_of_cyclic_redundancy_checks,我可以看到使用生成多项式离开移位寄存器的高位

  • 问题内容: 我有这个代码: 我的问题是我不明白为什么 Test 3 可以正常工作(它打印并且不产生),而 Test 4却 抛出了。正如你可以看到测试 1 和 2 ,和是平等的和。 Java 7和8中的行为相同。 问题答案: 您必须仔细查看正在调用的重载: 正在调用。即使提供了null参数,也不会抛出“ even”。 正在调用,因为的值类型为,需要进行拆箱转换。既然是,那就是该值的拆箱-而不是-引发