2014-04-09 3 views
0

답변과 함께 많은 질문이 있지만 시간과 시간을 들여 google을 사용하여 찾은 모든 제안을 시도했습니다.C# AesManaged Exception : 안쪽 여백이 잘못되어 제거 할 수 없습니다.

파일을 다운로드했으며 격리 된 저장소에 암호화 된 파일을 저장하려고합니다.

     using (var fs = new IsolatedStorageFileStream(fileName, FileMode.Create, store)) 
         { 
          byte[] bytesInStream = new byte[args.Result.Length]; 
          args.Result.Read(bytesInStream, 0, bytesInStream.Length); 

          var aes = new AesManaged 
             { 
              Key = GetBytes("aaaaaaaa"), 
              IV = GetBytes("bbbbbbbb") 
             }; 

          byte[] encryptedArray; 
          using (MemoryStream memoryStream = new MemoryStream()) 
          { 
           using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write)) 
           { 
            cryptoStream.Write(bytesInStream, 0, bytesInStream.Length); 
            cryptoStream.FlushFinalBlock(); 

            encryptedArray = memoryStream.ToArray(); 
           } 
          } 

          fs.Write(encryptedArray, 0, encryptedArray.Length); 
          fs.Flush(); 
         } 

다음 코드는 격리 된 저장소에서 파일을 읽을하고 암호를 해독 : 프로그램이이 선에 도달

   using (var store = IsolatedStorageFile.GetUserStoreForApplication()) 
       { 
        if (store.FileExists(fileName)) 
        { 
         var file = store.OpenFile(fileName, FileMode.Open,FileAccess.Read,FileShare.Read); 
         var reader = new BinaryReader(file); 

         var aes = new AesManaged 
         { 
           Key = GetBytes("aaaaaaaa"), 
           IV = GetBytes("bbbbbbbb") 
         }; 

         byte[] decodedContent; 
         byte[] encodedContent = reader.ReadBytes(1280); 
         using (MemoryStream ms = new MemoryStream(encodedAudio)) 
         { 
          using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read)) 
          { 
            BinaryReader r= new BinaryReader(cs); 
            decodedContent= r.ReadBytes(encodedContent.Length); 
          } 
         } 
       } 

: decodedContent = r.ReadBytes 이것은 내가 그것을 저장하는 방법입니다 (encodedContent.Length); CryptographicException 다음 메시지가 나타납니다. 패딩이 잘못되어 제거 할 수 없습니다.

누구든지이 문제를 해결할 수 있습니까?

+1

분명히 그 마법 1280을 최대한 빨리 제거해야합니다. 무슨 생각하고 있었던거야? –

+0

블록으로 파일을 디코드하고 싶습니다. – vladtamas

+0

내 코드를 사용해 보셨습니까? – HackerMan

답변

0

Silverlight AesManaged는 항상 패딩을 포함하고 암호화 된 블록 암호화 클래스의 일부만 읽으면 제거해야하는 패딩을 찾을 수 없으므로 블록별로 암호를 해독 할 수 없습니다. 전체 데이터 만 해독 할 수 있습니다. 또는 알고리즘의 암호화 부분에서 수동으로 데이터를 분할 할 수도 있습니다. Hans Passant가 짧은 형식으로 알려 줬습니다.)

0

마지막 블록까지 패딩을 제거하지 않고 암호를 해독하면 한 번에 1,280 바이트를 해독 할 수 있습니다. 즉, 암호 해독기를 으로 설정하지 말고 마지막 블록을 제외한 모든 부분에서 패딩을 제거합니다 (예 : '패딩 없음').

e.e.

블록
  • 1 N-1 : 해독 (1,280 바이트 패딩)
  • 블록 N의 경우 : 때 N 블록이있다 (그러나 바이트 왼쪽 패딩) 해독

"패딩 없음"으로 전체 암호 해독을 실행하고 직접 패딩을 제거 할 수도 있습니다. 마지막 바이트는 1에서 16까지 끝까지 클립 할 바이트 수를 제공합니다.

위의 설명에 암시되어있는 해독시 패딩 제거를 해제 할 수없는 경우에도 다음에서 1,280 바이트를 해독 할 수 있습니다. 시간. 블록을 개별적으로 암호화하면됩니다. 그들은 각각 패딩을 가져와 1,280에 적합하게 만들 것입니다. 예를 들어 한 번에 1,279 바이트를 암호화합니다 (각 블록에는 1 바이트 패드가 제공됩니다). 패딩으로 전체 1,280을 암호화하면 1,296 바이트가됩니다 (16 바이트의 일반 텍스트의 배수는 전체 16 바이트 패드를 가져옵니다).)

편집, 이해에 대한 :

당신은 큰 암호문과 함께 자신을 발견, 당신은 블록 암호를 해독하려면, 어떤 이유로 암호 해독은 당신이 패딩 모드를 사용하도록 강제되도록 제한되어있는 경우 PKCS # 7, 한 번에 한 블록 씩 데이터를 해독 할 수 있습니다. 조금 비쌉니다. 블록 당 16 바이트의 추가 암호화 비용이 들지만 적어도 가능합니다.

원시 암호문의 각 블록을 가져 와서 해당 블록에 대해 올바르게 채워진 각 블록에 대해 16 바이트의 작은 꼬리를 암호화합니다. 그런 다음 확대 된 블록의 암호를 해독하고 마지막으로 패딩 꼬리를 암호화하는 데 사용되는 추가 데이터 비트를 제거합니다.

블록의 마지막 16 바이트를 IV로 가져오고 동일한 키를 사용하여 PKCS # 7로 패딩 된 일부 작은 데이터 (예 : 단일 바이트)를 암호화합니다. 암호화에 대한 16 바이트 결과를 블록에 첨부하고 이제 블록 + 16 바이트를 해독합니다. 패딩은 꼬리 16 바이트에서 제거되며 데이터 비트를 제거하고 원래 텍스트 블록으로 끝낼 수 있습니다. 내 대답에 더 많은 것을 참조하십시오 here

관련 문제