(我试着在密码栈Exchange上问这个问题,他们觉得这样做不合适。)
我正在尝试复制用C#中的Delphi编写的算法,最好使用标准的.NET库。据推测,Delphi算法通过了标准的参考测试。它应该是AES/CBC;但是,我无法用System.Security.Cryptography.AesManaged复制结果。
使用简单输入调用它的示例:
function StringToHex(S: string): string;
var
i: integer;
begin
Result := '';
for i := 1 to Length(S) do
Result := Result + IntToHex(Ord(S[i]), 2);
end;
var
PlainText: AnsiString;
AES: TAES;
Key: TAESKey256; // array[0..31] of byte;
InitialVector: TAESBuffer; // array[0..15] of byte;
InputStream: TStringStream;
OutputStream: TStringStream;
begin
PlainText := 'test';
FillChar(Key, SizeOf(Key), 1);
FillChar(InitialVector, SizeOf(InitialVector), 2);
AES := TAES.Create;
InputStream := TStringStream.Create(PlainText);
OutputStream := TStringStream.Create('');
try
AES.EncryptAESStreamCBC(InputStream, 0, Key, InitialVector, OutputStream);
Writeln(StringToHex(OutputStream.DataString));
Readln;
finally
InputStream.Free;
OutputStream.Free;
AES.Free;
end;
end.输出:
CEE3684F05D02E5A0930CED21F76075A代码似乎是基于Delphi Spring框架的。
我如何在.NET中复制这个?
我尝试过的(甚至切换到字节以避免任何Unicode问题):
public byte[] Encrypt()
{
using (var algorithm = new AesManaged())
{
// Default is CBC
algorithm.Key = Enumerable.Repeat((byte)0x01, 32).ToArray();
algorithm.IV = Enumerable.Repeat((byte)0x02, 16).ToArray();
using (ICryptoTransform encryptor = algorithm.CreateEncryptor(algorithm.Key, algorithm.IV))
{
using (var stream = new MemoryStream())
{
using (var cryptoStream = new CryptoStream(stream, encryptor, CryptoStreamMode.Write))
{
using (var writer = new BinaryWriter(cryptoStream))
{
writer.Write(new byte[] {0x74, 0x65, 0x73, 0x74});
}
return stream.ToArray();
}
}
}
}
}但是,这会导致不同的输出(第一个字节是x6D)。
发布于 2014-05-27 08:56:37
在其他任务中,提到了c#的默认设置:
BlockSize = 128;
Mode = System.Security.Cryptography.CipherMode.CBC;
Padding = System.Security.Cryptography.PaddingMode.PKCS7在Delphi中,我看不到任何更改PaddingMode的选项,我猜它是带有零的padds。如果是正确的,那么您应该将C#中的填充切换到
System.Security.Cryptography.PaddingMode.Zeros(对不起,不能检查,这只是假设)。
更新:正如顺理成章提到的那样,它有效,只需添加一行:
algorithm.Padding = PaddingMode.Zeros;发布于 2014-05-21 16:21:54
如果您想通过Delphi中的Spring框架使用这个工具,我的建议是使用Delphi创建一个Win32库DLL,并在您的.NET应用程序中使用该DLL。这听起来比用C#重写代码更符合逻辑(重新发明轮子?)。
发布于 2014-05-21 17:19:20
您确定TStringStream将AnsiString‘测试’返回到精确的4个字节吗?多字节编码和/或零终止将导致另一个比在C#代码中使用的纯文本字节数组。
https://stackoverflow.com/questions/23788606
复制相似问题