2013-06-07 3 views
0

현재 AES를 사용하고 있으며 암호화되지 않은 파일을 디코딩하도록 선택하면 문제가 발생합니다. 내 prog은 예외가 발생하여 종료됩니다. 심지어 잡아두고 디버거가 부족한 경우에도 문제가 발생합니다. 내가 왜 시도하고 캐치가 작동하지 않는 관심이 아니다C#과 PHP 모두에서 구현 된 대칭 암호화 알고리즘에는 고정 길이의 입력 데이터가 필요하지 않습니까?

public static byte[] AES_Decrypt(byte[] data, string[] aes_key) 
{ 
    RijndaelManaged aes = new RijndaelManaged(); 
    aes.KeySize = 256; 
    aes.BlockSize = 256; 
    aes.Mode = CipherMode.CBC; 
    aes.Padding = PaddingMode.PKCS7; 

    aes.Key = Encoding.Default.GetBytes(aes_key[0]); 
    aes.IV = Encoding.Default.GetBytes(aes_key[1]); 

    if (data.Length % (aes.BlockSize/8) != 0) 
     return null; 

    var decrypt = aes.CreateDecryptor(); 

    using (MemoryStream ms = new MemoryStream()) 
    { 
     using (CryptoStream cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write)) 
      try { cs.Write(data, 0, data.Length); } //crash here "data lenght for decryption is invalid" and "Padding is invalid and cannot be removed". 
      catch (Exception exc) { return null; } 

     return ms.ToArray(); 
    } 
} 

, 나는 충돌을 피하기 위해 몇 가지 해결 방법이 필요합니다 ... 그리고 암호화 방법을 변경하는 것은 괜찮습니다.

답변

1

저의 관점에서 보면 예외 수준을 숨기면 안됩니다. 사용자가 암호화되지 않은 데이터 조각을 해독하려고 할 때 예외를 던지면 암호화 모듈의 예상되는 동작이 나에게 보인다.

대신이 예외를 상위 수준 (암호화 모듈 외부)에서 처리해야합니다. 예를 들어 UI 레이어에 다음과 같은 내용을 추가 할 수 있습니다.

try 
{ 
    var encryptedFilePath = ShowOpenFileDialog(); 
    var decryptedFilePath = TryDecryptFile(encryptedFilePath); 
    ShowMessagePopup("Your file has been decrypted to: " + decryptedFilePath); 
} 
catch (CryptographicException) 
{ 
    ShowErrorPopup("Unable to decrypt file!\n" + 
    "Please make sure the file you selected is valid"); 
}