为了账号安全,请及时绑定邮箱和手机立即绑定

slowAES 解密为另一个密钥

slowAES 解密为另一个密钥

PHP
慕运维8079593 2022-12-30 17:49:51
旧的 slowAES 库有问题。尝试解密时,在 js 中它会生成一个,而在 php 中它会生成另一个。控制台中有很多我无法弄清楚的错误。告诉我出了什么事?如何获得相同的密钥?<?phpini_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 HAVEecho "<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
查看完整描述

1 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

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


查看完整回答
反对 回复 2022-12-30
  • 1 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信