[英]Rijndael encrypt file in C# and decrypt as string in Delphi
我试图在C#中加密文件,并在delphi中将内容解密为字符串。 我尝试了几种设置,键/块大小和模式。 当前,C#端的代码是:
private void EncryptFile(string inputFile, string keyCode, string outputFile)
{
try {
byte[] key = Encoding.Unicode.GetBytes(keyCode);
byte[] iv = new byte[16];
Array.Copy(key, iv, 16);
FileStream fsCrypt = new FileStream(outputFile, FileMode.Create);
var RMCrypto = new AesManaged();
RMCrypto.KeySize = 256;
RMCrypto.BlockSize = 128;
RMCrypto.Mode = CipherMode.ECB;
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateEncryptor(key, iv),
CryptoStreamMode.Write);
FileStream fsIn = new FileStream(inputFile, FileMode.Open);
int data;
while ((data = fsIn.ReadByte()) != -1)
cs.WriteByte((byte)data);
fsIn.Close();
cs.Close();
fsCrypt.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
关键参数是C#字符串“ 1234567887654321”。 使用DEC库的delphi中的相反部分如下所示:
procedure TForm1.Button1Click(Sender: TObject);
var
RCipher: TCipher_Rijndael;
FileStream: TFileStream;
StringStream: TStringStream;
StringBytes: TBytes;
Key: String;
begin
Key := '1234567887654321';
StringBytes := TEncoding.Unicode.GetBytes(Key);
RCipher := TCipher_Rijndael.Create();
FileStream := TFileStream.Create('C:\path\to\file.txt', fmOpenRead);
StringStream := TStringStream.Create('', TEncoding.ANSI);
RCipher.Init(StringBytes[0], 32, StringBytes[0], 16);
RCipher.Mode := cmECBx;
RCipher.DecodeStream(FileStream, StringStream, FileStream.Size);
Memo1.Text := StringStream.DataString;
RCipher.Free;
FileStream.Free;
StringStream.Free;
end;
但我得到的只是随机字符...问题可能出在哪里? 算法是否彼此不兼容?
编辑:用“随机字符”代替术语“中文字符”,以避免与unicode问题混淆。
多亏了pf1957,该解决方案出乎意料却又简单。 我正在使用Delphi Encryption Compendium库5.1,该库显然不符合AEC。 在我将代码升级到DEC 5.2库之后,所有工作正常。
您正在使用16字节(128位)密钥数据,而将加密器/解密器设置为使用256位密钥。
因此,在您修复了TStringStream的用法( 切勿将其与二进制数据一起使用)之后,请检查两个库的代码或文档以了解对密钥数据进行的处理-最有可能不是直接将其用作密钥,而是用作“密码” '用于密钥派生过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.