2011-04-26 91 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