Как использовать результаты шифрования 3DES для вычисления значения MAC - PullRequest
0 голосов
/ 05 октября 2011

У меня есть проект для работы в 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("-", "");
}

Я действительно не знаю, что делать дальше.

1 Ответ

1 голос
/ 05 октября 2011

С тем, что у вас сейчас есть, не так:

  1. Вы указываете, что вам нужно использовать IV, но вы используете ECB (который не использует IV)
  2. Вы генерируете IV случайным образом, используя GenerateIV ().Это приведет к тому, что результат будет отличаться каждый раз, если вы не используете ECB.
  3. Вы выполняете преобразование только для последнего блока, а не для целых данных.

См. Следующий пример кода, чтобы получить представление о том, как использовать 3DES в C #:http://msdn.microsoft.com/en-us/library/system.security.cryptography.tripledescryptoserviceprovider.aspx

Я предполагаю, что, поскольку вы указываете IV, на самом деле вы должны использовать CBC вместо ECB.Попробуйте и посмотрите, что вы получите.

...