AES在python中解密在php中解密

问题描述

我问这是因为我并不真正了解PHP,但必须以某种方式进行管理。 我已经在python中加密了数据,并且需要在PHP(服务器站点)中解密。 python加密:

import hashlib
from base64 import b64encode,b64decode,urlsafe_b64encode,urlsafe_b64decode
from Crypto.Cipher import AES

text = "secret"
secret_key = 'This is my secret key'
secret_iv = 'This is my secret iv'

key = hashlib.sha256(secret_key.encode('utf-8')).hexdigest()[:32].encode("utf-8")
iv = hashlib.sha256(secret_iv.encode('utf-8')).hexdigest()[:16].encode("utf-8")

_pad = lambda s: s + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)

txt = _pad(text)

cipher = AES.new(key,AES.MODE_CBC,iv)
output = urlsafe_b64encode(cipher.encrypt(str.encode(txt))).rstrip(b'=')

这将提供“ rtVabOaDdf528T63xOhhww”输出,该输出已正确进行AES加密。

PHP ,它们以其他方式进行加密和解密:

<?PHP

$string="secret";
class CryptService{
    private static $encryptMethod = 'AES-256-CBC';
    private $key;
    private $iv;

    public function __construct(){
       echo  '<br>: '.$this->key = substr(hash('sha256','This is my secret key'),32);
       echo  '<br>: '.$this->iv = substr(hash('sha256','This is my secret iv'),16).'<br>';
    }

    public function decrypt($string){
    // $string = strtr($data,'-_','+/');

        $string = base64_decode($string);
        return openssl_decrypt($string,self::$encryptMethod,$this->key,$this->iv);
    }

    public function encrypt($string){
        $output = openssl_encrypt($string,$this->iv);
        $output = base64_encode($output);
        return $output;
    }
}

$a = new CryptService;
echo $ok=$a->encrypt('secret');
echo "\n";
echo 'TEST: '.$a->decrypt($string);
echo 'BACK ok: '.$a->decrypt($ok);
echo "\n\n";

由于“ iv”,openssl_decrypt()函数存在一些问题。有人可以帮我解决这个问题吗...

解决方法

您要为$ this-> iv分配另外4个字符<br>。这将解决该问题:

echo '<br>: ' . ($this->iv = substr(hash('sha256','This is my secret iv'),16)) . '<br>';

基本上,您的. '<br>'<br>连接到您的substr()。我在变量值分配周围添加了()。现在可以了

cnRWYWJPYURkZjUyOFQ2M3hPaGh3dz09 TEST: BACK ok: secret

我不是加密专家,但是...我认为您的代码中有些不完全属于其中。当我删除这两行时:

$string = base64_decode($string);
$output = base64_encode($output);

我得到以下输出:

rtVabOaDdf528T63xOhhww==

enter image description here

rtrim($ok,'=');之后,哪个会给你

rtVabOaDdf528T63xOhhww