私は次のコードを持っている:の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()
を使用してから切り替えてください。
不正な復号のいくつかのヘキサ・ダンプが必要です。 – zaph