0

다음 메소드를 사용하여 바이트 []를 암호화하려고하는데, 바이트를 해독 할 때 [시작]보다 크고 패딩과 관련이 있다고 생각하지만 그렇지 않습니다. 그것을 해결하는 방법.AES 암호화/복호화 바이트 []

아직 방법이 끝나지 않았습니다. (예를 들어 키를 추가하는 것이 좋지 않지만, 예를 들어 움직이기 전에 테스트 할 목적으로 테스트하는 것이 좋습니다.)

그래서 나중에 파일을 열려고하면 (MS Word 파일로 테스트 한 경우) 파일이 손상되었다는 메시지가 나타나며 복구하려고합니다.

암호화 방법

public byte[] Encrypt(byte[] dataToEncrypt) { 
     // Check arguments. 
     if (dataToEncrypt == null || dataToEncrypt.Length <= 0) { 
      throw new ArgumentNullException("dataToEncrypt"); 
     } 

     byte[] encryptedData; 
     byte[] key; 
     byte[] iv; 

     // Create an Aes object 
     using (Aes aesAlg = Aes.Create()) { 
      key = aesAlg.Key; 
      iv = aesAlg.IV; 

      // Create a encrytor to perform the stream transform. 
      ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 

      // Create the streams used for encryption. 
      using (MemoryStream memoryStream = new MemoryStream()) { 
       using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) { 
        cryptoStream.Write(dataToEncrypt, 0, dataToEncrypt.Length); 
        cryptoStream.FlushFinalBlock(); 

        encryptedData = memoryStream.ToArray(); 

       } 
      } 


     } 

     byte[] result = new byte[encryptedData.Length + KEY_SIZE + IV_SIZE]; 

     Buffer.BlockCopy(key, 0, result, 0, KEY_SIZE); 
     Buffer.BlockCopy(iv, 0, result, KEY_SIZE, IV_SIZE); 
     Buffer.BlockCopy(encryptedData, 0, result, KEY_SIZE + IV_SIZE, encryptedData.Length); 

     return result; 
    } 

복호화 방법

public byte[] Decrypt(byte[] encryptedData) { 
     // Check arguments. 
     if (encryptedData == null || encryptedData.Length <= 0) { 
      throw new ArgumentNullException("encryptedData"); 
     } 

     byte[] storedKey = new byte[KEY_SIZE]; 
     byte[] storedIV = new byte[IV_SIZE]; 
     byte[] dataToDecrypt = new byte[encryptedData.Length - (KEY_SIZE + IV_SIZE)]; 

     Buffer.BlockCopy(encryptedData, 0, storedKey, 0, KEY_SIZE); 
     Buffer.BlockCopy(encryptedData, KEY_SIZE, storedIV, 0, IV_SIZE); 
     Buffer.BlockCopy(encryptedData, KEY_SIZE + IV_SIZE, dataToDecrypt, 0, encryptedData.Length - (KEY_SIZE + IV_SIZE)); 

     byte[] decryptedData = null; 

     // Create an AesCryptoServiceProvider object 
     // with the specified key and IV. 
     using (Aes aesAlg = Aes.Create()) { 
      aesAlg.Key = storedKey; 
      aesAlg.IV = storedIV; 

      // Create a decrytor to perform the stream transform. 
      ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); 

      // Create the streams used for decryption. 
      using (MemoryStream memoryStream = new MemoryStream(dataToDecrypt)) { 
       using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) { 
        cryptoStream.Read(dataToDecrypt, 0, dataToDecrypt.Length); 

        decryptedData = memoryStream.ToArray(); 
       } 
      } 

     } 

     return decryptedData; 
    } 
+0

정말 작지 않습니까? 단일 읽기 방법은 스트림 처리와 관련하여 좋은 방법이 아닙니다. –

+0

크면 암호화 전 파일은 바이트 [9865] 였고 암호 해독 후 바이트 [9877]였습니다. –

답변

0

당신은 전체 버퍼뿐 아니라 일반 텍스트 데이터라고 가정한다. 버퍼의 평문 데이터를 포함하는 부분 만 반환해야합니다 (반환되는 바이트 수를 보려면 Read의 응답을 사용). 패킹의이기 때문에 암호화 된 데이터는 보통 입니다.

단일 읽기 방법은 스트림 처리와 관련하여 우수하지 않습니다. 스트림이 끝날 때까지 읽을 필요가 있습니다. 그렇지 않으면 데이터가 너무 많아서 너무 적어 질 수 있습니다.

+0

나는 그것이 패딩과 관련이있다는 것을 알았지 만 그것을 어떻게 할 수 없는지 알았지 만, 내가 찾은 예제 중 많은 부분이 문자열 암호화/해독에 관한 것이었다. CryptoStream 내부에 무엇이 있어야하는지에 대한 작은 예를 들려 줄 수 있습니까? 나는 plainText = cryptoStream.ReadToEnd() 문자열을 수행 한 다음 plainText에서 바이트를 가져온다는 몇 가지 예제를 보았지만 그 코드는 내 랩톱에 없기 때문에 나에게 준 에러를 기억하지 못한다. –

관련 문제