【问题标题】:OpenResty lua-resty-string: Unable to decrypt cipher encrypted by Crypto-JS (AES default)OpenResty lua-resty-string:无法解密由 Crypto-JS 加密的密码(AES 默认)
【发布时间】:2019-01-16 18:38:03
【问题描述】:

https://github.com/openresty/lua-resty-string

我无法解密在浏览器 Javascript/NodeJS 中使用 Crypto-JS 加密的内容:

// Encrypt
var ciphertext = CryptoJS.AES.encrypt('testingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtesting', '&&nH8P3bxk+?C4gR');

// Decrypt
var bytes  = CryptoJS.AES.decrypt(ciphertext.toString(), '&&nH8P3bxk+?C4gR');
var plaintext = bytes.toString(CryptoJS.enc.Utf8);

console.log(plaintext);

我可以用 Java 解密它:

Cipher.getInstance("AES/CBC/PKCS5Padding")

但是,我明白了

nil

当我尝试用 resty.aes 来做这件事时。代码如下:

local aes = require "resty.aes"
local cipher = aes.cipher(256)
local aes_256_cbc_md5 = aes:new('&&nH8P3bxk+?C4gR', nil, cipher)

local cipherText = 'U2FsdGVkX1859eIyt4M7VHNBl9BGMdsemPYAADKmqs9sltwKINfzVMci0Vw1NLr73Iti67zQ0+JoqVcL59Gcp+4R5NY6wg2n3r0wqLcQRc7PkIGpgup1UJp4DzhXSIGHz08Eu/nEbt3jAh3S4GVUoVFbXLluf/BvedTGdsqcN2EPL9S/WQOc5QDyl9OQjpBl+QS56nWL0DO6iR/6CIoEuQ+zC/7KTpBw2jQf8sxuDNptZzwKLlDi2sWSaeCkvPj+m8zheAlnZzVc+L5JeLdcx7WkIRQImNs9P5bkhXmiK2nZnw4yco3QHbzRkRBJiB3HgdYDauHsuKmR21zv9VLjAcGTrZjiUbtrBfuTRawKOiAFm599Inbq+Ugu9n4RelQ2CTdxwDfe3ZE3kscP3dyAmg=='
ngx.say(aes_256_cbc_md5:decrypt(cipherText))

我需要对服务器端解密进行哪些更改?

【问题讨论】:

    标签: encryption lua aes cryptojs openresty


    【解决方案1】:

    首先,您需要将 base64 编码的加密数据解码为字节。

    其次,您的加密数据按照here的描述进行加盐和存储:

    文件有一个 8 字节的签名,后跟一个 8(?) 字节的盐。加盐之后是加密数据。

    文件以 8 字节签名开头:ASCII 字符“Salted__”。

    因此,您应该从“OpenSSL salted format”-ted 字符串 (Salted__{salt}{data}) 中提取盐和实际加密数据:

    -- aes_demo.lua
    local aes = require "resty.aes"
    
    
    local encrypted = ngx.decode_base64('U2FsdGVkX1859eIyt4M7VHNBl9BGMdsemPYAADKmqs9sltwKINfzVMci0Vw1NLr73Iti67zQ0+JoqVcL59Gcp+4R5NY6wg2n3r0wqLcQRc7PkIGpgup1UJp4DzhXSIGHz08Eu/nEbt3jAh3S4GVUoVFbXLluf/BvedTGdsqcN2EPL9S/WQOc5QDyl9OQjpBl+QS56nWL0DO6iR/6CIoEuQ+zC/7KTpBw2jQf8sxuDNptZzwKLlDi2sWSaeCkvPj+m8zheAlnZzVc+L5JeLdcx7WkIRQImNs9P5bkhXmiK2nZnw4yco3QHbzRkRBJiB3HgdYDauHsuKmR21zv9VLjAcGTrZjiUbtrBfuTRawKOiAFm599Inbq+Ugu9n4RelQ2CTdxwDfe3ZE3kscP3dyAmg==')
    
    local salt = encrypted:sub(9, 16)   -- skip first 8 bytes, get salt value (8 bytes)
    local data = encrypted:sub(17)      -- rest of data is actual encrypted data
    local cipher = aes.cipher(256)
    local aes_256_cbc_md5 = aes:new('&&nH8P3bxk+?C4gR', salt, cipher)
    
    ngx.say(aes_256_cbc_md5:decrypt(data))
    

    $ resty aes_demo.lua
    
    testingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtestingtesting
    

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2014-09-12
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 2013-08-16
      相关资源
      最近更新 更多