2011-02-28 6 views
0

AesManaged를 사용하여 스트림을 암호화하려고합니다. 나는 오류없이 파일을 암호화 할 수 있지만 암호 해독시 다음 CryptographicException을 얻습니다.스트림 해독시 패딩이 유효하지 않습니다.

채우기가 잘못되어 을 제거 할 수 없습니다.

CryptoStream 처리 중에 예외가 발생합니다. I는 입력 데이터를 암호화하려면 다음을 사용 :

public byte[] Encrypt(Stream plain) 
{ 
    // Create a decrytor to perform the stream transform. 
    using(var msEncrypt = new MemoryStream()) 
    { 
     using (ICryptoTransform encryptor = _myAes.CreateEncryptor(_myAes.Key, _myAes.IV)) 
     using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
     using (BinaryWriter swEncrypt = new BinaryWriter(csEncrypt)) 
     { 
      int buf_size = 32768; 
      byte[] buffer = new byte[buf_size]; 
      int read = 0; 
      while ((read = plain.Read(buffer, 0, buf_size)) > 0) 
      { 
       swEncrypt.Write(buffer, 0, read); 
      } 
     } 

     return msEncrypt.ToArray(); 
    } 
} 

을 그리고이 데이터를 해독하기 위해이 예외가 좋은 것 오는 이유에 대한

public byte[] Decrypt(Stream cipherText) 
{ 

    using (MemoryStream ms = new MemoryStream()) 
    { 
     // Create a decrytor to perform the stream transform. 
     using (ICryptoTransform decryptor = _myAes.CreateDecryptor(_myAes.Key, _myAes.IV)) 
     using (CryptoStream csDecrypt = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) 
     using (BinaryWriter swDecrypt = new BinaryWriter(csDecrypt)) 
     { 
      int buf_size = 32768; 
      byte[] buffer = new byte[buf_size]; 
      int read = 0; 
      while ((read = cipherText.Read(buffer, 0, buf_size)) > 0) 
      { 
       swDecrypt.Write(buffer, 0, read); 
      } 
     } 

     return ms.ToArray(); 
    } 
} 

어떤 아이디어.

private Crypto() 
{ 
    _myAes = new AesManaged(); 
    _myAes.Padding = PaddingMode.PKCS7; 
    _myAes.KeySize = 128; 
    _myAes.Key = Enumerable.Repeat((byte)'B', 128/8).ToArray(); 
    _myAes.IV = Enumerable.Repeat((byte)'C', 128/8).ToArray(); 
} 
: 감사

UPDATE 여기

는 AES 객체가 생성 된 경우, 그것이 사용되는 실제 키가 아닌, 키와 IV가 단지 일시적으로 현재의 값으로 설정됩니다주의이다

+2

당신이 _myAes를 만드는 방법을 보여 수있어? – SimonJ

+0

@SimonJ - 내가 그 객체를 인스턴스화하는 스 니펫을 추가했습니다. –

+0

이 오류는 여러 가지 원인으로 인해 발생할 수 있습니다. 대부분 잘못된 키 또는 IV를 사용하고 있습니다. 또한 데이터 손상으로 인해 발생할 수 있습니다. –

답변

2

이전에는 길이가 16 바이트의 배수가 아닌 버퍼의 암호를 해독하려고 시도했을 때이 예외가 발생했습니다.

처리하기 전에 CryptoStreamFlush을 부르려고 했습니까? 아마도 플러시되지 않으면 정렬되지 않은 길이의 버퍼를 해독하려고 시도합니다.

그리고 다른 참고 -이 문제를 해결할 수 있는지 모르겠어요,하지만 당신은 버퍼를 해독하기 위해 CryptoStream를 만들 때, 당신은 CryptoStreamMode.Read 대신 CryptoStreamMode.Write를 사용해서는 안된다?

+0

나는 마지막 점이 아마도 첫 번째가되어야한다고 생각한다. –

+0

내가 원래 시도한 방식은 읽기 모드를 사용했지만 동일한 예외가 발생한다. 나는 암호화와 암호 해독 모두에서'CryptoStream'에'Flush'와'FlushFinalBlock' 호출을 시도했지만 여전히 같은 예외를 던졌습니다. –

+0

또한 'CryptoSteamMode.Read'로 변경하면 스트림이 삭제 될 때가 아니라 스트림에서 읽을 때 예외가 throw된다는 것을 지적해야합니다. –

0

쓰기면에서 CryptoStream을 깨끗하게 마무리해야합니다. 스트림 끝 패딩이 기록되도록하려면 FlushFinalBlock()으로 전화해야합니다. 그렇지 않으면 스트림의 마지막 블록이 누락되어 결국 패딩 예외가 유효하지 않게됩니다.

+0

나는 CryptoStream이 처리 될 때 FlushFinalBlock이 호출된다는 것을 확신하지만 명확성을 위해 명시 적으로 IMHO를 수행해야합니다. –

+0

'Encrypt' 메쏘드에서'FlushFinalBlock()'을 명시 적으로 호출하려고 시도했지만 여전히 같은 예외가 발생합니다. –

0

4 년 후에도 게시물을 올리는 것과 관련이 있는지 알 수는 없지만 패딩을 none으로 설정해야합니다. 나는 3DES와 같은 문제를 가지고하고 문제는 해결할 (하지만 ... 데이터의 길이가 암호를 해독 할 수 있는지가 올바른지 확인)

private Crypto() 
{ 
    _myAes = new AesManaged(); 
    _myAes.Padding = PaddingMode.none; //rather than _myAes.Padding = PaddingMode.PKCS7; 
    _myAes.KeySize = 128; 
    _myAes.Key = Enumerable.Repeat((byte)'B', 128/8).ToArray(); 
    _myAes.IV = Enumerable.Repeat((byte)'C', 128/8).ToArray(); 
} 
관련 문제