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

使用LockBox3时TSimpleCodec.Begin_EncryptMemory报"Wrong mode"错误

错误原因分析

  1. 变量问题:Encrypt_Data函数中Encrypted变量未声明,会导致编译错误;Decrypt_Data函数中错误地将未赋值的Encrypted赋值给Result,直接丢失解密结果。
  2. 密钥未初始化:设置Password后未调用PrepareKey生成有效密钥,这是触发TSimpleCodec.Begin_EncryptMemory - Wrong mode错误的核心原因。
  3. 对象创建顺序: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:52:46