Звучит так, будто вы просто хотите установить 128-битную клавишу для ключа тройного дес.
Я полагаю, что в этом случае, если вы предоставляете 128-битный ключ, он разделяет его на два 64-битных ключа и использует первый как K1 и K3, а второй как K2, что именно то, что вы хотите.
К сожалению, я не могу найти источник, чтобы процитировать это, но я недавно много читал на эту тему, когда сам реализовал некоторые криптографические вещи и узнал о длине ключей, и это то, что я обнаружил.
Если у вас уже есть K1 и K2 в качестве байтовых массивов, тогда вы можете просто использовать симпатичный метод расширения linq и выполнить:
SymmetricAlgorithm cryptoService = new TripleDESCryptoServiceProvider();
byte[] myKey = K1.Concat(K2).ToArray();
cryptoService.Key = mKey;
Это будет тогда делать, как вы хотите.
В ответ на вашу обновленную часть вопроса у вас есть два ключа - шестнадцатеричное представление последовательности байтов. 0x0123456789ABCDEF
- это 16 шестнадцатеричных символов, но это эквивалентно 8 байтам информации, поскольку каждый символ содержит 4 бита - два составляют байт.
Чтобы преобразовать эту строку в байтовый массив, можно использовать следующую функцию:
public static 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;
}
(из Как преобразовать массив байтов в шестнадцатеричную строку и наоборот? )
Это будет использоваться следующим образом:
string K1="0x0123456789ABCDEF";
string K2="0xFEDCBA9876543210";
byte[] key = StringToByteArray(K1).Concat(StringToByteArray(K2)).ToArray();
При реализации TDES вам нужно будет согласовать ключ, режим блочного шифра, метод заполнения, а в большинстве блочных режимов вам потребуется вектор инициализации. Возможно, вы также захотите использовать код аутентификации сообщения.
Чтобы получить вектор инициализации, вам нужно сделать что-то вроде:
cryptoService.GenerateIV();
byte[] iv = cryptoService.IV;
Я настоятельно советую читать страницы о шифровании, чтобы лучше понять, чем на самом деле являются различные вещи, а не просто писать код. Это сделает вас более уверенным в своей безопасности и заставит вас чувствовать себя более уверенно, общаясь с другими. Я позволил себе включить некоторые ссылки, большинство из которых можно найти, просто погуглив.
Полезные ссылки:
http://en.wikipedia.org/wiki/Initialization_vector - все о векторах инициализации
http://en.wikipedia.org/wiki/Triple_DES - по алгоритму TDES
http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation - Как последовательные блоки данных взаимодействуют друг с другом.
http://en.wikipedia.org/wiki/Padding_%28cryptography%29 - Не очень важно, за исключением того, что существуют разные способы заполнения, и обе стороны должны использовать один и тот же (конечно).
http://chargen.matasano.com/chargen/2009/7/22/if-youre-typing-the-letters-a-e-s-into-your-code-youre-doing.html - Отличный и забавный комментарий об использовании шифрования и о том, где есть недостатки и что шифрование может и не может делать.
http://en.wikipedia.org/wiki/Message_authentication_code - Как подтвердить, что ваше сообщение не было подделано