나는 다음과 같은 코드가 있습니다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
은 문자열의 암호화/복호화를 수행하는 도우미 방법으로 사용된다. 두 조작 중 하나에 대해 비밀 키가 제공됩니다.
iOS 기기 인 & Android의 모바일 앱에서 사용하는 웹 API 애플리케이션에 사용됩니다.
Android에있는 많은 사용자에게 잘못된 데이터 오류가 발생하며 iOS에서이 오류가 훨씬 더 적습니다. 비슷한 모바일 장치에서 수행 한 테스트로는 문제가 발생하지 않습니다.
암호화 된 후에 단위 테스트에서 문자열 값을 수정하면 오류를 재현 할 수있는 유일한 방법입니다.
웹 API는 Async/Await을 사용하므로이 작업과 관련이 있는지 확실하지 않습니다.
내가 버렸거나 나쁜 습관 인 위의 코드에서 놓친 것이 있습니까?
서버에 전송되는 원시 요청에 대한 액세스 권한이 없기 때문에 요청에 Android/iOS에서 암호화 된 값에 dodgy 문자가 추가되었는지 확인할 수 없습니다.
내 다른 생각은 다음과 같습니다
는 그 난 그냥 AES처럼 완전히 DIFF 알고리즘을 사용하도록 전환해야 iOS 및 안드로이드 환경
에 문제를 일으키는 경우 해당 헬퍼 클래스를 ASCII로 UTF8 getbytes()
를 사용하여 전환해야한다.
잘못된 해독의 일부 덤프가 필요합니다. – zaph