Encryption 加密初始化向量失败

Encryption 加密初始化向量失败,encryption,aes,pascal,initialization-vector,Encryption,Aes,Pascal,Initialization Vector,我面临一个奇怪的问题,我正在使用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:=

我面临一个奇怪的问题,我正在使用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

当我在加密阶段使用这个函数时,它是ok的,但是当我使用相同的密钥解密文件时,输出是垃圾。但当我在加密阶段硬编码这个密钥时,解密就成功了


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

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

Key: AnsiString  

它成功地工作了


谢谢@CodeInChaos.

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