我有一個IV(初始化向量)和關鍵,我需要CYPHER一個字符串,這是代碼:密碼Rijndael算法德爾福2010 DCP
function TForm1.CipherAES (key: AnsiString; Vector: AnsiString;
InStream: TMemoryStream) : TMemoryStream;
var
cipher: TDCP_rijndael;
i: integer;
toEnc, toSnd : array of byte;
outStream, AStream :TMemoryStream;
StreamR, Stream2 : AnsiString;
begin
outStream := TMemoryStream.Create;
SetLength(toEnc, InStream.Size);
cipher := TDCP_rijndael.Create(nil);
cipher.Init(key[1], 128, nil);
cipher.SetIV(vector[1]);
cipher.BlockSize := 16;
InStream.Position := 0;
for I := 0 to InStream.Size-1 do
InStream.Read(ToEnc[i], 1);
for I := 0 to inStream.size-1 do
StreamR := StreamR + ByteToHex(toEnc[i]) + ' ';
Memo1.Lines.Add(StreamR);
inStream.Position := 0;
cipher.CipherMode := cmCBC;
cipher.EncryptStream(inStream, outStream, InStream.Size);
Base64Encode(outStream.Memory, @StreamR[1], outStream.Size);
Stream2 := Copy(StreamR, 1, outStream.Size + 8);
Memo1.Lines.Add(Stream2);
Memo1.Lines.Add(StreamR);
outStream.Position := 0;
SetLength(toSnd, outStream.Size);
for I := 0 to outStream.Size-1 do
outStream.Read(toSnd[i], 1);
StreamR := '';
for I := 0 to outStream.size-1 do
StreamR := StreamR + ByteToHex(toSnd[i]) + ' ';
Memo1.Lines.Add(StreamR);
cipher.burn;
cipher.free;
Result := outStream;
end;
當我通過流爲base64給我的下一個答案:
ub/JkCsCZwbAnyqjo+miIw==
,但它應該是:
ub/JkCsCZwbAnyqjo+miI2XNZwNrJo31YBNTwQuHkq0=
有人能幫助我嗎?爲什麼會發生這樣的事情?
在此先感謝 Vauli
感謝您的回答,其值如下: – vauli 2012-08-13 15:22:50
ok大小inStream是16字節,表示我的密碼運行良好,我必須通過32個字節來獲得我需要的32個字節。另一方面,我會根據你的建議使用base64encode的輸出,Stream2部分只是顯示編碼的結果(這很愚蠢,我知道),我會嘗試填充數組,我會告訴你一切是否順利。謝謝..!!! – vauli 2012-08-13 15:50:28
他們告訴我,32個Byets是從PKCS7填充 – vauli 2012-08-13 16:23:06