2014-05-23 2 views
1

다음 기능으로 암호화 및 암호 해독을 시도하지만 패딩 오류가 발생합니다.잘못된 PKCS7 패딩 오류 : 길이가 잘못되었습니다. 106

PaddingMode에서 None으로 설정하면 로그에 일부 알파 문자 및 임의 기호가 반환됩니다.

I 아마도 다음과 정확한 구조 설정 뭔가 누락

:

  • 암호 Rijndael을 (AES)
  • 블록 사이즈 128 비트 (16 바이트)
  • 모드 CBC을 (암호화 블록 키 체인)
  • MD5 해시 암호
  • IV 같은 키
  • 데이터 인코딩 Base64로 문자
  • 는 UTF-8 인코딩

이 오류 및 충족 위의 구조를 보장 어떤 도움을 고정 어떤 도움을 크게 감상 할 수있다! 감사합니다

오류

CryptographicException: Bad PKCS7 padding. Invalid length 106. 
Mono.Security.Cryptography.SymmetricTransform.ThrowBadPaddingException (PaddingMode padding, Int32 length, Int32 position) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/Mono.Security.Cryptography/SymmetricTransform.cs:363) 
Mono.Security.Cryptography.SymmetricTransform.FinalDecrypt (System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/Mono.Security.Cryptography/SymmetricTransform.cs:515) 
Mono.Security.Cryptography.SymmetricTransform.TransformFinalBlock (System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/Mono.Security.Cryptography/SymmetricTransform.cs:554) 
System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock (System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Security.Cryptography/RijndaelManagedTransform.cs:94) 
APIConnector.Decrypt (System.String toDecrypt) (at Assets/APIConnector.cs:85) 

내 코드

using UnityEngine; 
using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Security.Cryptography; 
using System.Text; 
using System.Xml; 
using System.IO; 

public class APIConnector : MonoBehaviour { 

    // Use this for initialization 
    void Start() { 

     Debug.Log ("Starting API connector"); 


    } 

    // Update is called once per frame 
    void Update() { 



    } 

    static string data; 
    string firstName=""; 
    string password=""; 

    void OnGUI() { 

     firstName = GUILayout.TextField (firstName, GUILayout.Width(300)); 
     password = GUILayout.TextField (password, GUILayout.Width(300)); 

     if (GUILayout.Button ("Submit")) 
         submit(); 

    } 

    //Our functions 

    void submit(){ 

     Debug.Log ("Name is: " + firstName + " encrypted is: " + Encrypt(firstName)); 
     Debug.Log ("Name is: " + firstName + " decrypted is: " + Decrypt(firstName)); 

    } 


      public static string Encrypt (string toEncrypt) 
      { 
     byte[] keyArray = UTF8Encoding.UTF8.GetBytes ("SecretPassphrase"); 
       // 256-AES key 
     int numBytes = System.Text.Encoding.UTF8.GetBytes(toEncrypt).Length; 
     Debug.Log ("Bytes: " + numBytes); 
       byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes (toEncrypt); 
       RijndaelManaged rDel = new RijndaelManaged(); 
       rDel.Key = keyArray; 
       rDel.BlockSize = 128; 
       rDel.Mode = CipherMode.CBC; 
       // http://msdn.microsoft.com/en-us/library/system.security.cryptography.ciphermode.aspx 
       rDel.Padding = PaddingMode.PKCS7; 
       // better lang support 
       ICryptoTransform cTransform = rDel.CreateEncryptor(); 
       byte[] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length); 
       return Convert.ToBase64String (resultArray, 0, resultArray.Length); 
      } 

      public static string Decrypt (string toDecrypt) 
      { 
     byte[] keyArray = UTF8Encoding.UTF8.GetBytes ("SecretPassphrase"); 
       // AES-256 key 
     byte[] encryptedData = System.Convert.FromBase64String(toDecrypt); 
       //byte[] toEncryptArray = Convert.FromBase64String (toDecrypt); 
       RijndaelManaged rDel = new RijndaelManaged(); 
       rDel.Key = keyArray; 
       rDel.BlockSize = 128; 
       rDel.Mode = CipherMode.CBC; 
       rDel.IV = rDel.Key; 
       // http://msdn.microsoft.com/en-us/library/system.security.cryptography.ciphermode.aspx 
       rDel.Padding = PaddingMode.PKCS7; 
       // better lang support 
       ICryptoTransform cTransform = rDel.CreateDecryptor(); 
     byte[] resultArray = cTransform.TransformFinalBlock (encryptedData, 0, encryptedData.Length); 
       return UTF8Encoding.UTF8.GetString (resultArray); 
      } 


} 

답변

2

당신은 암호화 등 임의의 IV가 자동으로 사용되는 경우 IV를 설정하는 표시되지 않습니다. 은 암호 해독 중에 IV를 설정하는이므로 (암호화 중에 사용 된 것과 동일하지 않음) 첫 번째 출력 블록이 손상됩니다. 메시지가 짧으면 (< 블록 1 개) 패딩이 손상되어이 오류가 발생할 수 있습니다.

평상시처럼 중요한 이슈들 중에서 키 유도와 동일한 IV를 사용하는 것이 나쁜 실행이며, 이는 키 유도를 위해 Encoding.UTF8.GetBytes()을 사용하는 것과 마찬가지입니다.

+0

답장을 보내 주셔서 감사합니다. 나는 C#에 대해 매우 새롭고 C# 암호화에 대해서도 새로운 것이다. 수정 사항의 예를 제공하기 위해 답변을 편집 할 수 있습니까? 감사! –

+0

@ DT.DTDG -'Encrypt' 메쏘드에'rDel.IV = rDel.Key;'행을'Decrypt' 메쏘드와 같은 위치에 추가하면됩니다. – Iridium

+0

감사합니다. 많이 감사드립니다! 대답을 수락했습니다. 또한 'Encoding.UTF8.GetBytes()'를 사용하는 것보다 더 나은 방법을 언급 했습니까? 체중 감량을 자유롭게하십시오. –

관련 문제