Rijndael неправильно шифрует / дешифрует выходные данные

1

Моя структура для шифрования/дешифрования С# выглядит следующим образом:

  • Шифр: Rijndael (AES)
  • Размер блока: 128 бит (16 байт)
  • Режим: CBC (цепочка блоков шифрования)
  • Ключ: кодовая фраза MD5
  • IV: То же, что и ключ
  • Кодирование данных: символ Base64
  • Кодировка UTF-8

Я использую вход 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);
    }
Теги:
encryption
cryptography
rijndael
rijndaelmanaged

2 ответа

0

Вы должны передать зашифрованное значение в 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));
  • 0
    офигенно, решает одну проблему, спасибо :) Просто хэш md5 не верен и я не могу понять почему .. Я использую все в соответствии со своей структурой или нет?
  • 0
    Возможно, не использовать MD5 в моем коде?
Показать ещё 4 комментария
0

Ваш метод 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. Переход на более короткую или более длинную строку приведет к поломке программы.

  • 0
    благодарю вас! Это решает одну проблему, теперь другая проблема заключается в том, что хеш (зашифрованный в журнале) является неправильным. Можете ли вы увидеть что-нибудь еще, что может сделать что-то, чтобы изменить это от того, чем оно должно быть?
  • 0
    Кроме того, «SecretPassphrase» - это не мой используемый ключ, я просто использую его в моем примере, поскольку он 16 бит :), и мой ключ также 16 бит, не волнуйтесь :)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню