使用LockBox3时TSimpleCodec.Begin_EncryptMemory报"Wrong mode"错误
错误原因分析
- 变量问题:
Encrypt_Data函数中Encrypted变量未声明,会导致编译错误;Decrypt_Data函数中错误地将未赋值的Encrypted赋值给Result,直接丢失解密结果。 - 密钥未初始化:设置
Password后未调用PrepareKey生成有效密钥,这是触发TSimpleCodec.Begin_EncryptMemory - Wrong mode错误的核心原因。 - 对象创建顺序:
Decrypt_Data中先创建Codec再创建加密库实例,逻辑上不合理,建议调整顺序。
修复后的代码
function TfrmEncryptix.Encrypt_Data(const Text, Key: string): string; var Codec: TCodec; Lib: TCryptographicLibrary; Encrypted: string; // 补充声明变量 begin Lib := TCryptographicLibrary.Create(nil); Codec := TCodec.Create(nil); try Codec.CryptoLibrary := Lib; Codec.StreamCipherId := ''; Codec.BlockCipherId := 'AES'; Codec.ChainModeId := 'ECB'; Codec.Password := Key; Codec.Encoding := TEncoding.UTF8; Codec.PrepareKey; // 生成有效密钥 Codec.EncryptString(Text, Encrypted, TEncoding.UTF8); Result := Encrypted; finally Codec.Free; Lib.Free; end; end; function TfrmEncryptix.Decrypt_Data(const Text, Key: string): string; var Codec: TCodec; Lib: TCryptographicLibrary; begin Lib := TCryptographicLibrary.Create(nil); // 先创建加密库实例 Codec := TCodec.Create(nil); try Codec.CryptoLibrary := Lib; Codec.StreamCipherId := ''; Codec.BlockCipherId := 'AES'; Codec.ChainModeId := 'ECB'; Codec.Password := Key; Codec.Encoding := TEncoding.UTF8; Codec.PrepareKey; // 生成有效密钥 Codec.DecryptString(Result, Text, TEncoding.UTF8); // 移除错误的Result := Encrypted;语句 finally Codec.Free; Lib.Free; end; end;
额外建议
- 替换ECB模式:ECB模式安全性极低,相同明文块会生成相同密文块,建议改用CBC模式。使用CBC时需设置随机初始化向量(IV),加密时需将IV与密文一同存储,解密时复用该IV。
- 规范密钥长度:确保密钥符合AES标准长度(128/192/256位),若使用密码衍生密钥,建议使用强密码以避免弱密钥风险。
内容的提问来源于stack exchange,提问作者Shadow_K101
相关产品推荐
相关产品推荐

