2013-02-11 111 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。