размер массива байтов c # - PullRequest
       14

размер массива байтов c #

2 голосов
/ 05 сентября 2011

Я использую dll для криптографии (des), которая написана кем-то. DLL включает в себя шифрование, класс decyrpt, и эти классы включают методы. Требуется ключ длиной 8 байт (64 бита). Я описываю строку для ключа. символ - один байт). А затем байты кодирования.

        string keyText= "abcdefghsdsdfsdfsdf";

        UTF8Encoding encoding = new UTF8Encoding();

        byte[] keyfile = new byte[8];
        keyfile = UTF8Encoding.UTF8.GetBytes(keyValue);

выше, хотя я описал размер байтового массива 8, размер переполнения байтового массива, это была длина строкового значения.

Любое предложение. Спасибо.

Ответы [ 3 ]

4 голосов
/ 05 сентября 2011

Чтобы сделать это правильно, посмотрите на PasswordDeriveBytes Class и выберите один из перегруженных методов.

Да, вам нужно будет выбрать соль, но это может быть фиксированнымценность запеченная в вашей программе.Соль не должна храниться в секрете.

И чтобы ответить на технический вопрос, не связанный с безопасностью:

    byte[] keyfile = new byte[8];
    keyfile = UTF8Encoding.UTF8.GetBytes(keyValue)

Этот код создает 2 массивов.Первый - 8 байтов, но он немедленно отбрасывается.GetBytes() создает новый с размером, который он определяет.Вам нужно хешировать этот массив, а затем вы можете выбрать первые 8 хешей, что и делает PasswordDeriveBytes для вас.

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

Нет смысла инициализировать ключевой файл пустым байтовым массивом.GetBytes возвращает новый байтовый массив, который заменяет исходный, и он будет настолько большим, насколько это необходимо для кодирования всего ввода.

Чтобы получить только восемь байтов кодировки, почему бы вам просто не предоставить первыйвосемь символов?Все они являются ASCII, поэтому они будут занимать один байт каждый:

 byte[] keyfile = UTF8Encoding.UTF8.GetBytes(keyValue.Substring(0, 8));

Более того, если вы используете keyText в качестве пароля для синтеза ключа шифрования, это действительно плохая идея.Вы просто отбрасываете любые символы пароля после первых восьми.Вместо этого используйте некоторую форму криптографического хэша для преобразования паролей в ключи.Я только что заметил Ответ Хенка Холтермана указывает на соответствующий API.

0 голосов
/ 05 сентября 2011

Вы создали массив из 7 элементов (не 8), но вы вообще не используете этот массив.Метод GetBytes возвращает новый массив, и вы помещаете ссылку на этот массив в переменную, оставляя созданный вами массив сборщику мусора.

Если вы хотите получить первые 8 байтовмассив, скопируйте содержимое вместо замены массива:

string keyText= "abcdefghsdsdfsdfsdf";

UTF8Encoding encoding = new UTF8Encoding();

byte[] keyfile = new byte[8];
byte[] decoded = UTF8Encoding.UTF8.GetBytes(keyValue);

Array.Copy(decoded, keyfile, 8);
...