2017-08-22 12 views
4

私は自分のデータをMySQLで暗号化してBLOBとして保存し、C#で復号化する必要がありますが、期待した結果が得られません。MySQLでの暗号化、C#での復号化

MYSQLでBLOB:

BLOB in MySQL

これは私の結果である:

Result

それはちょうどPD001KY6900430

ここに私のコードは、C#で

ますする必要がありますここ

はMKEY方法であって、ここで

Encoding winLatinCodePage = Encoding.GetEncoding(1252); 
     byte[] key = Encoding.UTF8.GetBytes(skey); 
     byte[] k = new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 
     for (int i = 0; i < key.Length; i++) 
     { 
      k[i % 16] = (byte)(k[i % 16]^key[i]); 
     } 

     return k; 

decrypt_function方法である:

RijndaelManaged Crypto = null; 
     MemoryStream MemStream = null; 
     ICryptoTransform Decryptor = null; 
     CryptoStream Crypto_Stream = null; 
     StreamReader Stream_Read = null; 
     string Plain_Text; 

     try 
     { 
      Crypto = new RijndaelManaged(); 
      Crypto.Key = Key; 
      Crypto.Mode = CipherMode.ECB; 
      Crypto.Padding = PaddingMode.None; 

      MemStream = new MemoryStream(Cipher_Text); 
      Crypto.GenerateIV(); 
      //Create Decryptor make sure if you are decrypting that this is here and you did not copy paste encryptor. 
      Decryptor = Crypto.CreateDecryptor(Crypto.Key, Crypto.IV); 

      //This is different from the encryption look at the mode make sure you are reading from the stream. 
      Crypto_Stream = new CryptoStream(MemStream, Decryptor, CryptoStreamMode.Read); 

      //I used the stream reader here because the ReadToEnd method is easy and because it return a string, also easy. 
      Stream_Read = new StreamReader(Crypto_Stream); 
      Plain_Text = Stream_Read.ReadToEnd(); 
     } 
     finally 
     { 
      if (Crypto != null) 
       Crypto.Clear(); 

      MemStream.Flush(); 
      MemStream.Close(); 

     } 
     return Plain_Text; 

私に私が作った間違いをご提示ください。

答えて

4

「PD001KY6900430」はそれがPKCS#7 paddingの最後の2 0x02バイト、14バイト、入力データがブロックサイズの倍数にパディングする必要があるので、AES(RijndaelManagedデフォルト)ブロックサイズは16バイトです。したがって、 "PD001KY6900430 \ u0002 \ u0002"(\ u0002はUTF-16の0x02の1バイトを表す)の最後の2バイトがパディングです。

これは、通常、復号化メソッドにPKCS#7パディングを指定することによって処理(削除)されます。

修正:それは完全にすべてのオプションを指定することが常に最善である
Crypto.Padding = PaddingMode.None;

Crypto.Padding = PaddingMode.PKCS7;

変更。

+0

パディングを削除しようとしましたが、列accNoのために結果が期待どおりですが、別の列、アドレス、エラーでエラーが発生しました: "埋め込みが無効ですnは削除できません" –

+0

修正:もし私が削除すると、 "Crypto.Mode = CipherMode.ECB; Crypto.Padding = PaddingMode.None;、accNo列の場合でも、 エラーが直ちに表示されます。"埋め込みが無効で削除できません " –

+0

なぜCipherModeを削除していますか? ECB'? 「accNo」に関するデータを提供する。 – zaph

関連する問題