2017-01-12 5 views
1

이 항목에 대한 다른 질문이 있지만 모든 질문을 확인한 결과 내 문제를 해결할 수 없습니다 .. 이것은 해독하는 다른 방법이며 해독을 호출하는 다른 방법입니다. 필요한 매개 변수와 방법패딩이 유효하지 않으므로 제거 할 수 없습니다. C# decrypt

public string Decrypt(AesOperationType operationType, byte[] criptotext, byte[] Key, byte[] initVector) 
{ 

     string plaintext = null; 

     using (Aes aesAlg = Aes.Create()) 
     { 
      aesAlg.KeySize = 128; 
      aesAlg.Key = Key; 
      aesAlg.IV = initVector; 
      if (operationType == AesOperationType.Cbc) 
      { 
       aesAlg.Mode = CipherMode.CBC; 
      } 
      else if (operationType == AesOperationType.Cfb) 
      { 
       aesAlg.Mode = CipherMode.ECB; 
      } 

      //apelam functia de decriptare 
      ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); 

      using (MemoryStream msDecrypt = new MemoryStream(criptotext)) 

      using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
      { 
       using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
       { 
        plaintext = srDecrypt.ReadToEnd(); 
       } 
      } 
     } 
     Console.WriteLine("Start decrypt for criptotext : " + BitConverter.ToString(criptotext) + "\n"); 
     Console.WriteLine("Plaintext after decrypt : " + plaintext + "\n"); 

     return plaintext; 
} 

public byte[] Encrypt_Call() 
{ 
     var key = "1212121212121212"; 
     var key_byte = Encoding.ASCII.GetBytes(key); 
     using (Aes aess = Aes.Create()) 
     { 
      var iv = aess.IV; 
      cryptdecrypt object = new cryptdecrypt(); 
      var result = object.Encrypt(AesOperationType.Cbc, "plaintext", key_byte, iv); 
      return result; 
     } 
} 

public void Decrypt_Call() 
{ 
     var key = "1212121212121212"; 
     var key_byte = Encoding.ASCII.GetBytes(key); 
     using (Aes aess = Aes.Create()) 
     { 
      var iv = aess.IV; 
      cryptdecrypt object = new cryptdecrypt(); 
      var cryptotext = Encrypt_Call(); 
      var result = object.Decrypt(AesOperationType.Cbc, cryptotext , key_byte, iv); 
     } 
} 

암호화 방법은 잘 작동하지만 암호 해독 메소드 호출에서이 오류에 직면 : 나는 또한이 라인 전에 csDecrypt.FlushFinalBlock()이 줄을 추가하려고

Padding is invalid and cannot be removed.

을 :

using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 

오류가 사라지고 결과적으로 빈 문자열이 표시됩니다.

이 문제를 해결할만한 아이디어가 있습니까?

+0

IV는 어디에 지정되어 있습니까? – zaph

+1

암호화와 암호 해독에 동일한 키 *와 * IV를 사용해야합니다. 당신이 암호화와 암호 해독 방법 모두에서 무작위로 IV를 생성 할 수있는 것처럼 보입니다. 따라서 그들은 동일하지 않을 것입니다. – Iridium

+0

@KurokawaMasato AesOperationType은 Cbc, Cfb가있는 열거 형을 포함하는 클래스입니다. 문제가 없습니다. – Carto

답변

0

일반적으로 유효하지 않은 패딩 오류는 해독에 실패했음을 의미합니다. 이 경우 CBC 모드에서 IV는 지정되지 않으므로 정크 (또는 무작위)가됩니다.

어느 :

  1. 블록 길이의 지정 IV (AES 16 바이트).

  2. 암호화시 임의의 IV를 만들고 암호화 된 데이터 앞에 추가하십시오. 암호 해독시 IV를 분리하고 암호 해독에 사용합니다. < - 최적 옵션

관련 문제