I am using SerureBlackBox and I need to decode text. In the function below, when I do:
Crypto.Decrypt(@fDataBytes[0], Length(fDataBytes), @fDecryptedData[0], OutSize);
it throws an error:
Invalid key material
The key is defined as follows:
EncodeData := 'MnM1djh5L0I/RShIK01iUWVUaFdtWnEzdDZ3OXokQyY=';
function DecryptAES256GCM(aData, aSal, aKey: String): string;
function Base64UrlDecode(Input: string): TBytes;
begin
Result := TNetEncoding.Base64.DecodeStringToBytes(
StringReplace(
StringReplace(Input, '-', '+', [rfReplaceAll]),
'_', '/', [rfReplaceAll]
)
);
end;
var
Crypto : TElSymmetricCrypto;
KeyMaterial : TElSymmetricKeyMaterial;
Factory : TElSymmetricCryptoFactory;
fIV, fKey, fDataBin, fDataBytes, fDecryptedData : TBytes;
OutSize : integer;
Data: RawByteString;
KeyBinary, IVBinary : ByteArray;
begin
//Definice
result := '';
//Převedení vstupních dat
fDataBin := Base64UrlDecode(aData);
fIV := Base64UrlDecode(aSal);
fKey := Base64UrlDecode(aKey);
//Přehodit IV - Salt
SetLength(IVBinary, Length(fIV) * SizeOf(Char));
Move(Pointer(fIV)^, IVBinary[0], Length(IVBinary));
//Přehodit Key
SetLength(KeyBinary, Length(fKey) * SizeOf(Char));
Move(Pointer(fKey)^, KeyBinary[0], Length(KeyBinary));
//Přehodit data
SetLength(fDataBytes, Length(fDataBin));
Move(fDataBin[0], fDataBytes[0], Length(fDataBytes));
// Inicializace objektů SecureBlackBox
Factory := TElSymmetricCryptoFactory.Create;
Crypto := Factory.CreateInstance(SB_ALGORITHM_CNT_AES256, cmGCM); // <-- Error
try
KeyMaterial := TElSymmetricKeyMaterial.Create;
KeyMaterial.Key := KeyBinary;
KeyMaterial.IV := IVBinary;
Crypto.Padding := cpNone;
Crypto.KeyMaterial := KeyMaterial;
try
//Dešifrování -- délka
OutSize := 0;
Crypto.Decrypt(@fDataBytes[0], Length(fDataBytes), nil, OutSize);
if OutSize < 0 then
raise Exception.Create('Failed to decrypt data');
//Komplet
SetLength(fDecryptedData, OutSize);
Crypto.Decrypt(@fDataBytes[0], Length(fDataBytes), @fDecryptedData[0], OutSize);
if OutSize < 0 then
raise Exception.Create('Failed to decrypt data');
SetLength(fDecryptedData, OutSize);
// Výstup do řetězce
result := TEncoding.UTF8.GetString(fDecryptedData);
except
on E: Exception do
ShowMessage(E.Message);
end;
finally
Factory.Free;
Crypto.Free;
KeyMaterial.Free;
end;
end;
The documentation and examples for SecureBlackBox aren't very helpful, so I'm trying to see if anyone has come across this.