2016-12-19 1 views
0

私は次のコードを持っている:のTripleDES TransformFinalBlockは時折「不正なデータを与えます。 「エラー

public static string PerformEncryption(string text, string uniqueKey, bool encrypt = false) 
{ 
    byte[] textBytes = encrypt ? Encoding.UTF8.GetBytes(text) : Convert.FromBase64String(text); 
    byte[] resultArray; 
    var staticKey = Convert.FromBase64String(ConfigReader.SecretKey); 
    using (TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider()) 
    { 
     tDes.Mode = CipherMode.ECB; 
     tDes.Padding = PaddingMode.PKCS7; 
     tDes.Key = GenerateTripleDesKey(uniqueKey, staticKey);      
     CTransform = encrypt ? tDes.CreateEncryptor() : tDes.CreateDecryptor(); 
     resultArray = CTransform.TransformFinalBlock(textBytes, 0, textBytes.Length); 
     tDes.Clear(); 
    } 
    if (encrypt) 
     return Convert.ToBase64String(resultArray, 0, resultArray.Length); 

    return Encoding.UTF8.GetString(resultArray); 
} 



private static byte[] GenerateTripleDesKey(string uniqueKey, byte[] staticKey) 
{ 
    byte[] keyArray; 
    using (SHA512CryptoServiceProvider hash = new SHA512CryptoServiceProvider()) 
     keyArray = hash.ComputeHash(Encoding.UTF8.GetBytes(string.Format("{0}{1}", uniqueKey, staticKey))); 

    byte[] trimmedBytes = new byte[24]; 
    Buffer.BlockCopy(keyArray, 0, trimmedBytes, 0, 24); 
    return trimmedBytes; 
} 

PerformEncryptionは、文字列の暗号化/復号化を実行するためのヘルパーメソッドとして使用されています。秘密鍵は、また、いずれかの操作のために供給されています。

これは、Androidの& iOSデバイスのモバイルアプリで使用されるWeb APIアプリケーションで使用されます。

Androidのユーザーの大部分が不正なデータエラーが発生していますが、iOSではこのエラーが発生する確率ははるかに低くなっています。私は同様のモバイルデバイス上で行われている任意のテストでは問題を生じません。

エラーを再現できるのは、暗号化した後にユニットテストで文字列値を変更する場合のみです。

Web APIはAsync/Awaitを使用しているため、これに関係があるかどうかはわかりません。

私は私が残っているか、悪い習慣がある上記のコードで欠場はありますか?

サーバーに送信されている生のリクエストにアクセスできないため、暗号化された値のコンテンツにAndroid/iOSの不正な文字がリクエストに追加されているかどうかを判断できませんか?

私の他の思考は以下のとおりです。
は、私はちょうど完全にAESのような差分アルゴリズムを使用するように切り替える必要があることは、iOSとAndroidの環境

の問題を引き起こしている場合は同等のヘルパークラスをASCIIにUTF8 getbytes()を使用してから切り替えてください。

+0

不正な復号のいくつかのヘキサ・ダンプが必要です。 – zaph

答えて

0
  1. 3DESを新しいコードに使用しないでください。代わりにAESを使用してください。

  2. ECBモードを使用しないでください。安全ではありません。ECB modeを参照して、ペンギンまでスクロールしてください。その代わりに、暗号化されたデータにIVを付加して復号化に使用するだけで、ランダムIVのCBCモードを使用します。

  3. PBKDF2は、単純なハッシュよりも安全です。また、塩漬けのハッシュよりも安全です。主な違いは、キーを計算するために多くの時間を取るため10万回の繰り返しの繰り返しでPBKDF2は一般的です。

  4. UTF-8はあまりにも制限されたASCIIよりも優先されます。

関連する問題