gpt4 book ai didi

PHP:PEAR:使用 Crypt_CBC 加密,使用 Perl 的 CBC 解密

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:00:17 24 4
gpt4 key购买 nike

我必须完成的任务之一需要我从 PHP 端加密某些内容,然后使用 Perl 对其进行解密。

PEAR我发现似乎适合我需要的模块是 Crypt_CBC。但是,一定有我做错了或不明白的地方,因为到目前为止我一直无法获得正确的结果。

下面的代码摘录专门用于测试目的,因为我想在将其应用到我的实际项目代码之前全部尝试一下。

首先,这是我的 PHP 代码,我用它加密传递给 $text 参数的任何内容(即 cryptTest.php?text=hello)

require_once('Crypt/CBC.php');  

$key = "8326554161EB30EFBC6BF34CC3C832E7CF8135C1999603D4022C031FAEE";
$cipher = new Crypt_CBC($key, 'BLOWFISH');

$encrypted = $cipher->encrypt($text);

if (PEAR::isError($encrypted)) {
echo $encrypted->getMessage();
} else {
echo "ENCRYPTED STRING: " . $encrypted;
}

从那时起,我复制了从该脚本(在我的浏览器的输出中)回显的任何内容,并将其粘贴到下面我的 PERL 脚本的 $encrypted 变量中:

use Crypt::CBC; 
$encrypted = "RandomIVá´bp3Ó¯làK”Á(Û";
my $key = "8326554161EB30EFBC6BF34CC3C832E7CF8135C1999603D4022C031FAEE";
my $vector = "\0\0\0\0\0\0\0\0";

my $cipher = Crypt::CBC->new(
{'key' =>$key,
'cipher' => 'Blowfish',
'iv' => $vector,
'prepend_iv' => 0
});

my $plaintext = $cipher->decrypt($encrypted);

print $plaintext;

我一直在尝试很多事情,比如在 Perl 端不指定 IV 等,但它一直给我错误。这种形式是唯一一种我可以得到任何输出的形式。

上面的执行结果,原始 $text = "hello"是:Pñšîî7àÐŽZÊ&Rhello

我发现我的原始内容已正确解密,但并非没有在我想要的部分之前添加一堆垃圾字符。

任何人都可以指出我做错了什么以及我该如何解决吗?

非常感谢。

最佳答案

我终于找到了解决问题的方法。

感谢你们两位,你们的回答确实帮了大忙。我确实按照您的建议在 base64 中编码/解码,因此避免了任何纯文本编码问题。

为了使解密工作,我必须做的是将 'header' => 'randomiv' 添加到我的 Perl 脚本的密码创建中,因为 PEAR 的 Crypt_CBC 类在加密时使用随机 IV。

我在 Crypt::CBC's documentation 中找到了那个特定参数.

此外,直接查看 CBC.php 的 decrypt 函数,我发现它做了什么来确定 IV:获取 header 的('RandomIV')长度,并将其用作偏移量以将加密的字符串替换为blocksize 的值(默认为 8)。我还指定了 keysize(默认情况下为 56)以进行良好测量。

为了完整性和引用,这里是我更新的两个测试脚本:

PHP (cryptTest.php):

require_once('Crypt/CBC.php');

$key = "8326554161EB30EFBC6BF34CC3C832E7CF8135C1999603D4022C031FAEE";
$cipher = new Crypt_CBC($key, 'BLOWFISH');

$encrypted = $cipher->encrypt($text);

if (PEAR::isError($encrypted)) {
echo $encrypted->getMessage();
} else {
echo "ENCRYPTED STRING: " . base64_encode($encrypted);
}

PERL (解密测试.pl)

use Crypt::CBC;  
use MIME::Base64;

my $encrypted = decode_base64("UmFuZG9tSVbrNE3ony00FlUbiprLn0fu");
my $key = "8326554161EB30EFBC6BF34CC3C832E7CF8135C1999603D4022C031FAEE";
my $header_spec = "randomiv";
my $blocksize = 8;
my $keysize = 56;

my $iv_offset = length $header_spec;
my $iv = substr $encrypted, $iv_offset, $blocksize;

my $cipher = Crypt::CBC->new(
{'key' =>$key,
'cipher' => 'Blowfish',
'iv' => $iv,
'header' => $header_spec,
'prepend_iv' => $iv_offset,
'blocksize' => $blocksize,
'keysize' => $keysize
})

my $plaintext = $cipher->decrypt($encrypted);

print $plaintext;

给你。再次,非常感谢!

马修

关于PHP:PEAR:使用 Crypt_CBC 加密,使用 Perl 的 CBC 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com