2016-12-19 11 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은 문자열의 암호화/복호화를 수행하는 도우미 방법으로 사용된다. 두 조작 중 하나에 대해 비밀 키가 제공됩니다.

iOS 기기 인 & Android의 모바일 앱에서 사용하는 웹 API 애플리케이션에 사용됩니다.

Android에있는 많은 사용자에게 잘못된 데이터 오류가 발생하며 iOS에서이 오류가 훨씬 더 적습니다. 비슷한 모바일 장치에서 수행 한 테스트로는 문제가 발생하지 않습니다.

암호화 된 후에 단위 테스트에서 문자열 값을 수정하면 오류를 재현 할 수있는 유일한 방법입니다.

웹 API는 Async/Await을 사용하므로이 작업과 관련이 있는지 확실하지 않습니다.

내가 버렸거나 나쁜 습관 인 위의 코드에서 놓친 것이 있습니까?

서버에 전송되는 원시 요청에 대한 액세스 권한이 없기 때문에 요청에 Android/iOS에서 암호화 된 값에 dodgy 문자가 추가되었는지 확인할 수 없습니다.

내 다른 생각은 다음과 같습니다
는 그 난 그냥 AES처럼 완전히 DIFF 알고리즘을 사용하도록 전환해야 iOS 및 안드로이드 환경

에 문제를 일으키는 경우 해당 헬퍼 클래스를 ASCII로 UTF8 getbytes()를 사용하여 전환해야한다.

+0

잘못된 해독의 일부 덤프가 필요합니다. – zaph

답변

0
  1. 3DES를 새 코드로 사용하지 말고 대신 AES를 사용하십시오.

  2. ECB 모드를 사용하지 마십시오. 안전하지 않습니다. ECB mode을 참조하고, 펭귄까지 스크롤하십시오. 대신 무작위 IV가있는 CBC 모드를 사용하고 해독에 사용할 IV로 암호화 된 데이터의 접두어를 붙이십시오.

  3. PBKDF2는 단순 해시 또는 소금기가있는 해시보다 안전합니다. 주된 차이점은 키를 계산하는 데 더 많은 시간이 걸리기 때문에 반복입니다. PBKDF2에는 10 만회 반복이 일반적입니다.

  4. UTF-8은 ASCII보다 선호되는데 이는 너무 제한적입니다.