Шифрование Rijndael.Первые персонажи странные - PullRequest
0 голосов
/ 28 апреля 2011

Код, который я использую (XE):

// Encrypt a string and return the Base64 encoded result
function Encrypt(DataToEncrypt: ansistring):ansistring;
const Key: Ansistring = 'keykey';
  KeySize = 32; // 32 bytes = 256 bits
  BlockSize = 16; // 16 bytes = 128 bits
var
  Cipher : TDCP_rijndael;
  Data: ansistring;
  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));  //Save IV
  InitializationVector := Base64EncodeStr(InitializationVector);

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

function Decrypt(IV,Cryptogram:ansistring):ansistring;
const Key: Ansistring = 'keykey';
  KeySize = 32; // 32 bytes = 256 bits
  BlockSize = 16; // 16 bytes = 128 bits
var
  Cipher : TDCP_rijndael;
begin
  if IV='' then
    IV := InitializationVector;

  Cryptogram := Base64DecodeStr(cryptogram);
  // Create the cipher and initialise according to the key length
  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]);
  // Decrypt the data
  Cipher.DecryptCBC(cryptogram[1],cryptogram[1],Length(cryptogram));
  // Free the cipher and clear sensitive information
  Cipher.Free;
  // Display the result
  Result := cryptogram;
end;

Это работает довольно хорошо, за исключением случаев, когда я пытаюсь расшифровать строку, я получаю:

$ C # $ C'Ç'# $ B'ÛW' # $ 1F'Ø ‹™ Ç '# $ 8D'Ž' # $ 8D '!' Mydata

, поэтому первые несколько букв получают очень странные символы.остальное расшифровывается просто отлично!Нашел похожую проблему здесь , но решения не найдено.Заранее спасибо!

1 Ответ

5 голосов
/ 28 апреля 2011

Первое, что выделяется для меня, это то, что вы читаете / пишете после конца IV. Вы объявляете его как [0..15], но получаете доступ ко всему, начиная с элемента 1 (!), Как в Cipher.Init, так и в SetString.

...