aes-256-gcm用PHP加密,用javascript解密

时间:2020-05-13 09:57:51

标签: php reactjs openssl google-cloud-messaging aes

我在javascript端解密数据时遇到一些问题。 我成功使用aes-256-cbc,但是使用aes-256-gcm,遇到了一些麻烦。

所以我在PHP中有一个API,在Reactjs中有一个前端。

请参见以下PHP方面:

$algo = "aes-256-gcm";
$sKey = openssl_random_pseudo_bytes(16);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher));

$sEncrypted = openssl_encrypt(
     json_encode($aData, true), 
     $algo, 
     $sKey, 
     $options=0, 
     $iv, 
     $tag
);


$aEncrypt = [
    "ciphertext" => base64_encode($sEncrypted),
    "iv"         => base64_encode($iv),      
    "tag"        => base64_encode($tag)
];

return $aEncrypt;

在我的JavaScript端:

import crypto from 'crypto';

// Retrieve json
let obj_json = JSON.parse(data);

// Define variable from API call
let algo = 'aes-256-gcm';
let key = "xx"; // Retrieved previously
let encrypted_data = obj_json.ciphertext; // Seems no need to decode b64 since update function will do it
let tag = atob(obj_json.tag); // b64 decode
let iv = atob(obj_json.iv); // b64 decode

// Let's decrypt
let decipher = crypto.createDecipheriv(algo, key, iv);
decipher.setAuthTag(tag);
let decrypted = decipher.update(encrypted_data, 'base64','utf8');
decrypted += decipher.final('utf8');

我明白了:

Error: Unsupported state or unable to authenticate data

我尝试了其他库(reactjs),但始终收到此错误。 iv或标签的编码有问题吗?

谢谢:D

2 个答案:

答案 0 :(得分:0)

可以在这里找到答案:Encrypt string in PHP and decrypt in Node.js

对于您自己的设置,可能需要一些调整,但是应该可以使用!

干杯。

答案 1 :(得分:0)

我终于找到了问题。

只需替换

let tag = atob(obj_json.tag); // b64 decode
let iv = atob(obj_json.iv); // b64 decode

通过

let tag = Buffer.from(obj_json.tag, 'base64');
let iv = Buffer.from(obj_json.iv, 'base64');
相关问题