2016-08-27 29 views
1

私はyoutube.Itのビデオを見た後、C#でRijndaelを使って暗号化プログラムを作った。これはとても簡単です。Rijndael暗号化で16文字以上の単語を解読する方法

Interface picture 64ビットと128ビットのキーを入力できます。 192ビットのキーは使用できません(なぜ?)。

もし私が単語を暗号化してそれを解読しようとすると、それは文字の数が< = 16であることを解読するだけです。文字の数が16を超えると、 "Padding is無効であり、削除できません "。

128ビットのキーでも同じです。文字数が< = 32の単語のみが復号化されます。それ以外の場合は、同じエラーメッセージが表示されます。

ここで質問

Problem Summery picture のクリアな視界を取るために夏はここで暗号化

// need using System.Security.Cryptography; 
// using System.IO; 
public Form1() 
{ 
    InitializeComponent(); 
    desObj = Rijndael.Create(); 
} 

string cipherData; 
byte[] chipherbytes; 
byte[] plainbyte; 
byte[] plainbyte2; 
byte[] plainkey;     

SymmetricAlgorithm desObj; 

private void button2_Click(object sender, EventArgs e) 
{ 

    try 
    { 

     cipherData = textBox1.Text; 
     plainbyte = Encoding.ASCII.GetBytes(cipherData); 
     plainkey = Encoding.ASCII.GetBytes(textBox4.Text); 
     desObj.Key = plainkey; 
     //choose any method 
     desObj.Mode = CipherMode.CBC; 
     desObj.Padding = PaddingMode.PKCS7; 
     MemoryStream ms = new MemoryStream(); 
     CryptoStream cs = new CryptoStream(ms, desObj.CreateEncryptor(), CryptoStreamMode.Write); 
     cs.Write(plainbyte, 0, plainbyte.Length); 
     cs.Close(); 
     chipherbytes = ms.ToArray(); 
     ms.Close(); 
     textBox2.Text = Encoding.ASCII.GetString(chipherbytes); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

とdecyptionコードのコードが

private void button3_Click(object sender, EventArgs e) 
{ 
    try 
    { 

     MemoryStream ms1 = new MemoryStream(chipherbytes); 
     CryptoStream cs1 = new CryptoStream(ms1, desObj.CreateDecryptor(), CryptoStreamMode.Read); 
     cs1.Read(chipherbytes, 0, chipherbytes.Length); 
     plainbyte2 = ms1.ToArray(); 
     cs1.Close(); 
     ms1.Close(); 
     textBox3.Text = Encoding.ASCII.GetString(plainbyte2);  

    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

答えて

0

暗号文は、任意のバイトで構成されていますです有効なASCIIエンコーディングを構成する必要はありません。印刷できないASCII文字がある場合は、このように使用すると印刷されません:Encoding.ASCII.GetString(chipherbytes)

符号化された暗号文を大きくするが、印刷文字列として完全に表現できるBase64やHexなどで暗号文を暗号化する必要があります。


その他の考慮事項:

  • CBCモードは、初期化ベクトル(IV)を必要とし、あなたがどんなIVを設定していないことから、それはあなたのために生成されます。問題は、復号化中に同じIVが必要なことです。このコードは暗号化と復号化に同じdesObjを使用しており、同じIVを含んでいるため動作しますが、暗号文のコピーを開始するときには機能しません。
    IVは秘密ではありません。一般的な方法は、暗号文の前にIVを書き、解読の前にそれをスライスすることによって暗号文と一緒に渡すことです。

  • あなたは完全性チェックを行っていません。 padding oracle attackのような攻撃は不可能になるように暗号文を認証し、暗号文が不正に改ざんされたのか、誤って入力されたのかを検出することができます。これは、GCMやEAXなどの認証モード、またはencrypt-then-MACスキームで行うことができます。

  • Rijndaelは、128,192,256ビットのキーサイズをサポートしています。通常、バイトは8ビットであるため、16,24,32バイトのキーになります。

  • 通常、ランダムノイズや特定の長さと区別できないようにする必要があるため、キーはユーザーによって入力されません。ユーザーがパスワードを入力し、高い反復カウント/コスト係数を使用してPBKDF2、bcrypt、scrypt、またはArgon2のようなものを使用して鍵を派生させる方が良いです。

+0

エラーが発生した箇所を修正することはできますか?それは大きな助けになるでしょう! –

+0

なぜですか? 'Convert.ToBase64String'と' Convert.FromBase64String'を使うのに問題がありますか?それはあまりにも多くの作業になるので、私は他の問題であなたを助けることはできません。これらの問題をすべて解決して安全な、[RNCryptor](https://github.com/RNCryptor/RNCryptor-cs)を使ってみませんか? –

+0

私はyoutubeからこれをコピーしました!私はまだ暗号については全く知らない。それが理由です。しかし私は私のプロジェクトの一つのために正しく動作するためにこのコードを必要とします! :) –

関連する問題