Использование байтовых массивов и шестнадцатеричных значений в криптографии
Когда мы используем криптографию всегда, мы видим, что вместо значений String используются байтовые массивы. Но когда мы смотрим на методы большинства криптографических алгоритмов, они используют шестнадцатеричные значения для выполнения любых операций. Например. AES: MixColumns, SubBytes все эти методы (я полагаю, он использует) использует шестнадцатеричные значения для выполнения этих операций.
Можете ли вы объяснить, как эти байтовые массивы используются в этих операциях как шестнадцатеричные значения?
У меня есть задание для разработки алгоритма шифрования, поэтому любые соответствующие примеры кодов будут очень уместны.
4 ответа
Каждые четыре цифры двоичного кода составляют шестнадцатеричное число, поэтому вы можете легко конвертировать туда и обратно (см. http://en.wikipedia.org/wiki/Hexadecimal).
Я не думаю, что я полностью понимаю, что вы спрашиваете, хотя.
Самая важная вещь для понимания шестнадцатеричного - это то, что это система для представления числовых значений, как двоичные или десятичные. Это не более чем обозначение. Как вы, возможно, знаете, многие компьютерные языки позволяют указывать числовые литералы несколькими различными способами:
int a = 42;
int a = 0x2A;
Они хранят одно и то же значение в переменной 'a', и компилятор должен сгенерировать для них идентичный код. Разница между этими двумя строками будет потеряна в самом начале процесса компиляции, потому что компилятор заботится о указанном вами значении, а не о представлении, которое вы использовали для его кодирования в исходном файле.
Главный вывод: нет такой вещи как "шестнадцатеричные значения" - есть только шестнадцатеричные представления значений.
Тем не менее, вы также говорите о строковых значениях. Очевидно, 42!= "42"!= "2A"!= 0x2A. Если у вас есть строка, вам нужно проанализировать ее в числовом значении, прежде чем делать какие-либо вычисления с ней.
Криптография в целом, за исключением хеш-функций, представляет собой метод преобразования данных из одного формата в другой, который в основном называется шифрованным текстом с использованием секретного ключа. Секретный ключ может быть применен к зашифрованному тексту, чтобы получить исходные данные, также называемые простым текстом. В этом процессе данные обрабатываются на уровне байтов, хотя это может быть и уровень битов. Точка здесь текст или строки, на которые мы ссылаемся, находятся в ограниченном диапазоне байта. Пример ASCII определен в определенном диапазоне в байтовом значении от 0 до 255. На практике, когда выполняется криптографическая операция, символ преобразуется в эквивалентный байт, и с помощью ключа выполняется процесс. Теперь итоговый байт или байты, скорее всего, будут выходить за пределы читаемого человеком определенного текста, такого как кодированный ASCII и т. Д. По этой причине любые данные, к которым требуется применить криптографическую функцию, сначала преобразуются в байтовый массив. Например, текст, который нужно зашифровать: "Привет, как дела?", Должны быть выполнены следующие шаги: 1. byte[] data = "Привет, как дела?" . GetBytes() 2. Обрабатывать шифрование данных с использованием ключа, который также является байтом [] 3. Выходной двоичный объект называется cipherTextBytes[] 4. Шифрование завершено. 5. Используя Key[], процесс выполняется через cipherTextBytes [], который возвращает байты данных. 6 Простая новая строка (data[]) вернет строковое значение Hellow, как вы это делаете.
Это простая информация, которая может помочь вам лучше понять справочный код и руководства. Я никоим образом не пытаюсь объяснить вам суть криптографии здесь.
Байты, байтовые массивы и / или области памяти обычно отображаются в среде IDE (интегрированная среда разработки) и отладчике в шестнадцатеричном формате. Это потому, что это наиболее эффективное и четкое представление байта. Для опытного программиста довольно легко преобразовать их в биты (по его мнению). Например, вы можете ясно видеть, как работает XOR и shift. Эти (и дополнение) являются наиболее распространенными операциями при симметричном шифровании / хешировании.
Поэтому маловероятно, что программа выполняет такое преобразование, вероятно, это среда, в которой вы находитесь. Это и исходный код (который преобразуется в байты во время компиляции), вероятно, также использует много литералов в шестнадцатеричной записи.