Encryption Crypt - 尝试以与 Perl 相同的方式在 PHP 中工作

2024-01-07

我已经用 Perl 编写了加密功能,并且尝试在 PHP 中以同样的方式工作。

In PERL:

#!/usr/bin/perl

use strict;
use warnings;

use Crypt::CBC;
use Crypt::Rijndael;

my $cryptkey = '_PRIVATE_';

my $cipher = Crypt::CBC->new( -key    => $cryptkey,
                              -salt   => 1,
                              -cipher => 'Rijndael',
                             );

my $data = "hello";

my $ciphertext = $cipher->encrypt_hex($data);

print "HEX_KEY: '$ciphertext' \n";

Output:

十六进制键:'53616c7465645f5fc36630f5364619c31ac26e44809c81bf84ae995c22be45ce'

我试图在 PHP 中工作并输出相同的十六进制,但它不一样,出了什么问题?

class Test {

    public function Encypt($data, $cryptkey) {

        $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $cryptkey, $data, MCRYPT_MODE_CBC);

        return bin2hex($encrypted);
    }
}


$data = "hello";

$test = new Test();

$cryptkey = "_PRIVATE_";

$hex =  $test->Encypt($data, $cryptkey);
echo $hex;

Output

2bab1b8874692176d213e4c23565b304


Crypt::CBC and mcrypt_encrypt使用不同的默认值,这会导致这种不匹配。

For mcrypt_encrypt http://www.php.net/manual/en/function.mcrypt-encrypt.php,文档提供了以下信息:

string mcrypt_encrypt ( string $cipher , string $key , string $data , string $mode [, string $iv ] )

  • $cipher是算法名称。
  • $key是加密密钥,如果太短,将用 NUL 字节填充。
  • $data是要加密的数据,如果太短就会用NUL字节填充。
  • $mode是操作模式,这里"cbc"是正确的。
  • $iv是初始化向量,如果没有提供,它将被初始化为 NUL 字节。

For Crypt::CBC https://metacpan.org/pod/Crypt%3a%3aCBC,我们得到这样的行为:

Crypt::CBC->new(KEYWORD_OPTIONS)

  • -key => STRING是通过一些哈希操作生成加密密钥的密码。
  • -literal_key => BOOL如果设置,这将跳过哈希-key并将其用作文字键。
  • -cipher => CIPHER密码的名称或预初始化的密码对象。
  • -salt => 1 | STRING如果设置为"1",这将产生随机盐。任何其他值都被视为字面盐。这默认为-salt => 1如果需要盐。或者类似的东西,这里的文档有点混乱。如果两者都满足,则不需要盐-iv and literal_key选项已设置。
  • -iv => STRING是初始化向量,通常由盐生成。
  • -header => STRING控制在输出前添加何种类型的标头。这默认为"salt",但也可以设置为"none".

进一步注意的是RIJNDAEL_128意味着密钥长度为 16,而Crypt::CBC假设密钥长度为32.

Using Crypt::Rijndael https://metacpan.org/pod/Crypt%3a%3aRijndael没有Crypt::CBC包装器可能更可取,因为这使我们可以轻松地将所需的选项设置为 PHP 使用的相同默认值:

use Crypt::Rijndael;

my $key = "_PRIVATE_";
my $data = "hello";

# pad the $key to 16 bytes
$key .= "\0" x (16 - length $key);
# pad the $data to a multiple of 16 bytes:
if (my $distance = length($data) % 16) {
    $data .= "\0" x (16 - $distance);
}

my $crypt = Crypt::Rijndael->new($key, Crypt::Rijndael::MODE_CBC);
$crypt->set_iv("\0" x 16);

my $binary = $crypt->encrypt($data);
print unpack("H*", $binary), "\n";

然后输出2bab1b8874692176d213e4c23565b304.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Encryption Crypt - 尝试以与 Perl 相同的方式在 PHP 中工作 的相关文章

  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • 如何将 HTML 转换为 Markdown?

    我有一个类似 stackoverflow 的网站 有一个文本区域 人们可以在其中写答案 我用这个 PHP 库 http parsedown org 转换降价 我的意思是我使用该函数来转换 italic to i italic i inclu
  • unix df 上的正则表达式帮助

    我需要一些帮助来调整我的代码以查找此 UNIX 中的另一个属性df output Ex Filesystem Size Used Avail Capacity Mounted on dev ad4s1e 61G 46G 9 7G 83 ho
  • 在字符串中间添加一个字符

    可能有一个简单的解决方案可以解决这个问题 但会引起面部表情 我将时间存储为 4 个字符长的字符串 即 1300 我试图将该字符串显示为 13 00 我觉得必须有一个比我现在正在做的更优雅的解决方案 我目前有 startTime get fi
  • 为什么验证不起作用并跳转到另一个页面?

    我写了一个customer display php来验证数据 到目前为止只有名字 但无论名字字段是否为空 网页都会跳转到customer search php并且没有更改数据库中的信息 为什么
  • 如何在类似 MVC 的页面中加载基于漂亮 URL 的类?

    我想请教一些关于如何解决这个问题的提示 我正在尝试构建自己的 MVC 网站 我了解了 URL 的基础知识 http example com blog cosplay cosplayer expo today 博客 gt 控制器cosplay
  • .png 和 .jpg 文件解密

    我正在尝试修改我正在使用的软件的图形资产 出于审美目的 我想很难对图形资产做一些有害的事情 但开发人员对它们进行了加密 我不确定他为什么决定这样做 因为我使用和修改了一堆类似的软件 而这些软件的开发人员并没有打扰 因为我看不出为什么需要加密
  • 如何解码 eval( gzinflate( base64_decode(

    我已将此代码注入到我的网站中 如何解码尾随字符串 我需要知道发生了什么以及其背后的代码是什么 这应该输出将被执行的代码eval 我希望这就是您正在寻找的
  • Laravel 5 中的自定义验证器

    我正在将 Laravel 应用程序从 4 升级到 5 但是 我有一个自定义验证器 但无法运行 在L4中 我做了一个验证器 php文件并将其包含在全局 php using require app path validators php 我尝试
  • 语法错误,第 288 行出现意外的“endif”(T_ENDIF)[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我一直在离线处理我的 WordPress 网站的此代码错误 解析错误 语法错误 homez 541 photoher marie
  • 如何在 yii2 中使用两个不同的模型登录或切换身份类别?

    我想允许用户从两个不同的模型登录 配置文件 user gt identityClass gt app models User one more class here enableAutoLogin gt false authTimeout
  • 使用 XSLT 将 XML 转换为 SQL

    由于我无法控制的原因 我将获得一个 XML 文件和一个 XSLT 文件 该文件可以将 XML 文件转换为 SQL 代码或错误 现在让我们假设我们可以信任提供 XML 文件的人不会在 XML 中包含危险的构造 我什至不知道是否应该使用 Sim
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • PHP 数组通过 JSON 转为 jquery 数组

    我有点困惑为什么以下不起作用 get php
  • 从数据库填充复选框

    我有两个表 第一个由与名称关联的 id 组成 1 汽车 2 火车 3 普通 ETC 第二个表由两个字段 user id 和第一个表中的 id 组成 例如 1 1 2 1 3 当用户转到该页面时 我试图重新填充选定的复选框 首先 您查询数据库
  • 如何在laravel中注册后自动登录

    我在 laravel 中注册用户时遇到问题 user假设是包含所有数组元素的数组 同时自动登录以下代码结果false 数据库中保存的密码是hash make password user id this gt user model gt ad
  • 为什么我的会话仍然存在?

    我一定很愚蠢 因为似乎一件相当明显的事情现在让我完全困惑 我有一个会议 ie SESSION handbag id 在某个时刻 我需要彻底终止这个会话 ie at the start of the page session start el
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中

随机推荐