Я проголосовал за каждый ответ (ну, те, что здесь до моего!) Здесь, так как они все правильные.
Однако есть большая ошибка, которую вы совершаете (одну, которую я тоже сделал раньше) - НЕ ИСПОЛЬЗУЙТЕ СТРОКУ, ЧТОБЫ ЗАВЕРШИТЬ IV ИЛИ КЛЮЧ !!!
Строковый литерал времени компиляции является строкой Unicode и, несмотря на то, что вы не получите ни случайного, ни достаточно широкого разброса значений байтов (потому что даже случайная строка содержит много повторяющихся байтов из-за узкого диапазон байтов печатаемых символов), очень легко получить символ, который на самом деле требует 2 байта вместо 1 - попробуйте использовать 8 из более экзотических символов на клавиатуре, и вы поймете, что я имею в виду - при преобразовании в байты вы может содержать более 8 байтов.
Хорошо - значит, вы используете кодировку ASCII - но это не решает неслучайную проблему.
Вместо этого вы должны использовать RNGCryptoServiceProvider для инициализации вашего IV и ключа и, если вам нужно захватить постоянное значение для этого для будущего использования, тогда вы все равно должны использовать этот класс - но захватить результат как hex string или Base-64 закодированное значение (хотя я предпочитаю hex).
Чтобы достичь этого просто, я написал макрос, который я использую в VS (привязан к сочетанию клавиш CTRL + SHIFT + G, CTRL + SHIFT + H ), который использует .Net PRNG для произвести шестнадцатеричную строку:
Public Sub GenerateHexKey()
Dim result As String = InputBox("How many bits?", "Key Generator", 128)
Dim len As Int32 = 128
If String.IsNullOrEmpty(result) Then Return
If System.Int32.TryParse(result, len) = False Then
Return
End If
Dim oldCursor As Cursor = Cursor.Current
Cursor.Current = Cursors.WaitCursor
Dim buff((len / 8) - 1) As Byte
Dim rng As New System.Security.Cryptography.RNGCryptoServiceProvider()
rng.GetBytes(buff)
Dim sb As New StringBuilder(CType((len / 8) * 2, Integer))
For Each b In buff
sb.AppendFormat("{0:X2}", b)
Next
Dim selection As EnvDTE.TextSelection = DTE.ActiveDocument.Selection
Dim editPoint As EnvDTE.EditPoint
selection.Insert(sb.ToString())
Cursor.Current = oldCursor
End Sub
Теперь все, что вам нужно сделать, это превратить ваш шестнадцатеричный строковый литерал в байтовый массив - я делаю это с помощью полезного метода расширения:
public static byte[] FromHexString(this string str)
{
//null check a good idea
int NumberChars = str.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
bytes[i / 2] = Convert.ToByte(str.Substring(i, 2), 16);
return bytes;
}
Возможно, есть лучшие способы сделать это, но у меня это работает.