php - slowAES 解密到另一个密钥
问题描述
旧的 slowAES 库存在问题。尝试解密时,在 js 中会产生一个,而在 php 中会产生另一个。控制台中有很多我无法弄清楚的错误。告诉我出了什么事?如何获得相同的密钥?
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$a = "cd36b76f96b103402924bd5f76d3c204";
$b = "680eb6a492f48ea1b342aea7b79e18eb";
$c = "f746749b113236227058bd471f5c91dc";
function toHex($args){
if(func_num_args() != 1 || !is_array($args)){
$args = func_get_args();
}
$ret = '';
for($i = 0; $i < count($args) ;$i++)
$ret .= sprintf('%02x', $args[$i]);
return $ret;
}
function toNumbers($s){
$ret = array();
for($i=0; $i<strlen($s); $i+=2){
$ret[] = hexdec(substr($s, $i, 2));
}
return $ret;
}
function getRandom($min,$max){
if($min === null)
$min = 0;
if($max === null)
$max = 1;
return mt_rand($min, $max);
}
function generateSharedKey($len){
if($len === null)
$len = 16;
$key = array();
for($i = 0; $i < $len; $i++)
$key[] = getRandom(0,255);
return $key;
}
function generatePrivateKey($s,$size){
if(function_exists('mhash') && defined('MHASH_SHA256')){
return convertStringToByteArray(substr(mhash(MHASH_SHA256, $s), 0, $size));
}else{
throw new Exception('cryptoHelpers::generatePrivateKey currently requires mhash');
}
}
function convertStringToByteArray($s){
$byteArray = array();
for($i = 0; $i < strlen($s); $i++){
$byteArray[] = ord($s[$i]);
}
return $byteArray;
}
function convertByteArrayToString($byteArray){
$s = '';
for($i = 0; $i < count($byteArray); $i++){
$s .= chr($byteArray[$i]);
}
return $s;
}
include 'cryptovh/aes.php';
$aes = new AES();
$token = $aes->decrypt(toNumbers($c), 16, 2, toNumbers($a), 16, toNumbers($b));
echo toHex($token); // WHAT I HAVE
echo "<br>";
echo "016e9be78dd5130beb5febcd328ff588"; // WHAT I NEED
?>
复制的cryptovh/aes.php :https ://github.com/aleaxit/slowaes/blob/master/php/aes_fast.php
使用这个库: https ://github.com/aleaxit/slowaes
在输出中,我得到了这个令牌:
dd2f6d60b939b390dc19688babc3873d
和控制台错误:
注意:未定义的偏移量:第 386 行 /var/www/myuser/data/www/example.com/cryptovh/aes.php 中的 16
注意:未定义索引:在 /var/www/myuser/data/www/example.com/cryptovh/aes.php 第 386 行
注意:未定义的偏移量:第 386 行 /var/www/myuser/data/www/example.com/cryptovh/aes.php 中的 20
注意:未定义索引:在 /var/www/myuser/data/www/example.com/cryptovh/aes.php 第 386 行
注意:未定义的偏移量:第 386 行 /var/www/myuser/data/www/example.com/cryptovh/aes.php 中的 24
注意:未定义的索引:在 /var/www/myuser/data/www/example.com/panel/cryptovh/aes.php 第 386 行
解决方案
在slowaes/php/aes_fast.php中,方法中的 MixColumns 操作的反转mixColumns
实现不正确,else-block 必须是:
...
} else {
for ($c = 0; $c < 4; $c++) {
$t[ $c] = self::$GEX[$state[$c]] ^ self::$GBX[$state[4+$c]] ^ self::$GDX[$state[8+$c]] ^ self::$G9X[$state[12+$c]];
$t[ 4+$c] = self::$G9X[$state[$c]] ^ self::$GEX[$state[4+$c]] ^ self::$GBX[$state[8+$c]] ^ self::$GDX[$state[12+$c]];
$t[ 8+$c] = self::$GDX[$state[$c]] ^ self::$G9X[$state[4+$c]] ^ self::$GEX[$state[8+$c]] ^ self::$GBX[$state[12+$c]];
$t[12+$c] = self::$GBX[$state[$c]] ^ self::$GDX[$state[4+$c]] ^ self::$G9X[$state[8+$c]] ^ self::$GEX[$state[12+$c]];
}
}
...
解密需要 MixColumns 操作的逆操作。
方法中还有一个错字invMain
,第 3 行,其中i
必须替换为$i
.
通过这些更改,获得了预期的结果,可以在此处进行验证。警告也不再显示。
我在这里提出了一个问题。请注意自述文件:该代码更多用于教学目的。在实践中,openssl_encrypt
/openssl_decrypt
或类似的应该被使用。
推荐阅读
- javascript - 下载按钮重定向到错误页面
- c# - 以本地系统用户身份运行时尝试使用 C# SqlConnect 连接后,LocalDB 实例消失
- lambda - 如何编写比较器以使用 lambda 表达式基于第二列对二维数组进行排序
- unity3d - Unity Vuforia 对象不显示在地平面上
- python-3.x - Numpy将位图扩展为位图的位图
- c3.js - 如何显示条件标签和无标签?
- javascript - 如何在我的扩展程序中禁用“询问保存位置”设置?
- php - 如何使用 apache2 将 Laravel API 配置为端口 8000?
- mysql - 在 mySQL 中创建具有百分比的动态数据透视表
- java - 正则表达式组不适用于多个地址