У меня есть проект для работы в C#
.У меня есть требования к проекту, и эта часть - всего лишь небольшая часть всего проекта.Мне дали данные испытаний и результат.Мне нужно закодировать его, чтобы получить правильные результаты.И в данный момент я не получаю окончательный результат.
Пожалуйста, не подвергайте сомнению и не критикуйте требования, это то, что у меня есть, и мне нужно разобраться и кодировать его.
Мне сказали взять входную строку "abc"
и вычислить для этого хеш SHA-1
.Я получил эту часть для работы, вот код:
private string CalculateSHA1Hash(string text, Encoding characterEncoding)
{
byte[] buffer = characterEncoding.GetBytes(text);
SHA1CryptoServiceProvider sha1CryptoServiceProvider = new SHA1CryptoServiceProvider();
byte[] s = sha1CryptoServiceProvider.ComputeHash(buffer);
string hash = BitConverter.ToString(sha1CryptoServiceProvider.ComputeHash(buffer)).Replace("-", "");
return hash;
}
Я использовал UTF8Encoding
, потому что ни один не был указан в документе требований.В результате я получил A9993E364706816ABA3E25717850C26C9CD0D89D
.
. Затем мне сказали разбить эту строку на 3 строковых блока по 16 символов в каждом и использовать только 1-й блок.Вот что я получил:
block1: A9993E364706816A
Мне также дали 2 ключа:
K1: 0123456789ABCDEF
K2: FEDCBA9876543210
Блок 1 должен использоваться в качестве входной строки для шифрования 3DES с использованием 2 ключей.
Результат зашифрованного текста должен быть 6E5271A3F3F5C418
, я не получаю это.
Ниже приведены мои расчеты.Может кто-нибудь, пожалуйста, посмотрите, правильно ли я это делаю и где я делаю это неправильно.Chris
(на SO) дал мне несколько статей для чтения, но я все еще не могу получить результаты, которые мне нужны.Есть ли что-то, что уже обслуживает это, я просто запутался, или что?
public string Encrypt(string message)
{
string result = string.Empty;
// Calculate the SHA1 hash
UTF8Encoding characterEncoding = new UTF8Encoding();
string sha1HashResult = CalculateSHA1Hash(message, characterEncoding);
block1 = sha1HashResult.Substring(0, 16);
byte[] block1ByteArray = characterEncoding.GetBytes(block1);
string key = "0x" + accessKey1 + accessKey2 + accessKey1;
byte[] keyByteArray = StringToByteArray(key).ToArray();
byte[] enc = ComputeTripleDesEncryption(block1ByteArray, keyByteArray);
result = ByteArrayToString(enc);
return result;
}
public byte[] ComputeTripleDesEncryption(byte[] plainText, byte[] key)
{
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Key = key;
des.GenerateIV();
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
ICryptoTransform ic = des.CreateEncryptor();
byte[] enc = ic.TransformFinalBlock(plainText, 0, plainText.Length);
return enc;
}
private byte[] StringToByteArray(String hex)
{
if (hex.Substring(0, 2) == "0x")
{
hex = hex.Substring(2);
}
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
{
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
}
return bytes;
}
private string ByteArrayToString(byte[] ba)
{
string hex = BitConverter.ToString(ba);
return hex.Replace("-", "");
}
Я действительно не знаю, что делать дальше.