2013-02-11 110 views
1

我面临一个奇怪的问题,我正在使用aes加密cfb模式。这很好,我用固定的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

1)为什么你使用'AnsiString',而不是'byte [0..15] byte''? 2)'随机'糟透了,这对于任何加密使用来说都是不合适的。 3)您应该生成所有可能的字节,而不仅仅是ASCII数字4)您需要使用相同的IV来进行用于加密的解密。将IV添加到密文是标准做法。 – CodesInChaos 2013-02-11 10:48:27

+0

我正在使用AnsiString来存储IV,我无法理解为什么同样的密钥生成随机时不工作,但当相同的密钥硬编码在它的工作字符串。 – Rahul 2013-02-11 11:09:11

+0

我已经检查过IV的值在加密和解密阶段(使用随机生成的代码)和(硬编码的IV值)相同。那么为什么这个问题,我真的很困惑 – Rahul 2013-02-11 12:51:03

回答

0

我使用AnsiString来存储上下文的关键字。这是真正的问题,因为在pascal中AnsiString不是单字节。由于@CodeInChaos专注于AnsiString,我检查并找到它。因此,我不得不更换了

Key: AnsiString 

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

,并成功合作。

谢谢@CodeInChaos。