1

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ライブラリにアップグレードした後、すべて正常に動作しました。

4

1 に答える 1

-1

16 バイト (128 ビット) のキー データを使用していますが、256 ビットのキーを使用するように暗号化/復号化を設定しています。

したがって、TStringStream の使用法を修正した後 (バイナリ データでは使用しないでください)、両方のライブラリのコードまたはドキュメントをチェックして、キー データで何が行われるかを確認してください。ほとんどの場合、キーとして直接使用されるのではなく、「パスワード」として使用されます。 ' キー導出プロセス用。

于 2013-03-28T09:09:26.033 に答える