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 のおかげで、ソリューションは予想外でありながらシンプルでした。明らかに AEC に準拠していない Delphi Encryption Compendium ライブラリ 5.1 を使用していました。コードをDEC 5.2ライブラリにアップグレードした後、すべて正常に動作しました。