OpenResty lua-resty-string: невозможно расшифровать шифр, зашифрованный Crypto-JS (по умолчанию AES)

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

Я не могу расшифровать то, что было зашифровано с помощью Crypto-JS в браузере Javascript/NodeJS:

// 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))

Что мне нужно изменить в расшифровке на стороне сервера?


person Prakhar Mishra    schedule 09.08.2018    source источник


Ответы (1)


Во-первых, вам нужно декодировать зашифрованные данные в кодировке base64 в байты.

Во-вторых, ваши зашифрованные данные добавляются и хранятся, как описано здесь:

Файлы имеют 8-байтовую подпись, за которой следует 8(?)-байтовая соль. После соли идут зашифрованные данные.

Файлы начинаются с 8-байтовой подписи: символы ASCII Salted__.

Итак, вы должны извлечь как соль, так и фактические зашифрованные данные из строки «соленого формата OpenSSL» (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
person un.def    schedule 09.08.2018