最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

delphi - SecureBlackBox: decode AES-256 data - Stack Overflow

programmeradmin1浏览0评论

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.

发布评论

评论列表(0)

  1. 暂无评论