OpenResty lua-resty-string: Unable to decrypt data which can be decrypted by Golang and Python - encryption

OpenResty lua-resty-string: Unable to decrypt data which can be decrypted by Golang and Python
https://github.com/openresty/lua-resty-string
I can decrypt data with enc, key, iv like:
test_enc:"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"
test_key:="4AvVhmFLUs0KTA3Kprsdag=="
test_iv:="vN2mBu17W/8Ewfg3AX8Ayg=="
by Golang and Python:
Golang Code:
func decodeAesGcmTest() {
test_enc := "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"
test_key := "4AvVhmFLUs0KTA3Kprsdag=="
test_iv := "vN2mBu17W/8Ewfg3AX8Ayg=="
key, _ := base64.StdEncoding.DecodeString(test_key)
byteKey := []byte(key)
add := []byte("")
block, _ := aes.NewCipher(byteKey)
aesgcm, _ := cipher.NewGCMWithNonceSize(block, 16)
iv, _ := base64.StdEncoding.DecodeString(test_iv)
enc, _ := base64.StdEncoding.DecodeString(test_enc)
plaintest, _ := aesgcm.Open(nil, iv, enc, add)
fmt.Println("plaintest: ", string(plaintest))
}
Python Code:
def test_gcm_decode():
test_enc = "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"
test_key = "4AvVhmFLUs0KTA3Kprsdag=="
test_iv = "vN2mBu17W/8Ewfg3AX8Ayg=="
enc = base64.b64decode(test_enc)
key = base64.b64decode(test_key)
iv = base64.b64decode(test_iv)
mode = AES.MODE_GCM
decryptor = AES.new(key, mode, iv)
plaintext = decryptor.decrypt(enc)
print(plaintext)
but I cannot decrypt it with lua-resty-string:
local function gcm_decrypt()
local aes = require "resty.aes"
local ngx_decode_base64 = ngx.decode_base64
local cipher_len = {
128,
192,
256
}
local test_enc = "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"
local test_key = "4AvVhmFLUs0KTA3Kprsdag=="
local test_iv = "vN2mBu17W/8Ewfg3AX8Ayg=="
local enc = ngx_decode_base64(test_enc)
local key = ngx_decode_base64(test_key)
local iv = ngx_decode_base64(test_iv)
for _, vv in ipairs(cipher_len) do
local decryptor, err = aes:new(key, nil, aes.cipher(vv, "gcm"), {iv = iv}, nil, nil, false)
if decryptor then
local plaintext, err = decryptor:decrypt(enc)
if not err and plaintext then
return true
else
ngx.log(ngx.ERR, "decrypt failed: ", err)
end
else
ngx.log(ngx.ERR, "aes new failed: ", err)
end
end
end
Is the method I am using is wrong?
Thank you~
I try to decrypt with enc, key, iv using Golang and Python.
I want to decrypt with enc, key, iv using lua-resty-string but failed.

In lua-resty-string, the :decrypt(ciphertext, tag = nil) method expects an authentication tag passed as a separate parameter: https://github.com/openresty/lua-resty-string/blob/v0.15/lib/resty/aes.lua#L270
Conversely, the Golang/Python libraries you've used expect an authentication tag appended to a ciphertext
Check this question for futher explanation:
The authentication tag is defined as an output parameter in GCM (see section 7, step 7 of NIST SP 800-38D). In all the API's I've encountered it's appended to the ciphertext.
RFC 5116, section 5.1, AEAD_AES_128_GCM:
An authentication tag with a length of 16 octets (128
bits) is used. The AEAD_AES_128_GCM ciphertext is formed by
appending the authentication tag provided as an output to the GCM
encryption operation to the ciphertext that is output by that
operation.
A real life example (Python cryptography library): https://github.com/pyca/cryptography/blob/39.0.0/src/cryptography/hazmat/backends/openssl/aead.py#L259-L267
This is a fix for your OpenResty code:
-- "An authentication tag with a length of 16 octets (128 bits) is used"
local tag_len = 16
-- enc_data = enc[:-16], enc_tag = enc[-16:]
local enc_data = enc:sub(1, -(tag_len + 1))
local enc_tag = enc:sub(-tag_len)
decryptor:decrypt(enc_data, enc_tag)

Related

Decrypt DESFire ReadData Session

We´re struggeling with the decryption of DESFire Data. We´ve authenticated successfully and could decrypt RndA´ which was the same as the RndA we´ve created.
Now we try to read an encyphered File from position 0 for 16 bytes.
From some java library we could figure out, that we have to use the encyphered Command as IV for the decryption. Is that right?
Here the examples:
SessionKey: 0ba1caf83a26a72170149b7504895f34
ReadCommand: bd00000000100000
Crc32C for Cmd: D9CEE76B
Secret: 6a0d0f0d5c8f054b1e5914a42e49728622774c6272e5c34a69ed302251576aaf
So now we concat the ReadCommand with Crc32C:
bd00000000100000D9CEE76B
Then we padd Zeros up to 16 Bytes
bd00000000100000D9CEE76B00000000
Then we generate e(cmd + crc + padding) with session key and IV 0 to gain the next iv for decrypting the resposne:
77E24803B5401C61F657607923E5A318
Now we decrypt the secret with session Key and IV:=e(cmd + crc32) and are getting:
D1E9A4726C2A5C3FD5938E714C07524EF1F74BD9000000000000000000000000
There are many Zeros which let me think we are not far away from the answer.
So please someone tell us, what is wrong?
We are using this library for Crc32C
And here the full code we are using within a test:
[Theory]
[InlineData("6a0d0f0d5c8f054b1e5914a42e49728622774c6272e5c34a69ed302251576aaf", "0ba1caf83a26a72170149b7504895f34", "bd00000000100000")]
public void DecryptData_Test(string secretS, string sessionKeyS, string cmdS)
{
var cryptoAlgoFactory = new Func<SymmetricAlgorithm>(() => Aes.Create());
var keyLength = 16;
var secret = EncriptionHelper.StringToByte(secretS);
var sessionKey = EncriptionHelper.StringToByte(sessionKeyS);
var cmd = EncriptionHelper.StringToByte(cmdS);
var crytoAlgo = cryptoAlgoFactory();
crytoAlgo.Mode = CipherMode.CBC;
crytoAlgo.Padding = PaddingMode.None;
var encryptor = crytoAlgo.CreateEncryptor(sessionKey, new byte[keyLength]);
var crc32 = BitConverter.GetBytes(Crc32C.Crc32CAlgorithm.Compute(cmd));
var padding = 0;
if ((cmd.Length + crc32.Length) % keyLength != 0)
padding = keyLength - ((cmd.Length + crc32.Length) % keyLength);
var result = new byte[cmd.Length + crc32.Length + padding];
Array.Copy(cmd, result, cmd.Length);
Array.Copy(crc32, 0, result, cmd.Length, crc32.Length);
var iv = encryptor.TransformFinalBlock(result, 0, result.Length);
crytoAlgo = cryptoAlgoFactory();
crytoAlgo.Mode = CipherMode.CBC;
crytoAlgo.Padding = PaddingMode.None;
var decryptor = crytoAlgo.CreateDecryptor(sessionKey, iv);
var plain = decryptor.TransformFinalBlock(secret, 0, secret.Length);
Assert.NotNull(plain);
}
We´ve found out, that we have to encrypt the command with CMACing and without CRC32C.
Therefore the following solution:
SessionKey: 0ba1caf83a26a72170149b7504895f34
ReadCommand: bd00000000100000
Secret: 6a0d0f0d5c8f054b1e5914a42e49728622774c6272e5c34a69ed302251576aaf
First Encrypt the cmd with CMACing to get the following IV for further decrypting (Note to use the SessionKey):
A70BEC41E95A706F11F7DA3D59F2F256
Then decrypt the secret in CBC Mode with IV cmac(cmd) to get the result:
01000030303030313233343536100300F1F74BD9000000000000000000000000
Within the CMACing there is still something wrong so we used an NuGet Packege which worked fine.

Get content of second Set-Cookie header with Lua

Nginx has a known issue that if multiple Set-Cookie header is set, then Nginx can log only one of them(still not sure whether it's first or random one).
So for example if backend sets
"CSESSIONID=XXXXXXXXXXXXXXX"
"JSESSIONID=XXXXXXXXXXXXXXX"
then using $sent_http_set_cookie variable in access log it will be possible to log only CSESSIONID, even on the client side it will be seen as single header
Set-Cookie: CSESSIONID=XXXXXXXXXXXXXXX,JSESSIONID=XXXXXXXXXXXXXXX
I use OpenResty and the question is how I can access response header data and obtain value of second cookie (JSESSIONID in my case)?
UPDATE
I have tried to extract JSESSIONID into resp_header variable using this snippet in my server section, but it's empty.
Any ideas are appreciated
set $resp_header "";
header_filter_by_lua_block {
local headers, err = ngx.resp.get_headers()
if err then
ngx.log(ngx.ERR, "err: ", err)
return ngx.exit(500)
end
for k, v in pairs(headers) do
if k:lower() == "set-cookie" then
local set_cookie = v
if (type(set_cookie) == "table") then
for key, value in pairs(set_cookie) do
if string.match(value:lower(), "jsessionid") then
val = string.match(value:upper(), "JSESSIONID=[%a%d]+")
ngx.var.resp_header = val
end
end
end
end
end
}
After some fighting with Lua I came to the following solution(needed to handle case when only single Set-Cookie was present):
set $resp_header='';
header_filter_by_lua_block {
if ngx.var.uri == "/v1/auth" then
local headers, err = ngx.resp.get_headers()
if err then
ngx.log(ngx.ERR, "err: ", err)
return ngx.exit(500)
end
for k, v in pairs(headers) do
if k:lower() == "set-cookie" then
local set_cookie = v
if (type(set_cookie) == "table") then
for key, value in pairs(set_cookie) do
if string.match(value:lower(), "jsessionid") then
val = string.match(value:upper(), "JSESSIONID=([%w]+)")
ngx.var.resp_header = val
end
end
elseif (type(set_cookie) == "string") then
val = string.match(set_cookie:upper(), "JSESSIONID=([%w]+)")
ngx.var.resp_header = val
end
end
end
end
}

Lockbox 3 AES 128 Encrypt PLSQL dbms_crypto Decrypt

I am having trouble getting the same encrypted values returned between Delphi and Oracle any assistance would be greatly appreciated.
It could possibly be the padding that might be causing the difference, unfortunately I am not sure.
Lockbox 3
Delphi RAD Studio Tokyo 10.2
//uses uTPLb_Constants,uTPLb_BaseNonVisualComponent, uTPLb_Codec, uTPLb_CryptographicLibrary, IdHashMessageDigest, idHash
var cipher64, CipherText : string;
plainText: utf8string;
keyText: utf8string;
FLibrary: TCryptographicLibrary;
FCodec: TCodec;
bytes, cipher: TBytes;
workHash : TIdHashMessageDigest5;
Result : String;
begin
plainText := 'test-data';
keyText := 'test_key';
try
workHash := TIdHashMessageDigest5.Create;
Result := workHash.HashStringAsHex(keyText);
finally
FreeAndNil(workHash);
end;
memoOutput.Lines.Add('plaintext = ' + plainText);
memoOutput.Lines.Add('key hash = ' + Result);
FLibrary := TCryptographicLibrary.Create(Self);
try
FCodec := TCodec.Create(Self);
try
FCodec.CryptoLibrary := FLibrary;
FCodec.StreamCipherId := BlockCipher_ProgId;
FCodec.BlockCipherId := Format(AES_ProgId, [128]);
FCodec.ChainModeId := ECB_ProgId;
FCodec.password := Result;
FCodec.EncryptString( plainText, CipherText, Tencoding.UTF8 );
FCodec.Burn;
finally
FCodec.Free;
end;
finally
FLibrary.Free;
end;
Results :
key hash = 8C32D1183251DF9828F929B935AE0419 MD5 Hash of text "test_key"
ciphertext = FJRXv9zMbypUmYnzzEHLnA== Base64 Result from Lockbox
Oracle XE
declare
raw_key raw(200);
encryption_type number;
encrypted_result varchar2(4000);
decrypted_result varchar2(4000);
begin
raw_key := DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW ('test_key', 'AL32UTF8'), DBMS_CRYPTO.HASH_MD5);
-- Initialize the encrypted result
encryption_type:= DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5;
-- Then the data is being encrypted with AES:
encrypted_result := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW('test-data', 'AL32UTF8'), encryption_type, raw_key);
decrypted_result := DBMS_CRYPTO.DECRYPT(encrypted_result, encryption_type, raw_key);
dbms_output.put_line(raw_key);
dbms_output.put_line(encrypted_result);
dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2 (decrypted_result));
dbms_output.put_line(utl_raw.cast_to_varchar2(utl_encode.BASE64_ENCODE(encrypted_result)));
end;
Results :
Key Hash : 8C32D1183251DF9828F929B935AE0419
Encrypt : 8FCA326C25C8908446D28884394F2E22 Hex value returned
Base 64 : j8oybCXIkIRG0oiEOU8uIg==
Yes, Lockbox is using Ciphertext stealing for the padding. Your Oracle code is using PKCS5 padding.

CryptoJS encrypt Go decrypt

I have the following Go code
ciphertext := "Zff9c+F3gZu/lsARvPhpMau50KUkMAie4j8MYfb12HMWhkLqZreTk8RPbtRB7RDG3QFw7Y0FXJsCq/EBEAz//XoeSZmqZXoyq2Cx8ZV+/Rw="
decodedText, _ := base64.StdEncoding.DecodeString(ciphertext)
decodedIv, _ := base64.StdEncoding.DecodeString("u9CV7oR2w+IIk8R0hppxaw==")
newCipher, _ := aes.NewCipher([]byte("~NB8CcOL#J!H?|Yr"))
cfbdec := cipher.NewCBCDecrypter(newCipher, decodedIv)
cfbdec.CryptBlocks(decodedText, decodedText)
data, _ := base64.StdEncoding.DecodeString(string(decodedText))
println(string(data))
The output is {"data":{"value":300}, "SEQN":700 , "msg":"IT WORKS!!"
It's encrypted with the following CryptoJS
function encrypt(message, key) {
let keyHex = CryptoJS.enc.Hex.parse(parseToHex(key))
let iv = CryptoJS.lib.WordArray.random(128 / 8);
let wordArray = CryptoJS.enc.Utf8.parse(message);
let base64 = CryptoJS.enc.Base64.stringify(wordArray);
let encrypted = CryptoJS.AES.encrypt(base64, keyHex, { iv: iv });
return {
cipher: encrypted.ciphertext.toString(CryptoJS.enc.Base64),
iv: CryptoJS.enc.Base64.stringify(iv),
length: base64.length,
size: encrypted.ciphertext.sigBytes,
}
}
And can be decrypted with
function decrypt(message, key, iv) {
let ivEX = CryptoJS.enc.Hex.parse(decodeToHex(iv));
let keyEX = CryptoJS.enc.Hex.parse(parseToHex(key));
let bytes = CryptoJS.AES.decrypt(message, keyEX , { iv: ivEX});
let plaintext = bytes.toString(CryptoJS.enc.Base64);
return decodeToString(decodeToString(plaintext));
}
The output is {"data":{"value":300}, "SEQN":700 , "msg":"IT WORKS!!" } - this is the correct output
Why Go has different output?
Check your errors please. ALWAYS
illegal base64 data at input byte 75
https://play.golang.org/p/dRLIT51u4I
More specifically, the value at byte 75 is 5, which is out of the range of characters available to base64. In ascii, it is the ENQ (enquiry) character. As to why this ends up in your final base64 string is beyond me.
EDIT: OK found the issue. For whatever reason, the base64 padding character = at the end is being decrypted as 5 consecutive bytes containing the value 5. Here is a playground link that shows it fixed. https://play.golang.org/p/tf3OZ9XG1M
EDIT: As per matt's comments. I updated the fix function to simply remove all the PKCS7 block padding and use RawStdEncoding for the last base64 decode. This should now be a reasonable fix.

Decrypt passwords from asp.net membership framework in nodejs

I'm trying to decrypt passwords from membership framework in a node.js app.
They are able to be decrypted as I get get the plaintext version from the membership framework User.GetPassword().
I've tried the following, but this doesn't work:
let encryptedPassword = 'LqOz9My...';
let passwordSalt = 'JQ2...';
let validationKey = '0123456789ABCEF';
let decryptionKey = '0123456789ABCEF';
var algorithm = 'aes128';
var decipher = crypto.createDecipher(algorithm, decryptionKey);
var decryptedPassword = decipher.update(encryptedPassword, 'utf8', 'utf8') + decipher.final('utf8');
Here's the solution:
let salt = '<my base64 salt>';
let saltBuffer = Buffer.from(salt, 'base64'); // 16 bytes
let decryptionKey = '<my hex decryption key>';
let decryptionKeyBuffer = Buffer.from(decryptionKey, 'hex'); // 24 bytes
var algorithm = 'aes192';
let encryptedPassword = '<my base64 encoded, encrypted string>';
var decipher = crypto.createDecipheriv(algorithm, decryptionKeyBuffer, saltBuffer);
decipher.setAutoPadding(false);
var dec = decipher.update(encryptedPassword, 'base64', 'utf8');
dec += decipher.final('utf8');
console.log(dec);
The problem was that I was using the wrong encoding and wrong encryption. Here's how I figured it out.
Encryption
You can easily determine the encryption algorithm type via the length of your decryption key. In my case, once I converted the key to a Buffer, the length was 24, and because 24 * 8 = 192, my algo was aes192;
Encoding
In my original example, I had the encoding of the encrypted password as utf8. The encoding actually was base64. Not sure how to determine this other than trying the various accepted params.

Resources