delphi 通过CnAes.pas调用的AES解码方法
CBC 流解密
procedure DecryptAESStreamCBC(Source: TStream; Count: Cardinal;
const Key: TAESKey128; const InitVector: TAESBuffer; Dest: TStream); overload;
密文:ZCeSw78CTOPvCZ4bIFd5UOTfHdrCBJNC5h6+/MIHMKcBrT02j1XQrUkDPa8EelQ/
主密钥master_key:0123456789ABCDEF
偏移量: 85A8D4B2854165A1
用CnAes中的方法总会在后面报错地址访问的错误,原码被我更改的不像样了,就不贴了,求大佬推荐个好用Aes解码的方法或者CnAes解码的演示例子
补充下我的代码吧:
procedure TForm1.btn1Click(Sender: TObject);
var
vStr, vData,vKey, vOffset : string;
SS, DS: TMemoryStream;
AESKey128 : TAESKey128;
pFusion : TAESBuffer;
I : integer;
p: PAnsiChar;
tls:TStringList;
begin
vOffset := '85A8D4B2854165A1';
CopyMemory(@pFusion[0], @vStr[1], length(vStr));
vKey := '0123456789ABCDEF';
vData := 'ZCeSw78CTOPvCZ4bIFd5UOTfHdrCBJNC5h6+/MIHMKcBrT02j1XQrUkDPa8EelQ/';
SS := TMemoryStream.Create();
SS.Write(PAnsiChar(@vData[1])^, Length(vData));
SS.Position := 0;
DS := TMemoryStream.Create();
FillChar(AESKey128, SizeOf(AESKey128), 0 );
Move(PChar(vKey)^, AESKey128, Min(SizeOf(AESKey128), Length(vKey)));
FillChar(pFusion, SizeOf(pFusion), 0 );
Move(PAnsiChar(vOffset)^, pFusion, Min(SizeOf(pFusion), Length(vOffset)));
//DecryptAESStreamCBC是CnAes中的方法
DecryptAESStreamCBC(SS, SS.Size - SS.Position, AESKey128, pFusion, DS);
SetLength(vStr, DS.Size);
Move(PAnsiChar(DS.Memory)^, vStr[1], DS.Size);
vStr := UTF8Decode(vStr);
showmessage(vStr);
end;
https://www.cnblogs.com/china1/archive/2013/10/31/3400020.html
希望我的回答对你有帮助。
请给个采纳谢谢啦
有什么其他问题可以在我回答下面问,随时为你解答。
CBC的解密则也是从左往右看,但是加密时IV在解密时候,只会用于对第一个块进行解密,其他块的解密则是使用上一块的加密二进制作为IV进行解密操作。
加密时,用iv和key去加密第一个块,然后用第一个块的加密数据作为下一个块的iv,依次迭代。解密时,用n-1个块的加密数据作为iv和key去解密第n个块(n>1),只有第一个块才会用加密时的iv去解密第一个块。按照这样的逻辑来看,那么如果解密时,使用了iv错误,出问题的数据应该只有第一个块。
通过上面的分析就能知道,加密的时候,iv会影响所有数据的加密结果,而解密时,iv只会影响第一个加密块的解密结果,其他块的解密可以直接通过分隔加密数据获取正确是N-1块的IV。
在使用了key的情况下,IV对整个数据的保密性没有太大的作用。