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

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

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

Что также происходит, так это то, что когда я использую свою тестовую фразу-пароль, которая называется «MysecretPassPhrase», у меня возникает проблема с длиной байта. Я не хочу менять эту кодовую фразу, так как ее длина совпадает с моей истинной кодовой фразой. Могу ли я что-нибудь сделать с помощью кода, чтобы решить эту проблему?

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

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

  • Шифр 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);
}

person DT.DTDG    schedule 21.05.2014    source источник
comment
@JonathonReinhart Я не добавлял ввод firstName, который был отправлен, поскольку это дополнительный код, который решит проблему. Но я использовал Encrypt(firstName) для хеширования ввода.   -  person DT.DTDG    schedule 22.05.2014
comment
Приведенная выше ошибка: размер ключа не поддерживается алгоритмом. Ваш массив ключей составляет 18 байт (UTF8), что составляет 144 бита, а не 128 бит, как указано в вашем BlockSize. см. эту статью.   -  person Peter Gluck    schedule 22.05.2014
comment
Спасибо @PeterGluck, но даже изменение размера блока на 144 все равно выдает ту же ошибку.   -  person DT.DTDG    schedule 22.05.2014
comment
Нет, вы не можете изменить размер блока на произвольное значение (см. эту статью). Вы должны изменить ключ на допустимый размер.   -  person Peter Gluck    schedule 22.05.2014
comment
@PeterGluck Аааа, спасибо, что указали на это! +1 вам, сэр. Помимо этого, вы видите что-нибудь еще в отношении моей необходимой структуры, чего мне не хватает в коде? Еще раз спасибо.   -  person DT.DTDG    schedule 22.05.2014
comment
Хеширование и шифрование несколько связаны, хотя и являются очень разными вещами. Вы пытаетесь зашифровать данные, чтобы открытый текст можно было восстановить позже? Или вы действительно пытаетесь сгенерировать односторонний хэш из набора входных данных?   -  person Jonathon Reinhart    schedule 22.05.2014


Ответы (1)


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

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

person Peter Gluck    schedule 21.05.2014
comment
Спасибо @PeterGluck, очень ценное объяснение. - person DT.DTDG; 22.05.2014