Delphi上的Rijnadel C#加密算法
没有在delphi上用C#移动rijnadael加密算法Delphi上的Rijnadel C#加密算法,delphi,Delphi,没有在delphi上用C#移动rijnadael加密算法 Rijndael aes; byte[] retVal = null; byte[] contentBytes; byte[] passwordBytes; byte[] ivBytes; string content = "3wAHQZwW7y115QvI0PuSltzBgNmhPvkk0Cw1zKUTX9kEs18rnwKzXBIadf4vTMyCFGolYRpu9vlwyUHuGfMe7eAhULgEBjb9Yoawl3dgYQo
Rijndael aes;
byte[] retVal = null;
byte[] contentBytes;
byte[] passwordBytes;
byte[] ivBytes;
string content = "3wAHQZwW7y115QvI0PuSltzBgNmhPvkk0Cw1zKUTX9kEs18rnwKzXBIadf4vTMyCFGolYRpu9vlwyUHuGfMe7eAhULgEBjb9Yoawl3dgYQo=";
string password="GAT";
contentBytes = Convert.FromBase64String(content);
passwordBytes = new byte[32];
ivBytes = new byte[16];
Array.Copy(Encoding.Unicode.GetBytes(password), passwordBytes, Encoding.Unicode.GetBytes(password).Length);
Array.Copy(passwordBytes, ivBytes, 16);
using (aes = Rijndael.Create())
{
aes.Key = passwordBytes;
aes.IV = ivBytes;
aes.Padding = PaddingMode.PKCS7;
retVal = aes.CreateDecryptor().TransformFinalBlock(contentBytes, 0, contentBytes.Length);
}
在Delphi上使用DCP组件,没有取得特别的成功。
Delphi XE5:
procedure TForm1.Button1Click(Sender: TObject);
var
din, dout: AnsiString;
Vector: array of byte;
Cipher : TDCP_rijndael;
aKey:AnsiString;
begin
SetLength(Vector, 16);
aKey:='GAT';
din:='3wAHQZwW7y115QvI0PuSltzBgNmhPvkk0Cw1zKUTX9kEs18rnwKzXBIadf4vTMyCFGolYRpu9vlwyUHuGfMe7eAhULgEBjb9Yoawl3dgYQo=';
Cipher := TDCP_rijndael.Create(nil);
try
Cipher.Init(aKey, Length(aKey)*8, Vector);
Cipher.CipherMode := cmCBC;
dout := Cipher.DecryptString(din);
finally
Cipher.Burn;
Cipher.Free;
end;
showmessage(dout);
end;
分配一个向量?我认为Init和DecryptString方法使用数组作为参数,但您使用的是字符串,在Delphi中基本上也是数组,但是是特殊的数组。您必须指向正确的第一项,它是1,而不是C中的0。 当然,您还可以首先转换字节数组中的ansistring并将其提供给方法
.Init(aKey[1], ....)
及
hth除了Delphi代码之外,对于显示问题的两种语言,可以运行的完整测试程序如何?那么,您希望该代码做什么?它实际上做什么?我想知道是什么让你用字符串来保存二进制数据。字符串用于文本。这是我在这里看到的最常见的一个错误。这似乎在Delphi标签中非常常见。这一失败并不奇怪:C代码似乎使用256位键(32字节),IV使用键的前16个字节,PKCS 7填充,但没有(明显的)CBC模式。您的Delphi甚至没有提到256位键(您使用的是3*8=24位??),没有填充,没有IV,但它需要CBC模式(并且没有从Base64重新转换)。
.Decrypt(din[1])