2016-07-13 2 views
0

serialize 파일의 암호를 해독 할 때 내 앱 사용자 중 일부가 오류를보고합니다. 이 기본 값 CipherMode.CBC 및 PaddingMode.PKCS7 것, 그래서 내가 모드와 패딩을 설정하지CryptographicException : PKCS7 패딩이 잘못되었습니다. 길이가 잘못되었습니다. 137

public void Serialiable(){ 
    if (!Directory.Exists (DirectoryPath)) { 
     Directory.CreateDirectory(DirectoryPath); 
    } 
    FileStream fs = new FileStream (FilePath, FileMode.OpenOrCreate); 

    CryptoStream cryptStream = new CryptoStream(fs, Encryptor, CryptoStreamMode.Write); 

    BinaryFormatter formatter = new BinaryFormatter(); 
    try{ 
     formatter.Serialize(cryptStream,this); 
    }catch(System.Exception e){ 
     Debug.LogError("Failed to serialize. Reason: "+e.Message); 
    }finally{ 
     cryptStream.Close(); 
     fs.Close(); 
    } 
} 

public SerializableBase Deserialize(){ 
    SerializableBase t = null; 
    if (File.Exists (FilePath)) { 
     FileStream fs = new FileStream (FilePath, FileMode.Open); 
     CryptoStream cryptStream = new CryptoStream(fs, Decryptor,CryptoStreamMode.Read); 

     try { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      t = (SerializableBase)formatter.Deserialize (cryptStream); 
      t.Refresh(); 
     } catch(System.Exception e){ 
      Debug.LogError("Failed to deserialize. Reason: "+e.Message); 
      t = null; 
     } 
     finally { 
      if(cryptStream!=null){ 
       cryptStream.Close(); 
      } 
      fs.Close(); 
     } 
    } 
    return t; 
} 

[NonSerialized] 
ICryptoTransform _Encryptor; 
ICryptoTransform Encryptor { 
    get{ 
     if(_Encryptor==null){ 
      _Encryptor = RMCrypto.CreateEncryptor(RuntimeGlobalVariables.SerialKEY,RuntimeGlobalVariables.SerialIV); 
     } 
     return _Encryptor; 
    } 
} 
[NonSerialized] 
ICryptoTransform _Decryptor ; 
ICryptoTransform Decryptor { 
    get{ 
     if(_Decryptor==null){ 
      _Decryptor = RMCrypto.CreateDecryptor(RuntimeGlobalVariables.SerialKEY,RuntimeGlobalVariables.SerialIV); 
     } 
     return _Decryptor; 
    } 
} 
[NonSerialized] 
RijndaelManaged _RMCrypto; 
RijndaelManaged RMCrypto 
{ 
    get 
    { 
     if (_RMCrypto == null) 
     { 
      _RMCrypto = new RijndaelManaged(); 
     } 
     return _RMCrypto; 
    } 
} 
string DirectoryPath 
{ 
    get 
    { 
     return Application.persistentDataPath + "/dat"; 
    } 
} 
string FilePath { 
    get{ 
     return DirectoryPath + "/" + FileName; 
    } 
} 

: 여기

Exception LocalTime: 07/08/2016 21:22:16 ServerTime: 07/08/2016 21:22:16 508 CryptographicException: Bad PKCS7 padding. Invalid length 137. 
Mono.Security.Cryptography.SymmetricTransform.ThrowBadPaddingException (PaddingMode padding, Int32 length, Int32 position) 
Mono.Security.Cryptography.SymmetricTransform.FinalDecrypt (System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) 
Mono.Security.Cryptography.SymmetricTransform.TransformFinalBlock (System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) 
System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock (System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) 
System.Security.Cryptography.CryptoStream.Read (System.Byte[] buffer, Int32 offset, Int32 count) 
System.IO.BinaryReader.FillBuffer (Int32 numBytes) 
System.IO.BinaryReader.ReadInt32() 
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadArrayOfPrimitiveType (System.IO.BinaryReader reader, System.Int64& objectId, System.Object& val) 
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element, System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value, System.Runtime.Serialization.SerializationInfo& info) 
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject (System.IO.BinaryReader reader) 
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph (BinaryElement elem, System.IO.BinaryReader reader, Boolean readHeaders,System.Object& result, System.Runtime.Remoting.Messaging.Header[]& headers) 
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) 
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream) 

내가 사용하고 코드입니다. 나는 또한 SerialKEY와 SerialIV가 change.in 사실이 아니라는 것을 확인하기 위해 체크한다. 몇몇 파일이 직렬화되지만 그들 중 하나만이 문제에 직면한다.

내가 시도했던 특례를 reduproduce하려고 :/
  • 사용하는 다른 직렬 키의 암호를 해독 메모장에 의해

    1. 편집 직렬화 파일을 조금
    2. 사용하는 다른 패딩 또는 암호화 모드를 변경하거나 SerialIV는 암호화/

    를 해독하지만 예외 얻을 수없는합니다 :

    만 같은 다른 오류 얻을 : 나는 또한 구글 검색

    Unexpected binary element: 100 
    

    을, 유래 일부 유사한 문제를 발견

    CryptographicException: Bad PKCS7 padding

    하지만 유용한 제안을받을 did't.

  • +0

    모든 매개 변수를 명시 적으로 설정하는 것이 좋습니다. – zaph

    답변

    0

    여기에 게시하면 죄송합니다. 담당자가 적어서 의견을 추가 할 수 없습니다. 암호화 메커니즘에 문제가있을 수 있습니다. Rijndael padding or length is invalid

    +0

    도움을 주셔서 감사합니다. 그걸 확인했습니다. 그의 문제는 해독 및 암호화 할 때 diffrent IV를 사용하는 것으로 보입니다. 나와 동일하지 않습니다. 내 문제는 serialize 파일이 손상된 경우 방황합니다. 암호를 해독 한 원본 파일이 있지만 문제가 무엇인지 확인하는 방법을 모르겠습니다. – yang

    +0

    문제가 산발적으로 등장한 것 같아서 암호화가 될 수 있다고 생각합니다. 왜 내가 downvote ... 내가 upvote을 얻기 위해 암호화에 대한 강의를 게시 할 필요가 있었는지 궁금해. – J11

    +0

    강의로 우연히 만나는 것을 의미하지 않고 문제를 신속하게 설명하고 그 이유를 설명하려고 시도했습니다. 그것이 겸손 해지면 모든 것에 유감스럽게 생각합니다. –

    2

    당신이 직렬화 된 파일을 만드는 방법에 다소 미묘한 버그가 있습니다 :

    는 당신이 체크하십시오. 당신처럼 만들 파일을 여는 것이

    FileStream fs = new FileStream(FilePath, FileMode.OpenOrCreate); 
    

    대신 이렇게하면 코드가 작동합니다

    FileStream fs = new FileStream(FilePath, FileMode.Create); 
    

    을 파일을 열 OpenOrCreate에서 파일을 열면, 데이터 세트의 경우 축소하면 파일 끝에 추가 데이터가 생깁니다. 이것은 일반적으로 직렬화 된 객체에 대해서는 문제가되지 않지만 CBC와 PKCS7의 조합은 치명적입니다.

    대부분의 데이터를 문제없이 디코딩하지만 작성한 작은 파일의 마지막 블록은 OK를 디코딩하지만 패딩은 제거되지 않습니다. 괜찮습니다. 그러나 이전에 큰 파일의 다음 세그먼트가 읽히고 디코딩됩니다. CBC가 업데이트 한 IV가이 블록을 해독하는 것은 거의 틀림없이 틀림 없기 때문에, 그것은 말도 안되는 것으로 해석 할 것입니다. BinaryFormatter은이 가비지 데이터로는 아마 괜찮을 것이지만 파일의 마지막 블록을 디코드 할 시간이되면 PKCS7 패딩이 시작될 것이고 디코딩 된 값은 가비지이므로 올바른 패딩 데이터가 아닐 가능성이 높습니다. 디코더는 당신이보고있는 예외를 던집니다.

    +0

    고마워요. 그게 이유 인 것처럼 보입니다. 그래서 나는 테스트를하고, 큰 파일을 만들고 나서 축소합니다. 그래, 여분의 데이터는 파일의 끝 부분에 있습니다.하지만 비 직렬화하려고하면 어떤 오류도 없었습니다. 작은 파일 그것은 잘 작동합니다. 제가 빠진 것이 있습니까? – yang

    관련 문제