【问题标题】:Encryption Initialization Vector Failed加密初始化向量失败
【发布时间】:2023-10-05 03:09:01
【问题描述】:

我遇到了一个奇怪的问题,我正在使用 cfb 模式的 aes 加密。进展顺利,我已经用固定 IV 测试了加密。但是当我使用随机 IV 时,问题就出现了。我去详细说一下。

function Random16DigitsString: AnsiString;
var
  i: Integer; c0: byte;
begin
  Randomize;
  c0:=ord('0');
  SetLength(Result, 16);
  Result[1] := char(c0+Random(9)+1);
  for i:=2 to 16 do Result[i] := char(c0+Random(10));
end;   

上述代码的示例输出为 8229343736510872

当我在加密阶段使用此功能时,它可以,但是当我使用相同的密钥解密文件时,输出是垃圾。但是当我在加密阶段硬编码这个密钥时,解密成功。

我错过了什么。我将使用简单的随机数生成器。

【问题讨论】:

  • 1) 你为什么使用AnsiString,而不是array[0..15] of byte? 2) Random 糟透了,它肯定不适合任何加密货币的使用。 3)您应该生成所有可能的字节,而不仅仅是 ASCII 数字 4)您需要使用与加密相同的 IV 进行解密。在密文前加上 IV 是标准做法。
  • 我正在使用 AnsiString 存储 IV,我无法理解为什么随机生成的相同密钥不起作用,但是当相同的密钥被硬编码在字符串中时它起作用了。
  • 我检查了 IV 的值在加密和解密阶段(使用随机生成的代码)和(硬编码的 IV 值)是否相同。那为什么会出现这个问题,我真的很困惑
  • 然后发布足够的代码来重现您的问题。虽然您发布的代码糟糕,但它不对您的直接问题负责。
  • 我删除了c 标签,因为这个问题似乎只与pascal 有关。

标签: encryption aes pascal initialization-vector


【解决方案1】:

我使用 AnsiString 来存储上下文的密钥。这是真正的问题,因为在帕斯卡 AnsiString 不是单字节。当@CodeInChaos 专注于 AnsiString 时,我检查并找到了它。所以我换了

Key: AnsiString  

Key : Array [0..32] of Char;

它成功地工作了。

谢谢@CodeInChaos。

【讨论】: