2016-12-23 12 views
0

私は現在、教師から割り当てられたプロジェクトに取り組んでおり、強力な暗号化を持つアプリケーションを確保する必要があります。以下は私の暗号化方式である:あなたが私のコードから見ることができるように私のコードはAESと同じくらい安全ですか?

private String Encrypt(string text) 
{ 
    RijndaelManaged RijndaelCipher = new RijndaelManaged(); 
    string Password = System.Configuration.ConfigurationManager.AppSettings["Password"]; 
    byte[] PlainText = System.Text.Encoding.Unicode.GetBytes(TextBox1.Text); 
    byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString()); 
    PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt); 
    ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16)); 
    MemoryStream memoryStream = new MemoryStream(); 
    CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write); 
    cryptoStream.Write(PlainText, 0, PlainText.Length); 
    cryptoStream.FlushFinalBlock(); 
    byte[] CipherBytes = memoryStream.ToArray(); 
    memoryStream.Close(); 
    cryptoStream.Close(); 
    string EncryptedData = Convert.ToBase64String(CipherBytes); 

    return EncryptedData; 
} 

は、これは私の復号化方法

public string Decrypt(string encrypted) 
{ 
    RijndaelManaged RijndaelCipher = new RijndaelManaged(); 

    string Password = System.Configuration.ConfigurationManager.AppSettings["Password"]; 
    string DecryptedData; 

    try 
    { 
     byte[] EncryptedData = Convert.FromBase64String(TextBox2.Text); 

     byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString()); 
     PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt); 
     ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16)); 

     MemoryStream memoryStream = new MemoryStream(EncryptedData); 
     CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read); 

     byte[] PlainText = new byte[EncryptedData.Length]; 
     int DecryptedCount = cryptoStream.Read(PlainText, 0, PlainText.Length); 
     memoryStream.Close(); 
     cryptoStream.Close(); 

     DecryptedData = Encoding.Unicode.GetString(PlainText, 0, DecryptedCount); 
    } 
    catch 
    { 
     DecryptedData = TextBox3.Text; 
    } 
    return DecryptedData; 

} 

で、私は、ウェブの設定からパスワードを使用していますが、私は任意のIVを格納しないとキーをデータベースに入力します。だから私の質問は、私が使用する暗号化方法がAESメソッドを使用するのと同じくらい安全であるかどうかです。そうでない場合は、私が参照できる解決策がありますか?私の貧しい英語のスキルに返信して申し訳ありません。いくつかの方法で

+1

の使用をお勧めします(https://msdn.microsoft.com/en-us/library/system.security.cryptography.aesmanaged.aspx) – Martheen

+0

AESはRijndaelのサブセットであるため、多くの目的で同じです。あなたのコードは[暗号化モード](en.wikipedia.org/wiki/Block_cipher_mode_of_operation)を指定していないので、C#のデフォルトモードを使用していると推測します。これは良いことではありません。モードを明示的に指定します。 CBCまたはCTRモードを使用します。 CBCにはIVが必要です(デフォルトでは使用しないでください)。CTRにはノンスが必要です。 – rossum

+0

IVの生成方法は貧弱です。代わりに、16のランダムバイトを生成し(ブロックサイズが128ビットであると仮定して)、出力データの前に付加する必要があります。 –

答えて

1

この悪い:

  • それは認証されていないのです。 AES-GCM、AES-SIVなどの既存の認証アルゴリズムを使用してMACを追加します。
  • 塩は決まってパスワードから得られます。これは全く塩を使用しないのと同じです。各ユーザーは異なる塩を使用する必要があります。
  • IVと同じように、IVのポイントは、固定キーを使用して類似または同一のプレーンテキストを暗号化するたびに、毎回完全に異なる出力を生成することです。あなたのキーが使い捨てである場合(例えば、その派生物が一回使用の塩を含むため)、修正IVが受け入れられます。
  • PasswordDeriveBytesには、PBKDF1と文書化されていないMicrosoft固有の拡張が混在しています。それを使用しないでください。最低でも標準準拠のPBKDF2-HMAC-SHA1であるRfc2898DeriveBytesを使用してください。あまりにも小さすぎるデフォルトの代わりに、約100000回の反復を使用する。

私はあなたがAESをしたい場合は、単に[AES]を使用jbtule's answer to Encrypt and decrypt a string in C#

関連する問題