srsbiz / gist:8373451ed3450c0548c3
This comment has been minimized.
Copy link Quote reply
henryatman commented Dec 18, 2017
This comment has been minimized.
Copy link Quote reply
waltzie commented Feb 6, 2019 •
AES-256 refers to the key size, where the 256 in RIJNDAEL refers to block size
The above code work only if the MCRYPT_RIJNDAEL_128 encryption is made using a 128bit keysize.
Below the code to be able to decrypt MCRYPT_RIJNDAEL_128 encrypted using a 256 bit keylen
This comment has been minimized.
Copy link Quote reply
pzhuchkov commented Mar 14, 2019
I migrate from php 7.0 to 7.2 and remove mcrypt extension.
For correct encrypting data by openssl AES-128-CBC your example work fine
This comment has been minimized.
Copy link Quote reply
alexeygon commented Oct 1, 2019
This comment has been minimized.
Copy link Quote reply
oliverdotbecker commented Mar 12, 2020 •
Was able to replace the old mcrypt with some small changes!
Using «AES-256-CBC» instad of the 128 to replace the MCRYPT_RIJNDAEL_128.
This comment has been minimized.
Copy link Quote reply
franciscols commented Apr 13, 2020
Thanks for the @srsbiz and @oliverdotbecker! That last clue (AES-256-CBC) was instrumental to help my problem!
This comment has been minimized.
Copy link Quote reply
darwintnt commented Mar 3, 2021
It worked for me, thank you so much @srsbiz
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
php Encryption/Decryption
openssl_encrypt/decrypt
openssl_encrypt: Encrypt the data
openssl_decrypt: Decrypt the data
Since block cipher modes of operation require an IV which is random and unpredictable, or at least unique for each message encrypted with a given key. Different block cipher modes have different IV length requirement for example
| Cipher Mode | IV Length |
|---|---|
| aes-128-cbc | 16 |
| camellia-192-ofb | 16 |
| cast5-cbc | 8 |
| bf-cbc | 8 |
| aes-256-gcm | 12 |
Examples
A Great Feedback by Michal Е paДЌek
aes-128-cbc encrypt/decrypt example
Note: AES-CBC mode vulnerable to padding oracle attacks, Kindly Don’t use these
The above example will output something similar to:
aes-192-cfb encrypt/decrypt example
The above example will output something similar to:
aes-256-ofb encrypt/decrypt example
The above example will output something similar to:
aes-256-gcm encrypt/decrypt example
Note: AEAD is not supported for all version prior to the PHP 7.1, This example utilizes php 7.1
The above example will output something similar to:
camellia-256-ofb encrypt/decrypt example
The above example will output something similar to:
PHP AES шифрует/расшифровывает
Кто-нибудь знает, в чем проблема?
Расшифровка: —‚(ÑÁ ^ yË
ОТВЕТЫ
Ответ 1
Этот пример небезопасен! Не используйте его!
Но в этом коде есть и другие проблемы, которые делают его небезопасным, в частности использование ECB (который не является режимом шифрования, только строительным блоком, поверх которого могут быть определены режимы шифрования). См. Fab Sa answer для быстрого устранения худших проблем и Скотт ответ за то, как это сделать правильно.
Ответ 2
Пожалуйста, используйте существующую защищенную библиотеку шифрования PHP
Как правило, плохая идея написать свою собственную криптографию, если у вас нет опыта в реализации криптографии других людей.
Ни один из примеров здесь аутентифицирует зашифрованный текст, что делает их уязвимыми для бит-переписывающих атак.
Если вы можете установить расширения PECL, libsodium еще лучше
Затем, чтобы проверить это:
Это можно использовать в любой ситуации, когда вы передаете данные клиенту (например, зашифрованные файлы cookie для сеансов без серверного хранилища, зашифрованные параметры URL и т.д.) с достаточно высокой степенью уверенности, которую конечный пользователь не может расшифровать или надежно вмешиваться в него.
Так как libsodium является межплатформенным, это также упрощает общение с PHP, например, Java-приложения или собственные мобильные приложения.
Примечание. Если вам необходимо добавить зашифрованные файлы cookie с помощью libsodium для вашего приложения, мой работодатель Paragon Initiative Enterprises разрабатывает библиотеку под названием Halite, который делает все это для вас.
Ответ 3
Если вы не хотите использовать сильную зависимость для чего-то решаемого в 15 строках кода, используйте встроенные функции OpenSSL. Большинство установок PHP поставляются с OpenSSL, который обеспечивает быстрое, совместимое и безопасное шифрование AES в PHP. Что ж, это безопасно, если вы следуете передовым методам.
IV является публичной информацией и должна быть случайной для каждого сообщения. Хеш гарантирует, что данные не были подделаны.
редактирование: обновлено для использования hash_equals и добавлено IV к хешу.
Ответ 4
Для информации MCRYPT_MODE_ECB не используется IV (вектор инициализации). Режим ECB делит ваше сообщение на блоки, и каждый блок зашифровывается отдельно. Я действительно не рекомендую.
Режим CBC использует IV, чтобы каждое сообщение было уникальным. CBC рекомендуется и должен использоваться вместо ECB.
Вы должны запастись IV, чтобы декодировать каждое сообщение (IV не являются секретными). Каждое сообщение уникально, потому что каждое сообщение имеет уникальный IV.
Ответ 5
Несколько важных замечаний, которые следует учитывать при шифровании AES:
Ответ 6
Вы можете легко проверить это, например. попробовав:
Ответ 7
Я использую код вещи для CCAVenue Payment Getway
Пользователь кода
Ответ 8
Ответ 9
Если вы используете PHP> = 7.2, рассмотрите возможность использования встроенного расширения ядра натрия для шифрования.
AES — американский стандарт шифрования. Часть IV
В этой IV части завершаем описание шифра АЕS — 128. Для читателей не знакомых с предшествующими частями работы поясню, что материал излагается в учебных целях и это накладывает ряд особенностей (детализация, числовые примеры, математические основы и др.) Предполагается не просто ознакомление со стандартом, а использование излагаемого материала для разработки алгоритмов зашифрования и дешифрования (при отсутствии ключа). Авторы множества известных в сети (и вне её) публикаций не ставили перед собой таких целей, что делает эти публикации малопригодными для наших целей.
Процесс обратный зашифрованию называется расшифрованием сообщений. Для расшифрования (с ключом) шифрованных текстов (ШТ) создается инверсная таблица замен и раундовые ключи, которые используются в обратном порядке относительно схемы для шифрования, но подобно процессу зашифрования.
Расшифрование сообщений AES
Перечень операций при расшифровании сообщения остается таким же как и при зашифровании. Подробнее с операциями можно ознакомиться здесь. Это достаточно общий принцип шифров — единая аппаратная реализация при шифровании и расшифровании, что обеспечивается наборами одинаковых функций для обоих процессов. Меняется лишь исходный текст и последовательность подачи на вход ключей.
Процесс расшифрования сообщений реализуется как последовательность обратных (инверсных) преобразований, используемых при шифровании, в порядке обратном их следованию при зашифровании. Очевидно также, что раундовые ключи используются в соответствующей последовательности: вначале ключ, полученный последним, затем предпоследний и так далее до первого раундового ключа.
Названия всех преобразований остаются теми же, но получают префикс Inv. Будем рассматривать их в той же последовательности, что и ранее. Шифр AES допускает два варианта расшифрования обратного и прямого, что подробно рассматривается далее.
Вариант обратного расшифрования
Обратное расшифрования сообщения — естественный процесс обращающий вспять процесс зашифрования.
Операция AddRoundKey остается как и при зашифровании сообщения такой же (без изменения) S + Ki для всех 16 байтов состояния State, т.е. является обратной самой себе. Это объясняется тем, что используется в операции логика XOR, а байты представимы двоичными числами.
К шифрованному сообщению просто добавляется (суммируется) ключ последнего раунда.
В таблице показаны примеры замен двух байтов 4А → 5С и 9F→6Е заливка зеленым цветом.
Результат такого умножения в скалярном представлении получает вид:
Для получения ИТ из ШТ алгоритм расшифрования использует те же значения параметров, которые использовались в процессе шифрования. Для формирования развернутого ключа правила остаются прежними.
Вариант прямого расшифрования
Особенности алгоритма расшифрования для некоторых обратных преобразований позволяют сохранить тот же порядок следования операций, что и в алгоритме шифрования, но при этом часть значений параметров требует изменений. Речь, прежде всего, идет о ключе (его разворачивании).
Исследования показали, что порядок следования функций SubBytes ( ) и ShiftRows ( ) не меняет значения результата, т. е. эти функции перестановочны (они коммутируют). Это положение (свойство) справедливо и для функций InvSubBytes ( ), InvShiftRows ( ). Эта закономерность легко объяснима. Дело в том, что обе функции оперируют с целыми байтами, а сдвиги выполняются на целое число, кратное байту, и не изменяют значения самих байтов.
Относительно операции MixColumns ( ) заметим следующее. Она является линейной по отношению к входным байтам (к данным).
InvMixColumns (State XOR Round Key) = InvMixColumns (State)XOR
InvMixColumns (Round Key).
Эти особенности функций (свойства) допускают изменение порядка их применения, т. е.
InvSubBytes (InvShiftRows ( )) = InvShiftRows (InvSubBytes ( )).
AddRoundKey (InvMixColumns ( )) = InvMixColumns (AddRoundKey ( )),
но при условии, что столбцы (32-разрядные слова) развернутого ключа расшифрования предварительно пропущены через функцию
InvMixColumns ().
Изложенное означает, что путь расшифрования ШТ может быть сделан эффективным за счет сохранения порядка использования функций, принятого для шифрования. Очевидно, что в этом случае затраты на аппаратную и программную реализацию шифра существенно сокращаются. Изменения касаются только процедуры формирования развертывания ключа.
В функции InvMixColumns ( ) необходимо выполнять преобразование типа переменной, входной параметр функции – двумерный массив байтов (квадрат), а развернутый ключ формируется как линейный (строка) массив 32-разрядных слов. По этой причине необходимо выполнить согласование типов до квадрата.
Покажем на примере 2-раундового преобразования два эквивалентных варианта процедуры расшифрования RIJNDAEL. Первый вариант – обычная инверсия функции шифрования. Второй вариант получается из первого путем изменения порядка следования операций в трех парах преобразований
InvShi ftRows ( ) → InvSubBytes ( ) 2 раза и
AddRoundKey ( ) → InvMixColumns ( ) 1 раз.
Результат преобразования сохраняется при переходе от исходной к обратной
последовательности выполнения операций в указанных парах.
Из таблицы видим, что процедура шифрования и второй вариант процедуры расшифрования совпадают с точностью до порядка использования раундовых ключей (при выполнении операций AddRoundKey), таблиц замен (при выполнении операций SubBytes () и InvSubBytes ()) и матриц преобразований (при выполнении операций MixColumns ( ) и InvMixColumns ( )).
Таблица 2 – Последовательность преобразований в двухраундовом варианте RIJNDAEL
Подобный результат оказывается справедливым для любого числа раундов.
Восстановление ключа шифра с использованием последнего подключа
Выработка раундовых ключей шифра AES. Процедура (Key Schedule) выработки раундовых ключей из 128-разрядного исходного ключа шифра представляет собой рекурсивную функцию. Эта функция подробным образом рассмотрена здесь. Начальными условиями для ее запуска являются 4 первых 4-х байтовых слова ключа (4×32 – разрядные слова), т. е. W[0], W[1], W[2], W[3]. Сформулируем задачу восстановления этого 128-разрядного ключа шифра следующим образом:
Пусть найдены компоненты раундового ключа 10 раунда W[43], W[42], W[41], W[40].
Требуется восстановить полный ключ шифра, располагая только этим раундовым ключом.
Удобно рассмотреть решение задачи вначале на числовых данных. За основу возьмем числовой пример, приведенный в работе FIPS PUB 197. Таблица 3 содержит ключ 10 раунда.
Процедура выработки раундовых ключей организована так, что она обеспечивает движение вперед (разворачивание ключа) по ряду предшествующих значений ключа. Для движения вспять из некоторой точки ряда значений необходимо располагать исходными данными процесса вычислений в этой точке возврата. Пусть точкой возврата будет последний шаг последнего 10 раунда, т. е. известны четыре 4-х байтовые слова ключа 10 раунда Nk = Nb = 4.
Таблица 3 – 128-разрядный ключ 10 раунда шифра AES
Далее результаты и действия алгоритма восстановления ключа помещены для удобства в таблицу 4, подобную (как бы опрокинутую) таблице формирования ключа.
Таблица 4 – Восстановление ключа шифра по известному ключу 10-го раунда
Пояснения к таблице 4. Отсчет номеров раундов следует в обратном порядке от 10-го к 1-му. В трех колонках (3, 8, 9) таблицы содержатся готовые ключи с различными текущими номерами, зависящими от номера i строки. В остальных клетках помещаются вспомогательные данные промежуточных вычислений. Таким образом, значение ключа W[i] появляется в таблице три раза в трех колонках.
Колонки 1 и 2 – это номер r раунда и порядковый номер i 4-х байтового слова ключа. Последнее такое слово при шифровании имеет номер i = 43. В таблице его записываем в верхней строке правой (9) колонки. Номера i строк таблицы убывают и им в графе 9 соответствуют слова ключа W[i]. В 8-й колонке помещается слово W [i – Nk] ключа с уменьшенным номером W [43 – 4] = W[39], а в 3-ей колонке – слово ключа W[i – 1] = W[42], предшествующее W[i] = W[43].
Значение слова W[39] в 8-й колонке неизвестно и его находим по исходным данным с использованием формулы:
Для вычислений по формуле вначале выполняется проверка условий выбора строки формулы. Для W[43], i = 43 и Nk не делит нацело значение 43, т. е. для i = 43 значение W[i] определяется по нижней строке формулы: W[43] = W[42] W[39]. Здесь при заданных значениях W[42] и W[43] не определено последнее слагаемое W[39].
Тогда W[39] = W[43] W[42] = b6630ca6 — e13f0cc8.
В двоичной арифметике по mod2 операции сложения и вычитания равносильны, поэтому поразрядные вычисления для каждого из 4-х байтов ключевого слова W[39] приобретают вид (табл. 5):
Таблица 5 – Побайтные вычисления ключевого слова W[39].
Таким образом, найдено значение ключевого слова W[39] = 575c006e. Это значение переносим в 3-ю колонку, в строку i = 40 и в 9 колонку в строку i = 39.
Вычисления в строке i = 40 проводятся как при расширении ключа.
Неизвестное слово W[i – Nk] = W[40 –Nk] = W[i =36] должно определяться как в предыдущем случае разностью W[36] = W[40] 7 колонка строки 40.
В свою очередь значение в 7-й колонке строки 40 формируется как сумма (ХОR) 5-й и 6-й колонок. Значение 5-й колонки получается из W[39] после циклического сдвига RotWord (4-я колонка) и операции замены SubWord (5-я колонка).
Результаты этих действий приобретают вид
RotWord (575c006e) = 5c006e57; SubWord (5c006e57) = 4a639f5b.
После включения константы в ключевое слово имеем
Rcon [j=40/Nk]=36000000 (6-я колонка). Значение 7-й колонки получаем в виде (7 колонка)=(5 колонка)⊕(6 колонка)=4a639f5b⊕36000000=7c639f5b.
И окончательно для
W [36] = W[40] (7-я колонка строки 40) = d014f9a8 7c639f5b = ac7766f3.
Дальнейшие вычисления по аналогии приводят к окончательному результату — ключу шифра.
Имеется дополнительная информация относительно w и RotWord, функций Rcon и SubWord. Допустим, что обозначили через Kr [j] – j-ый байт r-го раундового ключа и w[i] как в документации.
Получаем: Kr = (w[Nk ∙ r], w[Nk∙ r + 1], · · ·, w[Nk ∙r + Nk − 1]).
Для разных i имеем следующие отношения
для i≠0 mod Nk, Nk ≤ i 8 ) → GF (2 8 ); x→x 2 + x. Образ этого отображения
Е1 = Im(l) имеет размерность dim GF(2) (Е1) = 7.
Уравнение x 2 + x = θ, где θ Е1 имеет два различных решения (корня уравнения) х1, х2є GF (2 8 ).
По теореме Виета х1⊕х2 = 1 сумма корней равна коэффициенту уравнения при х 2 с противоположным знаком, а произведение корней х1⊗х2 = θ равно свободному члену уравнения (в нашем уравнении с противоположным знаком).
Известно, что в арифметике двоичных полей операции суммирования и вычитания элементов по mod2 эквивалентны.
Таким образом, корни уравнения связаны соотношением х2 = х1⊕1, так как коэффициент при х в уравнении равен 1. Это означает, что в десятичном представлении элементов поля при лексикографическом их упорядочении они располагаются один за другим, отличаясь лишь на единицу.
Так при х = 0 и х = 1 и при х = 2 и х = 3 получаем:
Результаты (образы) отображения в приведенных парах (0, 1); (2, 3) полностью совпали, т.е. два прообраза соответствуют одному образу. Следовательно, мощность образа в два раза меньше мощности прообраза и его размерность его элементов равна 7.
Произведение пар корней, т. е. свободный член квадратного уравнения удобно определить через степенное представление элементов поля (прообразов). Показатели степеней при этом суммируются по mod255, т.е. по модулю порядка мультипликативной группы поля GF (2 8 ).
Алгоритм шифрования AES ECB 128/192/256
Реализация алгоритма симметричного шифрования AES (Advanced Encryption Standard) в режиме ECB (Electronic codebook) с различной длиной ключа 128/192/256 без использования внешних компонент и zip-файлов.
Обработка тестировалась на платформе 1С версии 8.3.15.1830.
Скачать файлы
Специальные предложения
хм, строки конечно не сильно часто вызываются, но 2304 раза они были вызваны с моими тестовыми данными, разница всё же есть:
Да и вообще функция наверное даже не нужна. Эта оптимизация чуть добавила скорости, в пределах погрешности. Смотрю дальше, где и что можно оптимизировать. Но уже сейчас смущает частое перекодирование из hex в десятичную и обратно. Нужно ли оно так часто и много? посмотрим.
тестовая строка проста:
6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af 8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417b e66c37106bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb7 6fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17 ad2b417be66c3710
зашифрованная строка соответственно
3ad77bb40d7a3660a89ecaf32466ef97f5d3d58503b9699de785895a96fd baaf43b1cd7f598ece23881b00e3ed0306887b0c785e27e8ad3f82232071 04725dd43ad77bb40d7a3660a89ecaf32466ef97f5d3d58503b9699de785 895a96fdbaaf43b1cd7f598ece23881b00e3ed0306887b0c785e27e8ad3f 8223207104725dd4









