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
相关产品推荐
相关产品推荐

