1
다음 기능으로 암호화 및 암호 해독을 시도하지만 패딩 오류가 발생합니다.잘못된 PKCS7 패딩 오류 : 길이가 잘못되었습니다. 106
PaddingMode
에서 None
으로 설정하면 로그에 일부 알파 문자 및 임의 기호가 반환됩니다.
:
- 암호 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);
}
}
답장을 보내 주셔서 감사합니다. 나는 C#에 대해 매우 새롭고 C# 암호화에 대해서도 새로운 것이다. 수정 사항의 예를 제공하기 위해 답변을 편집 할 수 있습니까? 감사! –
@ DT.DTDG -'Encrypt' 메쏘드에'rDel.IV = rDel.Key;'행을'Decrypt' 메쏘드와 같은 위치에 추가하면됩니다. – Iridium
감사합니다. 많이 감사드립니다! 대답을 수락했습니다. 또한 'Encoding.UTF8.GetBytes()'를 사용하는 것보다 더 나은 방법을 언급 했습니까? 체중 감량을 자유롭게하십시오. –