Моя структура для шифрования/дешифрования С# выглядит следующим образом:
Я использую вход Player
для обоих входов в качестве теста, однако он не возвращает правильный вывод MD5 хэш, а также есть небольшая проблема с моей Decrypt
функции для byte[] toEncryptArray = Convert.FromBase64String (toDecrypt);
,
Неверный хеш-вывод и ошибка
playerID: Player зашифрован: ZCKgr4veKtCDrD6mL + P6Yg ==
FormatException: Недопустимая длина. System.Convert.FromBase64String (System.String s) (в /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System/Convert.cs:146) APIConnector.Decrypt(System.String toDecrypt) (в активах /APIConnector.cs:122)
Любые идеи о том, что я могу сделать, чтобы 1) исправить эту ошибку и 2) получить мой хэш-выход правильно на основе структуры ym выше? Благодарю!
void submit(){
Debug.Log ("playerID is: " + firstName + " encrypted is: " + Encrypt(firstName));
Debug.Log ("password is: " + password + " decrypted is: " + Decrypt(password));
}
public static string Encrypt (string toEncrypt)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes ("SecretPassphrase");
// 256-AES key
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes (toEncrypt);
RijndaelManaged rDel = new RijndaelManaged ();
rDel.Key = keyArray;
rDel.IV = keyArray;
rDel.Mode = CipherMode.CBC;
rDel.BlockSize = 128;
// 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[] toEncryptArray = Convert.FromBase64String (toDecrypt);
RijndaelManaged rDel = new RijndaelManaged ();
rDel.Key = keyArray;
rDel.IV = keyArray;
rDel.Mode = CipherMode.CBC;
rDel.BlockSize = 128;
// 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 (toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString (resultArray);
}
Вы должны передать зашифрованное значение в Decrypt, а не в firstname. Недопустимое преобразование Base64, потому что первое имя ясно.
Debug.Log ("playerID is: " + firstName + " encrypted is: " + Encrypt(firstName));
Debug.Log ("password is: " + password + " decrypted is: " + Decrypt(firstName));
Должен быть
string enc = Encrypt(firstName);
Debug.Log ("playerID is: " + firstName + " encrypted is: " + enc);
Debug.Log ("password is: " + password + " decrypted is: " + Decrypt(enc));
Ваш метод submit
не расшифровывает вашу зашифрованную строку, пытаясь расшифровать вашу незашифрованную исходную строку. Изменение метода submit
на нижеследующее делает выполнение программы без ошибок;
static void submit(){
string password = Encrypt(firstName);
Console.WriteLine ("playerID is: " + firstName +
" encrypted is: " + password);
Console.WriteLine ("password is: " + password +
" decrypted is: " + Decrypt(password));
}
Кроме того, так как вы на самом деле не MD5's свой ключ, вам повезло, что "SecretPassphrase" - это на самом деле 16 символов, которые являются точной длиной ключа MD5. Переход на более короткую или более длинную строку приведет к поломке программы.