2011-01-30 8 views
1

プログラムは、ブレークポイントを設定してステップオーバーしない限り、「テスト」をプリントアウトしません。私は何が起こっているのか分からない。助けをお待ちしています。Console.WriteLineは、多数のバイナリ・ゼロの後に行を表示しません

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     string testKey = "lkirwf897+22#bbtrm8814z5qq=498j5"; 
     string testIv = "741952hheeyy66#[email protected]"; 
     string testValue = "random"; 

     string encryptedText = EncryptRJ256(testKey, testIv, testValue); 
     string decryptedText = DecryptRJ256(testKey, testIv, encryptedText); 

     Console.WriteLine("encrypted: " + encryptedText); 
     Console.WriteLine("decrypted: " + decryptedText); 
     Console.WriteLine("test"); 
    } 

    public static string DecryptRJ256(string key, string iv, string text) 
    { 

     string sEncryptedString = text; 

     RijndaelManaged myRijndael = new RijndaelManaged(); 
     myRijndael.Padding = PaddingMode.Zeros; 
     myRijndael.Mode = CipherMode.CBC; 
     myRijndael.KeySize = 256; 
     myRijndael.BlockSize = 256; 

     byte[] keyByte = System.Text.Encoding.ASCII.GetBytes(key); 
     byte[] IVByte = System.Text.Encoding.ASCII.GetBytes(iv); 

     ICryptoTransform decryptor = myRijndael.CreateDecryptor(keyByte, IVByte); 

     byte[] sEncrypted = Convert.FromBase64String(sEncryptedString); 

     byte[] fromEncrypt = new byte[sEncrypted.Length + 1]; 

     MemoryStream msDecrypt = new MemoryStream(sEncrypted); 
     CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read); 

     csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length); 

     return Encoding.ASCII.GetString(fromEncrypt); 

    } 


    public static string EncryptRJ256(string key, string iv, string text) 
    { 

     string sToEncrypt = text; 

     RijndaelManaged myRijndael = new RijndaelManaged(); 
     myRijndael.Padding = PaddingMode.Zeros; 
     myRijndael.Mode = CipherMode.CBC; 
     myRijndael.KeySize = 256; 
     myRijndael.BlockSize = 256; 


     byte[] keyByte = Encoding.ASCII.GetBytes(key); 
     byte[] IVByte = Encoding.ASCII.GetBytes(iv); 

     ICryptoTransform encryptor = myRijndael.CreateEncryptor(keyByte, IVByte); 

     MemoryStream msEncrypt = new MemoryStream(); 
     CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write); 

     byte[] toEncrypt = System.Text.Encoding.ASCII.GetBytes(sToEncrypt); 

     csEncrypt.Write(toEncrypt, 0, toEncrypt.Length); 
     csEncrypt.FlushFinalBlock(); 

     byte[] encrypted = msEncrypt.ToArray(); 

     return Convert.ToBase64String(encrypted); 

    } 
} 

編集:

が試しDebug.WriteLine

 Debug.WriteLine("encrypted: " + encryptedText); 
     Debug.WriteLine("decrypted: " + decryptedText); 
     Debug.WriteLine("test"); 

出力:

暗号化:T4hdAcpP5MROmKLeziLvl7couD0o + 6EuB/Kx29RPm9w =
解読さ:randomtest

わからない理由それはprintiではないラインターミネータを使用してください。

+0

何も印刷されませんか? –

+0

はい。最後に印刷される行は、復号化された行です。 – weirdcsharp

+0

これはなぜフォームから継承されますか? Windowsフォームアプリケーションではなくコンソールアプリケーションを作成してみてください。 –

答えて

0

LinuxでMonoを使っている私にはうまくいくが、decryptedTextの長さは33文字で、「r」、「a」、「n」、「d」、「o」、 m 'は27のNUL文字に続いた。 (私は以前にはパディングバイトが初期化されていないかもしれないと推測しましたが、それは明確に定義されているようなコードを見ています)Visual Studioのコンソール出力ウィンドウはNUL文字を出力の終わりとして解釈し、 WriteLineの行終端文字と "test"文字列の両方を含め、それ以降は何も印刷しません。私はそれをテストするためにここにVisual Studioを持っていないが、私はあなたがそれを容易に十分に確認するか、または反証できるはずだと思う。

0

あなたの暗号化/復号化コード内の1つの問題があります:あなたはPaddingMode.Zerosを使用しているので、復号化した後、あなたはデータが終了した場所と言うことができない、とあなたはゼロバイトに続く「ランダム」受け取ります。たとえばに切り替えると

var decryptedSize = csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length); 
return Encoding.ASCII.GetString(fromEncrypt, 0, decryptedSize); 

私はそれを考えるにもかかわらずはない NULバイトを書き込むための問題べきである:PaddingMode.PKCS7、および適切CryptoStream.Read呼び出しの戻り値を使用するには、あなただけのオリジナルテキスト、すなわち「ランダム」を受け取ることになりますコンソールに、私は間違いなく、特にそれらの奇妙な動作を見て、最初にそれらを削除しようとします。

5
 myRijndael.Padding = PaddingMode.Zeros; 
     myRijndael.BlockSize = 256; 

これは問題の原因である、あなたは、暗号化データは、32バイト(32×8 = 256)の複数のブロック・サイズを取得するためにゼロで埋めます。それらのバイナリのゼロを復号化された値に戻します。デバッガがそれらを表示できないということは難しいです。これは大丈夫です、あなたはASCIIを通る往復の値を期待しています、あなたは解読の後に再びゼロを取り除くことができます。解読コードにはいくつかの作業が必要ですが、解読されたデータのサイズについてはあまりにも多くのことを想定しています。修正:

 MemoryStream fromEncrypt = new MemoryStream(); 
     MemoryStream msDecrypt = new MemoryStream(sEncrypted); 
     CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read); 

     byte[] buffer = new byte[4096]; 
     for (; ;) { 
      int len = csDecrypt.Read(buffer, 0, buffer.Length); 
      if (len == 0) break; 
      fromEncrypt.Write(buffer, 0, len); 
     } 

     var result = Encoding.ASCII.GetString(fromEncrypt.GetBuffer(), 0, (int)fromEncrypt.Length); 
     return result.Trim('\0'); 

あなたは、ところでストリームを配置ステートメントを使用してを使用するべきです。

関連する問題