当前位置: 首页 > 知识库问答 >
问题:

在Browser/CryptoJS中解密openssl AES 256 CBC

云正信
2023-03-14
openssl enc -e -aes-256-cbc -pbkdf2 -a -S 0123456789ABCDEF -A -k mypassword

注意,这只提供salt和密码,openssl应该自动处理key和IV。我是不是太乐观了,当浏览器解密时也会发生这种情况?如果可能的话,我希望只使用那些加密设置,或者增加的复杂性最小。在浏览器中,我正在尝试使用CryptoJS解密,如下所示:

import * as CryptoJS from 'crypto-js'

const encrypted = <ENCRYPTED_STRING_FROM_SERVER>
const password = 'mypassword'
const salt = '0123456789ABCDEF'
const key = CryptoJS.PBKDF2(password, salt) // Generate key

const bytes = CryptoJS.AES.decrypt(encrypted, key)
const decrypted = bytes.toString(CryptoJS.enc.Utf8)
console.log(decrypted)

但使用调用cryptojs.aes.decrypt错误时,无法读取未定义的的属性“0”,crypto-js/cipher-core.js:371。cryptojs.aes.decrypt的文档很薄,我知道在调用该函数时要更改的任何设置似乎都会给出相同的错误。感谢任何一个能发光的人!

共有1个答案

凌和颂
2023-03-14

在OpenSSL语句中,没有指定迭代计数和摘要,因此使用默认值10000和SHA256。这是相关的,因为CryptoJS使用不同的默认值(1和SHA1)。

CryptoJS对密文应用OpenSSL格式,即加密数据从salted__的ASCII编码开始,然后是salt,然后是密文。因此,Base64编码密文的开头总是以u2fsdgvkx1开头。

CryptoJS使用wordarray数据类型,它封装了一个数组。一个字由4个字节组成。

// 1. Separate ciphertext and salt
var encrypted = "U2FsdGVkX18BI0VniavN78vlhR6fryIan0VvUrdIr+YeLkDYhO2xyA+/oVXJj/c35swVVkCqHPh9VdRbNQG6NQ=="
var encryptedWA = CryptoJS.enc.Base64.parse(encrypted);
var prefixWA = CryptoJS.lib.WordArray.create(encryptedWA.words.slice(0, 8/4));                             // Salted__ prefix
var saltWA = CryptoJS.lib.WordArray.create(encryptedWA.words.slice(8/4, 16/4));                            // 8 bytes salt: 0x0123456789ABCDEF
var ciphertextWA = CryptoJS.lib.WordArray.create(encryptedWA.words.slice(16/4, encryptedWA.words.length)); // ciphertext        

// 2. Determine key and IV using PBKDF2
var password = 'mypassword'
var keyIvWA = CryptoJS.PBKDF2(
    password, 
    saltWA, 
    {
        keySize: (32+16)/4,          // key and IV
        iterations: 10000,
        hasher: CryptoJS.algo.SHA256
    }
);
var keyWA = CryptoJS.lib.WordArray.create(keyIvWA.words.slice(0, 32/4));
var ivWA = CryptoJS.lib.WordArray.create(keyIvWA.words.slice(32/4, (32+16)/4));

// 3. Decrypt
var decryptedWA = CryptoJS.AES.decrypt(
    {ciphertext: ciphertextWA}, 
    keyWA, 
    {iv: ivWA}
);
var decrypted = decryptedWA.toString(CryptoJS.enc.Utf8)
console.log(decrypted)
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
 类似资料:
  • 问题内容: 我有以下Go代码 输出是 使用以下CryptoJS加密 并且可以用解密 输出是-这是正确的输出 为什么Go会有不同的输出? 问题答案: 请检查您的错误。总是 https://play.golang.org/p/dRLIT51u4I 更具体地说,字节75处的值为,超出了base64可用字符的范围。在ascii中,它是ENQ(查询)字符。至于为什么它最终出现在您的最终base64字符串中,

  • 我有一个问题解密文本,它是在Go lang加密,使用CryptoJS。 下面是Go代码:https://play.golang.org/p/xcbl48t_in 这里是JS代码:http://jsfidle.net/ltkxm64n/ 这两种方法都能很好地加密和解密,但是当我将base64密文从GO复制到JS(或者反过来)时,它就不起作用了。我还注意到js输出的第一部分与Go输出相同,但在js输出

  • 在用于aes加密和解密的python脚本中 但是相同的iv、消息和密钥在python和js中产生不同的加密消息, JavaScript与python解密兼容的问题是什么? 两者都使用了aes.mode_cbc,并且假设两者都使用了Pkcs7填充。硬编码iv现在是随机生成的

  • 我尝试过的解决方案: 1.以下代码 https://gist.github.com/huzemin/e8d7a904cec55d4d7635c9322f143c42

  • 我需要解密用AES加密的传入请求,我尝试使用共享示例但无法找到正确的参数集 加密:AES/CBC/PKCS5添加AES/CBC/PKCS5 初始化向量:长度为16的空字节数组 测试密钥:1234567890123456 纯文本:abcdefghigklmnopqrstuvwxyz0123456789 加密:8Z3dZzqn05FmiuBLowExK0CAbs4TY2GorC2dDPVlsn/tP

  • 注意:这只是为个人使用和学习,我不是试图滚动我自己的加密为公众使用。 我需要AES256加密一个字符串,但是我当前的尝试在十六进制解码时最终得到了一个类似server side的字符串。当十六进制解码时,它应该是一个有效的utf8 base64字符串,然后可以将其解码为原始字符串。这与这里提供的解决方案类似,但是salt并不是实际问题(尽管答案被接受),并且我无法在使用之前通过十六进制解码iv来抑