2017-11-26 3 views
0

Simple Substitution Cypherを実装するアプリケーションを開発しています。今やスピードの理由から(それが条件の1つであったため)、暗号化と復号化にBitArrayを使用する必要があります。ユーザーは "コード化された"アルファベットを入力し、何らかの方法でマップする必要があるので、ユーザーがデータにアクセスするときにハッシュテーブルを使用し、O(1)の複雑さがあるため、Dictionaryを選択しました。しかし、今私は自分自身がどのように思っていた私が持っているとき、私はこれを行うことができ、このように初期化されたアルファベット「コード化」:これは私が私の目標を達成するためにループの2を使用するだろうDictionaryを使用してBitArrayにバイトをマップする

BitArray codedAlphabet = new BitArray(bytes); 

を。誰か別のアイデアを持っていますか?うまくいけば、あなたは私が達成しようとしていることを理解しています。前もって感謝します。

コード:

namespace Harpokrat.EncryptionAlgorithms 
{ 
// Simple substitution cypher algorithm 
    public class SimpleSubstitutionStrategy : IEncryptionStrategy 
    { 
     private string alphabet; // message to be encrypted 
     private string coded;  // this will be the key (input from file or from UI) 

     private ArrayList AlphabetBackUp = new ArrayList(); 
     private ArrayList CodedBackUp = new ArrayList(); 

     #region Properties 
     public string Alphabet 
     { 
      get 
      { 
       return this.alphabet; 
      } 
      set 
      { 
       this.alphabet = value; 
       foreach (char c in this.alphabet.ToCharArray()) 
       { 
        this.AlphabetBackUp.Add(c); 
       } 
      } 
     } 

     public string Coded 
     { 
      get 
      { 
       return this.coded; 
      } 

      set 
      { 
       this.coded = "yqmnnsgwatkgetwtawuiqwemsg"; //for testing purposes 
       foreach (char c in this.coded.ToCharArray()) 
      { 
       this.CodedBackUp.Add(c); 
      } 
     } 
    } 

    #endregion 

    public string Decrypt(string message) 
    { 
     message = message.ToLower(); 
     string result = ""; 
     for (int i = 0; i < message.Length; i++) 
     { 
      int indexOfSourceChar = CodedBackUp.IndexOf(message[i]); 
      if (indexOfSourceChar < 0 || (indexOfSourceChar > alphabet.Length - 1)) 
      { 
       result += "#"; 
      } 
      else 
      { 
       result += alphabet[indexOfSourceChar].ToString(); 
      } 
     } 
     return result; 
    } 

    public string Encrypt(string message) 
    { 
     message = message.ToLower(); 
     string result = ""; 
     for(int i = 0; i < message.Length; i++) 
     { 
      int indexOfSourceChar = AlphabetBackUp.IndexOf(message[i]); 
      if (indexOfSourceChar < 0 || (indexOfSourceChar > coded.Length - 1)) 
      { 
       result += "#"; 
      } 
      else 
      { 
       result += coded[indexOfSourceChar].ToString(); 
      } 
     } 

     return result; 
    } 
} 
} 
+0

代替チップが必要な場合は、なぜBitArrayを使用しますか?それは1文字のレベルで動作するので、少なくともバイトレベルで動作します。実際にどのように暗号化しているかのコードを入力してください。 – Evk

+0

現在、私はバイトレベルで暗号化しています。私は規則的な "コード化された"アルファベットの配列リストを持っているので、さらに最適化したかったのです。編集した質問のコードを見つけてください。 – nikjov92

+2

'Dictionary 'を使うのは正しい方法ですが、' BitArray'を使う必要はありません。なぜなら、あなたはシングルビットのレベルで操作する必要がないからです。それを使用すると、コードを複雑にするだけで利益が得られません。 – Evk

答えて

0

私は内部的に使用すると、暗号化と復号化を行う必要があるだろう2つの辞書を構築することを、同時にalphabetcodedを設定するための単一の方法をお勧めします、とヘルパーメソッドと思いますget-or-return-default(あなたのケースでは「#」)を実行します。 これは、渡された辞書に応じて暗号化または復号化を行う単一の関数を実装することができます(LINQを使いたい場合は、1行のコードで実装できます)。

関連する問題