首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本机的AES-256-CBC加密算法

本机的AES-256-CBC加密算法
EN

Stack Overflow用户
提问于 2022-09-22 17:56:59
回答 1查看 395关注 0票数 0

嗨,我想检查一下在BE上所做的加密的兼容性。

请提供以下代码

代码语言:javascript
复制
$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';导入

代码语言:javascript
复制
  Aes.encrypt(inputText, hash, _IV, 'aes-256-cbc').then(cipher => {
  console.log('cipher', cipher); });

这引发了一个错误错误:预期的IV长度为16,但为8,我检查了_IV的长度,它肯定是16。

从'react-native-crypto-aes-cbc';导入

  1. CryptoAesCbc

代码语言:javascript
复制
  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转换为十六进制的帖子。

所以我做了这个

代码语言:javascript
复制
  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==

任何帮助都是非常感谢的。

提前感谢

EN

回答 1

Stack Overflow用户

发布于 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 )的一个可能的实现是:

代码语言:javascript
复制
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());
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

它提供与PHP代码相同的密文。

一般来说,还应该指出,大写字母和小写字母的使用在十六进制编码中没有得到一致的实施。但是,就像PHP的hash()函数一样,CryptoJS使用小写字母,所以这里没有问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73818930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档