2011-04-26 145 views
1

我使用DCPcrypt庫找到hereRijndael加密

這裏是一個小碼加密字符串

InitializationVector: AnsiString; 
const Key: Ansistring = 'keykeykeykey'; 
// Encrypt a string and return the Base64 encoded result 
function Encrypt(DataToEncrypt: ansistring):ansistring; 
var 
    Cipher : TDCP_rijndael; 
    Data: string; 
    IV: array[0..15] of byte;  // the initialization vector 
    i:Integer; 
begin 
    // Pad Key, IV and Data with zeros as appropriate 
    FillChar(IV,Sizeof(IV),0);   // make the IV all zeros 

    Data := PadWithZeros(DataToEncrypt,BlockSize); 

    for i := 0 to (Length(IV) - 1) do //just random values for the IV 
    IV[i] := Random(256); 

    Cipher := TDCP_rijndael.Create(nil); 

    if Length(Key) <= 16 then 
    Cipher.Init(Key[1],128,@IV[1]) 
    else if Length(Key) <= 24 then 
    Cipher.Init(Key[1],192,@IV[1]) 
    else 
    Cipher.Init(Key[1],256,@IV[1]); 
    // Encrypt the data 
    Cipher.EncryptCBC(Data[1],Data[1],Length(Data)); 
    // Free the cipher and clear sensitive information 
    Cipher.Free; 

    SetString(InitializationVector,PAnsiChar(@IV[1]),Length(IV)); 
    InitializationVector := Base64EncodeStr(InitializationVector); 

    //Base64 encoded result 
    Result := Base64EncodeStr(Data); 
end; 

我可以解密得到的字符串,但只有它的一半。發現了一個類似的帖子,但他在用我正在做的base64編碼密碼時找到了答案。 Here

任何幫助表示讚賞!

+2

德爾福版本?你在混合字符串和ansistrings。 – kludg 2011-04-26 17:01:28

回答

4

默認情況下,Delphi 2009/2010和XE中的字符串是Unicode字符串。
這意味着單個字符可以佔用1或更多字節
您在代碼中放入了舊的AnsiString,但忘記了一個。

這意味着Unicode的翻譯會搞亂你的解密,因爲使用加密技術,即使是一個單個的改變位也會弄亂一切。

始終堅持使用AnsiStrings,你應該沒問題。

變化:

function Encrypt(DataToEncrypt: ansistring):ansistring; 
var 
    Cipher : TDCP_rijndael; 
    Data: string; 
    IV: array[0..15] of byte;  // the initialization vector 
    i:Integer; 
begin 

// Encrypt a string and return the Base64 encoded result 
function Encrypt(DataToEncrypt: AnsiString): AnsiString; 
var 
    Cipher: TDCP_rijndael; 
    //Data: string; <<- change to ansistring 
    Data: AnsiString; 
    IV: array[0..15] of byte;  // the initialization vector 
    i: Integer; 
+0

Johan告訴你的是,你的新應用程序代碼沒有正確處理Delphi中的字符串是Unicode字符串的事實,而當你試圖使用字節大小的字符串時,有時需要字符類型AnsiString,比如上面的。 – 2011-04-26 21:08:00

+0

@Warren,更新了包含您的評論的答案。 – Johan 2011-04-26 21:56:06