Кодирование каждый раз производит разные хэши

1

У меня есть следующая структура, которую я использую для моей функции Encrypt. Я, возможно, что-то упустил из структуры в моем коде, потому что я парень PHP, а не С#.

Что происходит, так это то, что каждый раз в моем журнале изменяется хэш, чего он не должен и должен только соответствовать одному конкретному хешу для ввода. Это связано с этим следующим вопросом..

Также случается, когда я использую свою кодовую фразу, которая является "MysecretPassPhrase", у меня проблема с байтовой длиной. Я не хочу менять эту кодовую фразу, поскольку она является точной длиной моей истинной фразы, так что я могу сделать код, чтобы исправить проблему?

Когда я использовал более длинную кодовую фразу, такую как "MysecretPassPhrase123456" с "Дэвидом" в качестве входа, каждый раз выводит разные хэши: CJ + mgAeL9x + qMLId + nHvXw ==, Ladj1D + LJgZCrwPatsQsEQ == и т.д.

Требуемая структура

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

ошибка

CryptographicException: Key size not supported by algorithm System.Security.Cryptography.SymmetricAlgorithm.set_Key (System.Byte[] value) (at/Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Security.Cryptography/SymmetricAlgorithm.cs:176) APIConnector.Encrypt(System.String toEncrypt) (at Assets/APIConnector.cs:59)

Код

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

void submit() {
  Debug.Log ("first name is: " + firstName + " encrypted is: " + Encrypt(firstName));
}


public static string Encrypt (string toEncrypt) {
  byte[] keyArray = UTF8Encoding.UTF8.GetBytes ("MysecretPassPhrase");
  // 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);
}
Теги:
rijndael
rijndaelmanaged

1 ответ

0
Лучший ответ

Приведенная выше ошибка "Размер ключа не поддерживается алгоритмом". Ваш массив ключей - 18 байтов (UTF8), который составляет 144 бита, а не 128 бит, как указано в блоке.

Вы должны изменить ключ на допустимый размер. См. Эту статью для получения дополнительной информации.

  • 0
    Спасибо @PeterGluck, высоко ценится объяснение.

Ещё вопросы

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