길이

2013-10-31 3 views
0

안녕 얘들이 좀 도와주십시오 무효, 난이 오류가 계속 :길이

Length of the data to decrypt is invalid.

내가 잘못하고있는 중이 야 무엇을?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Security.Cryptography; 
using System.IO; 

namespace inChargeAES 
{ 
    public class inChargeCrypto : IinChargeAES 
    { 
     public inChargeCrypto() {} 

     public String inChargeEncrypt(String plaintext, byte[] encryptionKey, byte[] initializationVector) 
     { 
      if (plaintext == null || plaintext.Length <= 0) 
      { 
       throw new ArgumentNullException("plaintext"); 
      } 
      if(encryptionKey == null || encryptionKey.Length <= 0){ 
       throw new ArgumentNullException("encryptionKey"); 
      } 
      if(initializationVector == null || initializationVector.Length <= 0){ 
       throw new ArgumentNullException("initializationVector"); 
      } 
      byte[] encryptedText; 
      using(RijndaelManaged rjManage = new RijndaelManaged()) 
      { 
       rjManage.Key = encryptionKey; 
       rjManage.IV = initializationVector; 
       rjManage.Mode = CipherMode.CBC; 
       //rjManage.Padding = PaddingMode.None; 

       ICryptoTransform iTransformer = rjManage.CreateEncryptor(rjManage.Key, rjManage.IV); 
       using(MemoryStream memStream = new MemoryStream()) 
       { 
        using(CryptoStream cEncryptStream = new CryptoStream(memStream, iTransformer, CryptoStreamMode.Write)) 
        { 
         using(StreamWriter encryptStreamWriter = new StreamWriter(cEncryptStream)) 
         { 
          encryptStreamWriter.Write(plaintext); 
         } 
         encryptedText = memStream.ToArray(); 
        } 
       } 
      } 
      return Convert.ToBase64String(encryptedText); 
     } 

     public String inChargeDecrypt(byte[] cipher, byte[] encryptionKey, byte[] initializationVector) 
     { 
      if (cipher == null || cipher.Length <= 0){ 
       throw new ArgumentNullException("cipher"); 
      } 
      if (encryptionKey == null || encryptionKey.Length <= 0){ 
       throw new ArgumentNullException("encryptionKey"); 
      } 
      if (initializationVector == null || initializationVector.Length <= 0){ 
       throw new ArgumentNullException("initializationVector"); 
      } 

      String decryptedText = null; 
      using (RijndaelManaged rijManage = new RijndaelManaged()) 
      { 
       rijManage.Key = encryptionKey; 
       rijManage.IV = initializationVector; 
       rijManage.Mode = CipherMode.CBC; 
       rijManage.Padding = PaddingMode.None; 

       ICryptoTransform iTranformation = rijManage.CreateDecryptor(rijManage.Key, rijManage.IV); 
       using(MemoryStream memStream = new MemoryStream(cipher)) 
       { 
        using(CryptoStream cDecryptorStream = new CryptoStream(memStream, iTranformation, CryptoStreamMode.Read)) 
        { 
         using (StreamReader decryptReader = new StreamReader(cDecryptorStream)) 
         { 
          decryptedText = decryptReader.ReadToEnd(); //Exception Is Thrown 
         } 
         //memStream.Read(cipher, 0, cipher.Length); 
        } 
       } 
      } 
      return decryptedText; 
     } 
    } 
} 
+0

패딩하면 암호화하고 해독 같은 값으로 할 필요가 [] 바이트로 다시 base64로 문자열을 변환하는 실수를하지 않은 가정. –

+0

당신의 방법은 암호화 나 복호화에 패딩이없는 나를 위해 잘 작동합니다. – Kevin

답변

0

이미 암호화 기능에서 패딩 모드를 주석 처리했습니다.

내가 암호 해독 기능에 대해 의견을 말하면 모든 것이 예상대로 작동합니다.

당신이

+0

"당신이 base64 문자열을 바이트 []로 변환하는 실수를하지 않았다고 가정합니다. –

+0

암호화 메소드가 사용하는 문자열로 반환됩니다. 'return Convert.ToBase64String (encryptedText);' 그러나 decrypt 메소드는'byte []'배열을 입력으로 기대합니다. 어떻게 암호화 된 문자열을'byte []'로 변환하고 있습니까? –