У меня есть следующая структура, которую я использую для своей функции 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);
}
firstName
, который был отправлен, поскольку это дополнительный код, который решит проблему. Но я использовалEncrypt(firstName)
для хеширования ввода. - person DT.DTDG   schedule 22.05.2014