You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TurboPower Lockbox加密解密密钥失效问题排查求助

TurboPower Lockbox加密解密异常:不同密钥仍能解密且密文固定

我刚开始在Delphi中使用TurboPower Lockbox,找不到相关文档,只能摸索基础用法。我写了两个按钮的代码:一个将明文加密为密文,另一个将密文解密回明文。但出现了奇怪的问题:即使加密和解密用不同的密钥(而且不管密钥/密码是什么,生成的密文始终相同),解密依然能成功。显然我要么错误使用了SetKey方法,要么遗漏了某个步骤。

代码如下:

procedure TMainForm.BtnEncryptClick(Sender: TObject);
begin
  with TLbRijndael.Create(nil) do
  try
    SetKey('Key1');
    EdtEncrypted.Text := EncryptString(EdtPlainText.Text);
  finally
    Free;
  end;
end;

procedure TMainForm.BtnDecryptClick(Sender: TObject);
begin
  with TLbRijndael.Create(nil) do
  try
    SetKey('Key2');
    EdtDecrypted.Text := DecryptString(EdtEncrypted.Text);
  finally
    Free;
  end;
end;

请问这段代码存在什么问题或遗漏了什么步骤?另外,如果能提供TurboPower Lockbox的文档信息将万分感谢!


问题分析与解决方案

1. SetKey方法使用错误

TurboPower Lockbox的SetKey方法要求传入符合算法密钥长度要求的原始字节数组,而非直接传入字符串。直接传字符串时,内部未正确完成密钥推导,实际使用了默认空密钥或固定密钥,这是密文固定、不同密钥能解密的核心原因。

正确做法是使用PasswordToKey方法,将用户密码字符串转换为符合Rijndael算法要求的密钥,再完成密钥设置。

2. 缺少初始化向量(IV)的处理

Rijndael是块加密算法,需要初始化向量(IV)保证相同明文每次加密结果不同,同时提升安全性。Lockbox默认可能使用固定IV,导致密文固定且加密强度降低。加密和解密必须使用相同的IV,因此需将IV与密文一起存储。

修正后的代码示例

procedure TMainForm.BtnEncryptClick(Sender: TObject);
var
  Rijndael: TLbRijndael;
  IV: TBytes;
begin
  Rijndael := TLbRijndael.Create(nil);
  try
    // 将密码转换为符合Rijndael密钥长度要求的密钥
    Rijndael.PasswordToKey('Key1', Rijndael.KeySize);
    // 生成随机初始化向量(IV)
    SetLength(IV, Rijndael.BlockSize div 8);
    Rijndael.RandomIV(IV);
    // 将IV用Base64编码后与密文拼接,方便存储和传输
    EdtEncrypted.Text := EncodeBase64(IV) + ':' + Rijndael.EncryptString(EdtPlainText.Text, IV);
  finally
    Rijndael.Free;
  end;
end;

procedure TMainForm.BtnDecryptClick(Sender: TObject);
var
  Rijndael: TLbRijndael;
  IV: TBytes;
  Parts: TArray<string>;
  CipherText: string;
begin
  Rijndael := TLbRijndael.Create(nil);
  try
    // 拆分存储的IV和密文
    Parts := EdtEncrypted.Text.Split([':']);
    if Length(Parts) <> 2 then Exit;
    
    IV := DecodeBase64(Parts[0]);
    CipherText := Parts[1];
    
    // 用相同密码生成对应密钥
    Rijndael.PasswordToKey('Key2', Rijndael.KeySize);
    // 使用加密时的IV进行解密
    EdtDecrypted.Text := Rijndael.DecryptString(CipherText, IV);
  finally
    Rijndael.Free;
  end;
end;

文档获取说明

TurboPower Lockbox的官方文档可在其开源仓库的Wiki或Docs目录中查找,你可以搜索TurboPower Lockbox的代码仓库获取详细使用说明。


内容的提问来源于stack exchange,提问作者stevenvh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:42:39