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

使用Perl Crypt::CBC进行加密/解密会导致末尾缺少字节

陶鸿畴
2023-03-14

我试图加密,然后解密文件使用Crypt::CBC 在perl。当加密后解密我的密文时,我在恢复的明文末尾丢失了一些字节。

加密方法:

#!/usr/bin/perl

use 5.24.0;
use warnings;
use Crypt::CBC;

my $cipher;
my $buffer;

   $cipher = Crypt::CBC->new( {'key'             => 'abcdefgh',
                               'literal_key'     => 1, 
                     # 'cipher'          => 'Blowfish',
                              'iv'              => '01234567',
                           #   'regenerate_key'  => 0,   # default true
                              'padding'         => 'standard',
                              'prepend_iv'      => 0,
                              'blocksize'       => 8
                           });

$cipher->start('encrypting');
open(F,"./plaintext.txt");
open(STDOUT,">ciphertext.txt");
  while (sysread(F,$buffer,1024)) {
      print $cipher->crypt($buffer);
  }
close STDOUT;

我的纯文本如下所示:

然后我用以下方法解密我的密文:

#!/usr/bin/perl
# # entschlüsselt eine datei, http://www.perlmonks.org/?node_id=252460

use 5.24.0;
use warnings;
use Crypt::CBC;

my $cipher;
my $buffer;

   $cipher = Crypt::CBC->new( {'key'             => 'abcdefgh',
                              'literal_key'     => 1, 
                              #'cipher'          => 'Blowfish',
                              'iv'              => '01234567',
                            #  'regenerate_key'  => 0,   # default true
                              'padding'         => 'standard',
                              'prepend_iv'      => 0,
                              'blocksize'       => 8
                           });

$cipher->start('decrypting');
open(F,"./ciphertext.txt")
  while (sysread(F,$buffer,1024)) {
      print $cipher->crypt($buffer);

  }
close STDOUT;

以及随后的明文:

共有1个答案

颜文昌
2023-03-14

你错过了一个调用$cipher-

CBC算法必须在内部缓冲数据块,直到它们是加密算法块大小的偶数倍(通常为8个字节)。在最后一次调用Crypt()之后,您应该调用完()。这将刷新内部缓冲区并返回任何剩余的密文。

你需要这样的东西:

while (sysread(F,$buffer,1024)) {
    print $cipher->crypt($buffer);
}
print $cipher->finish;

(解密代码中的open行末尾也缺少分号。)

 类似资料:
  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 我使用在线AES加密网站加密上述数据,即:https://www.devglan.com/online-tools/aes-encryption-decryption 使用CBC模式、256密钥大小和Base64输出文本格式。我在此链接上通过@/backslash-f复制了playground:swift中的AES加密 下面是我如何对加密数据进行解密的: 数据已成功解密,但缺少字符。下面是解密的数

  • 我在使用java AES/CBC/PKCS7Padding加密时遇到了问题。我已经在使用提供程序之前进行搜索和跟踪。但我还是无法得到正确的加密 假设要求是: 加密类型:对称 算法:AES 块大小=128Bit(16字节) 密码模式:CBC 填充模式:PKCS7 加密密钥长度:256 Bit(32字节) 向量初始化长度(IV):128 Bit(16字节) 示例: 普通数据=ABC123 加密数据(b

  • 我正在尝试在Go中加密数据,并使用带有PKCS7填充的AES CBC模式在Angular中解密。但是当我尝试在Angular中解密数据时,它没有返回任何内容 Go代码: Angular/CryptoJs代码: 我从加密JS解密方法中得到一个空响应。 cryptoJS的iv值应该是多少?

  • 问题内容: 我之所以写这个问题+答案,是因为我挣扎了很多(也许是因为缺乏经验),并迷失了使用node或python进行加密/解密的许多不同方式。 我以为我的案子将来可以帮助人们。 我需要做的是: 从表单获取数据,使用Crypto(node-js)对其进行加密 在Python中传递加密的数据,然后使用PyCrypto将其解密。 我选择使用AES加密。 这是我的开始方式(我不会尝试的所有事情): 我遵

  • 问题内容: 有没有一个很好的示例,说明如何在Android上使用AES 加密和解密图像及其他文件? 问题答案: 并像这样调用它们: 这应该可行,我现在在项目中使用类似的代码。