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メソッドを使用するのと同じくらい安全であるかどうかです。そうでない場合は、私が参照できる解決策がありますか?私の貧しい英語のスキルに返信して申し訳ありません。いくつかの方法で
の使用をお勧めします(https://msdn.microsoft.com/en-us/library/system.security.cryptography.aesmanaged.aspx) – Martheen
AESはRijndaelのサブセットであるため、多くの目的で同じです。あなたのコードは[暗号化モード](en.wikipedia.org/wiki/Block_cipher_mode_of_operation)を指定していないので、C#のデフォルトモードを使用していると推測します。これは良いことではありません。モードを明示的に指定します。 CBCまたはCTRモードを使用します。 CBCにはIVが必要です(デフォルトでは使用しないでください)。CTRにはノンスが必要です。 – rossum
IVの生成方法は貧弱です。代わりに、16のランダムバイトを生成し(ブロックサイズが128ビットであると仮定して)、出力データの前に付加する必要があります。 –