1

ワンタイムパッドを使用して簡単なチャットアプリケーションを作成しようとしています。私はすでにアルゴリズムを作成しました。メッセージを暗号化するには、両側で同じであるある種の重要な資料が必要です。キーマテリアルの配布は、物理的な接触(USBドングルなど)で行われることになっています。そこで、2つのクライアントが通信に使用できる非常に大きなランダムキーファイルをいくつか作成したいと思います。だから私の質問は:

  • 非常に安全な乱数/文字列ジェネレーターが必要ですが、C#で使用できる優れたものを知っていますか?
  • そして、このような大きなファイルを使用する場合、キーマテリアルのチャンク(たとえば1 MB)を読み取り、後で読み取るときにファイルから削除する予定なので、ファイル全体をメモリにロードしないようにするにはどうすればよいですか?同じキーが2回使用されることはありません。
4

3 に答える 3

2

私はおそらくこれから始めるべきです:これは楽しみや運動プロジェクトのためであり、本当に安全なものを作成する試みではないと思います。

  1. owlsteadが言うように:RNGCryptoServiceProviderを使用してください
  2. 逆に使用すると、使用済みのキーマテリアルをファイルから削除するのがはるかに簡単になります。1024バイトを暗号化する必要がある場合は、ファイルから最後の1024バイトを読み取り、切り捨てます。簡略化:

 

byte[] Encrypt(byte[] plain){
  using (FileStream keyFile = new FileStream(FileName, FileMode.Open))
  {
    keyFile.Seek(-plain.Length, SeekOrigin.End);
    byte[] key = new byte[plain.Length];
    keyFile.Read(key, 0, plain.Length);    
    byte[] encrypted = new byte[plain.Length];
    for(int i=0;i<plain.Length;i++){
      encrypted[i] = (byte) (plain[i] ^ key[plain.Length - 1 - i]);
    } 
    keyFile.SetLength(keyFile.Length - plain.Length);   
    return encrypted;
  }      
}
于 2012-06-08T09:56:32.610 に答える
0

すでに解決されている問題を解決しようとしています。AESを使用することは、ワンタイムパッドを使用することとほぼ同じくらい安全です。その場合、キーは16バイトになります(ただし、モードに応じてNONCEまたはIVが必要になります)。

  1. 安全な乱数ジェネレーターRNGCryptoServiceProviderを使用する必要があります。
  2. MemoryMappedFileを使用してファイルをメモリに読み込みます。

代わりに、オフセットをファイルに(原子的に)保存するだけです。たとえば、同じファイルの最初の8バイトを使用して、ulongタイプを格納し、必要なときに同期できるようにします。本当に必要な場合は、使用するバイトに加えて、ファイルにゼロを書き込むことができます。たとえばSSDの場合、実際には物理データを上書きできないことに注意してください。

于 2012-06-07T21:15:16.840 に答える
0

あなたがデザインしたものは、ほぼ間違いなくワンタイムパッドではありません。真にランダムなバイトを大量に生成することは、簡単な作業ではありません。あなたが本当にそのルートをたどらなければならないならば、あなたは本当にハードウェアカードに数千ドルを費やしているべきです。暗号品質のC#RNGでさえ、そのような量の真のランダムデータを生成することはできません。短いキーを十分に安全に生成できますが、大量の真のランダムデータを生成するのに十分なエントロピー入力がありません。エントロピーがなくなるとすぐに、その出力は疑似ランダムに戻り、ワンタイムパッドはなくなります。

@owlsteadが言ったように、CBCまたはCTRモードのいずれかでAESを使用します。それは安全で、簡単に入手でき、アマチュアによって設計されたものではありません。

于 2012-06-08T12:46:37.633 に答える