嗨,我想检查一下在BE上所做的加密的兼容性。
请提供以下代码
$secret_key = VALUE1`;
$secret_iv = VALUE2;
$encrypt_method = "AES-256-CBC";
$key = hash('sha256', $secret_key);
$iv = substr(hash('sha256', $secret_iv), 0, 16);
openssl_encrypt($string, $encrypt_method, $key, 0, $iv)`当输入字符串为abc时,openssl给出了SNtvZ3Dpv1S88Ha6aVBdcg==。
我尝试过很少的alogritham,但我无法与BE正确地匹配。
我生成的$key和$iv值与BE相同。但在加密方面,它没有给出任何结果,也没有说预期的IV长度是16,但得到了8
以下是我尝试过的软件包
从'react-native-aes-crypto';导入
Aes.encrypt(inputText, hash, _IV, 'aes-256-cbc').then(cipher => {
console.log('cipher', cipher); });这引发了一个错误错误:预期的IV长度为16,但为8,我检查了_IV的长度,它肯定是16。
从'react-native-crypto-aes-cbc';导入
CryptoAesCbc.encryptInBase64(
base64.encode(ivHash.substr(0, 16)),
base64.encode(hash),
'abc',
'128',
)
.then(encryptString => {
console.log('encryptString', encryptString);
})
.catch(error => {
console.log('error ', error);
});此encryptString值打印空字符串。
请有人给我一些关于这个的见解。
FYI目前正在使用Android系统。
编辑1
我发布了一些关于将_IV转换为十六进制的帖子。
所以我做了这个
Aes.encrypt(
inputText,
hash,
Buffer.from(_IV).toString('hex'),
'aes-256-cbc',
)
.then(cipherText => console.log('cipherText', cipherText))
.catch(error => console.log('error here', error));这让我出了错-- cipherText: yLvY847qCMHHGHdachjKGw==
任何帮助都是非常感谢的。
提前感谢
发布于 2022-09-23 09:37:11
在PHP代码的hash()函数中,默认情况下第三个参数是false,因此$key和$iv作为十六进制编码字符串而不是原始二进制数据返回。
因此,对于摘要输出长度为32字节的SHA256,$key的长度为64字节,因为$key不是显式截断的,与$iv不同。
然而,在64个字节中,只有前32个字节用于加密,因为OpenSSL/PHP默默地截断太大的密钥(对于0x00值太短的键),以达到指定的长度(AES-256-CBC为32字节)。
在CryptoJS方面,必须考虑键和IV的十六进制编码以及键的截断。
使用CryptoJS (在聊天中引用your solution )的一个可能的实现是:
var plaintext = "The quick brown fox";
var keyMaterial = "my key passphrase";
var ivMaterial = "my IV passphrase"
var truncHexKey = CryptoJS.SHA256(keyMaterial).toString().substr(0, 32); // hex encode and truncate
var truncHexIV = CryptoJS.SHA256(ivMaterial).toString().substr(0, 16); // hex encode and truncate
var key = CryptoJS.enc.Utf8.parse(truncHexKey);
var iv = CryptoJS.enc.Utf8.parse(truncHexIV);
var ciphertext = CryptoJS.AES.encrypt(plaintext, key, {iv: iv}); // default values: CBC, PKCS#7 padding
console.log('Ciphertext: ' + ciphertext.toString());<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
它提供与PHP代码相同的密文。
一般来说,还应该指出,大写字母和小写字母的使用在十六进制编码中没有得到一致的实施。但是,就像PHP的hash()函数一样,CryptoJS使用小写字母,所以这里没有问题。
https://stackoverflow.com/questions/73818930
复制相似问题