- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我要回顾一些我之前为加密而编写的代码 [包含在这篇文章的底部],但我遇到了一个错误,我找不到解决方法。每当我尝试解密我的数据时,我都会从 OpenSSL 收到以下错误:
error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
我的加密函数的输出是:
$AES-256-CBC$SHA256$kJ+DIShnFOs0cGsDiVnXXMdBj1GoLYywrhz+lv3W/dk=
原始加密数据是:
00000000 90 9f 83 21 28 67 14 eb 34 70 6b 03 89 59 d7 5c |...!(g..4pk..Y.\|
00000010 c7 41 8f 51 a8 2d 8c b0 ae 1c fe 96 fd d6 fd d9 |.A.Q.-..........|
我的 IV 是:
00000000 d7 4f f0 ee 8d a3 b9 80 6b 18 c8 77 db f2 9b bd |.O......k..w....|
我不知道这里出了什么问题。我可以在谷歌上搜索到的大部分内容都归结为“你没有从数据的开头删除 IV”,但它一开始就不存在。
代码:
Class MyEncrypt {
private $method, $iv_size, $hashfunc;
public function __construct($method='AES-256-CBC', $hashfunc='SHA512') {
if( ! function_exists('openssl_encrypt') ) {
Throw new Exception('openssl_encrypt() not supported.');
} else if( ! in_array($method, openssl_get_cipher_methods()) ) {
Throw new Exception('Encryption method ' . $method . ' not supported.');
} else if( ! in_array(strtolower($hashfunc), hash_algos()) ) {
Throw new Exception('Hashing method ' . $hashfunc . ' not supported.');
}
$this->method = $method;
$this->hashfunc = $hashfunc;
$this->iv_size = openssl_cipher_iv_length($this->method);
}
public function encrypt($password, $data) {
$iv = $this->hashIV($password);
$infostr = sprintf('$%s$%s$', $this->method, $this->hashfunc);
return $infostr . openssl_encrypt($data, $this->method, $password, 0, $iv);
}
public function decrypt($password, $data) {
$data_arr = explode('$', $data);
if( ! count($data_arr) == 4 ) {
throw new Exception('Bad input data.');
}
// var_export($data_arr);
$iv = $this->hashIV($password);
// echo base64_encode($iv);
if( ! $res = openssl_decrypt($data, $this->method, $password, 0, $iv) ) {
throw new Exception(openssl_error_string());
} else { return $res; }
}
private function hashIV($password, $method=NULL) {
if( is_null($method) || ! in_array(strtolower($method), hash_algos())) {
$hashfunc = $this->hashfunc;
} else {
$hashfunc = $method;
}
$myhash = hash($hashfunc, $password, TRUE);
while( strlen($myhash) < $this->iv_size ) {
$myhash .= hash($hashfunc, $myhash, TRUE);
}
return substr($myhash, 0, $this->iv_size);
}
} // -- end class MyEncrypt -- //
$c = new MyEncrypt("AES-256-CBC", "SHA256");
$msg_enc = $c->encrypt('pass', 'blah blah this is my data!');
echo $msg_enc . "\n" . var_export($c->decrypt('pass', $msg_enc), true);
最佳答案
MyEncrypt 类中的加密函数返回一个以“$”分隔的字符串,其中只有最后一部分是 base64 编码的加密数据。您只需要传递该部分而不是前缀($AES-256-CBC$SHA512)。
因此,如果您将 $data_arr[3] 而不是 $data 传递给 openssl_decrypt 函数,一切都会正常进行。我用 php 解释器试了一下,下面是输出。
> php -f x.php
$AES-256-CBC$SHA256$kJ+DIShnFOs0cGsDiVnXXMdBj1GoLYywrhz+lv3W/dk=
'blah blah this is my data!'
关于php - OpenSSL 错误 : EVP_DecryptFinal_ex:wrong final block length,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18878586/
这个问题在这里已经有了答案: java.lang.IllegalArgumentException: The servlets named [X] and [Y] are both mapped t
我无法让我的 WebRTC 代码正常工作。我相信我所做的一切都是正确的,但它仍然无法正常工作。为什么 ontrack 这么早就被调用有些奇怪,也许它应该是那样的。 该网站使用 javascript 代
使用 Mac OSX 优胜美地 (10.10.4): rails -v => Rails 4.2.3 ruby -v => ruby 2.2.2p95 遵循这些说明的组合: https://www
您好,我正在尝试使用(缓存的)已编译的 lambda 表达式来访问属性,与使用 PropertyInfo.GetValue()/SetValue() 方法调用相比,我确实得到了更好(即更快)的结果。然
我编写此代码是为了获取学生的字母成绩并计算他们的 GPA。当我运行该程序时,我可以正确获取学生的姓名和科目,但无法显示成绩或 GPA。 示例输入: Sally 1 A N 示例输出: Enter St
我一直在编写这段代码,根据这本书应该可以做到这一点: Write a script that creates and calls a stored procedure named test. This
我真的很难创建一个具有以下基本格式的有效多维 JavaScript 数组: var countries = [ { "country": "UK", "properties": {
我有一个小型 Python OOP 程序,其中 2 个类 Flan 和 Outil 继承自父类(super class) Part。 我的问题是,当我调用 Flan 时一切正常,但是当我调用 Outi
我目前正在尝试使用通用监听器来编写事件系统。 所有监听器都应添加到单个 EventSource 对象,该对象将为特定事件调用其 receiveEvent() 方法。 事件源: public class
我正在通过我的 PHP 应用程序发送电子邮件。但是,它们被 Gmail 标记为垃圾邮件。这是我发送电子邮件的方式(PHP): $headers = "From: test@bookmytakeout.
我已经正式走到了穷途末路的地步。我找不到我做错了什么。我完成的这个程序几乎与我几天前编写的另一个程序一模一样,但我在编译时遇到了问题。我不知道为什么输出线上出现错误。请帮忙: 这是正在运行的文件: p
---编辑:我不允许使用任何包或预置方法。不用担心,我不想让你做我的“作业”,我只需要一点提示!---我发现these interesting Algorithms 。我想使用按位添加方法。我的问题是
我制作了一个小程序,尝试使用 conn.getOutputStream(); 检索 URLConnection 对象输出流。当我尝试执行此操作时,我的小程序抛出异常 java.net.UnknownS
每当我尝试在 SVN 中合并时,我都会遇到成堆的树冲突。好吧,就此示例脚本而言,只有一个,但仍然如此。 #!/bin/bash svnadmin create repo svn checkout fi
我开始为 Scala 中的 X500PrincipalBuilder 类编写单元测试。这是我的测试代码: import org.junit.runner.RunWith import org.scal
我正在用 python 编写我的第一个程序,它必须模拟粒子(两种气体)的混合。我不知道我这个功能做错了什么。我不希望颗粒离开某些区域,即容器的壁。我使用 VPython。 def poruszanie
我正在尝试求解三角方程组,但我认为 Python 没有生成正确的解。我试图解决的方程: 1 − 2cosθ1 + 2cosθ2 − 2cosθ3 = −0.8 1 − 2cos5θ1 + 2cos5θ
这个问题已经有答案了: TypeError: worker() takes 0 positional arguments but 1 was given [duplicate] (11 个回答) 已关
大家好,我正在努力解决这个问题 编写一个 C 程序,计算弹丸在撞击地面之前行进的距离(即射程)、弹丸撞击地面所需的时间以及弹丸飞行中的最大高度(给定角度)它被射向空中,以及发射时的初始速度(速度)。我
我编写了代码来计算 QuickSort 中完成的比较次数。 每当对长度为 m 的数组执行快速排序时,该算法都会将比较次数增加 m-1(因为主元将与除自身以外的所有内容进行比较)。 枢轴的选择始终是数组
我是一名优秀的程序员,十分优秀!