Автор: Ян Кэ
В процессе развития ИИ-бизнеса нам часто приходится шифровать файлы модели.
Давайте поговорим о принципе шифрования AES и инженерной практике в AOE со следующих аспектов.
- Общие алгоритмы шифрования
- Мысли AOE о требованиях к шифрованию модели
- Принцип шифрования AES
- Инженерная практика AOE — сочетание AES и AOE
Общие алгоритмы шифрования
Общие алгоритмы шифрования в основном делятся на два типа:
Симметричное шифрование, используя метод шифрования с одним ключом, один и тот же ключ может использоваться для шифрования и дешифрования одновременно. Обычно используемые алгоритмы симметричного шифрования — это DES, 3DES, AES и так далее.
Асимметричное шифрование, требуется два ключа для шифрования и дешифрования, два ключа — это открытый ключ (открытый ключ, называемый открытым ключом) и закрытый ключ (закрытый ключ, называемый закрытым ключом). Обычно используемые алгоритмы асимметричного шифрования — RSA, Elgamal, ECC и т. д.
Используйте аналогию, чтобы понять эти два разных метода шифрования:
Симметричное шифрование: Предположим, что есть ящик с паролем. А устанавливает пароль для блокировки ящика. После того, как Б узнает пароль, он может открыть ящик, введя пароль. Этот пароль является секретным ключом. А и В используют один и тот же пароль.
Асимметричное шифрование: есть замок и уникальный ключ, А запирает ящик замком, а Б может открыть ящик только этим ключом. Этот замок можно понимать как открытый ключ, который является открытым. Под этим ключом можно понимать закрытый ключ, который не является публичным и не передается в сети, открыть ящик может только владелец закрытого ключа.
Просто сравните их различия:
Функции | Симметричное шифрование | Асимметричное шифрование |
---|---|---|
Ключевая особенность | Стороны шифрования и дешифрования используют один и тот же ключ | Стороны шифрования и дешифрования используют разные ключи. |
эффективность шифрования | Высокая эффективность и быстрая скорость | медленный |
ключ безопасности | Легко протекает во время передачи | Высокая безопасность |
В практических приложениях алгоритмы симметричного и асимметричного шифрования обычно комбинируются, что позволяет не только обеспечить скорость шифрования, но и обеспечить безопасность передачи ключа. Взяв в качестве примера комбинацию AES и RSA, существует общая практика: при отправке части данных на сервер сначала шифруйте данные с помощью алгоритма AES, а затем используйте открытый ключ RSA сервера для шифрования ключа AES. , Данные и зашифрованный ключ AES загружаются на сервер. Таким образом, только зная закрытый ключ RSA сервера, можно получить правильный КЛЮЧ AES, и, наконец, зашифрованный текст можно расшифровать с помощью КЛЮЧА AES.
Мысли о требованиях к шифрованию модели
В глубоком обучении обучение модели является наиболее важным и сложным. Для определения подходящей модели требуется не только большой опыт, но и большой набор данных, а обучение модели часто занимает 3-4 дня. Для защиты интеллектуальной собственности или коммерческой защиты нам часто необходимо шифровать файлы обученных моделей. Подумайте о наших требованиях к модельному шифрованию: высокая скорость, высокий уровень безопасности, а также локальное шифрование и дешифрование без использования сервера. Кроме того, для проверки целостности модели требуется алгоритм дайджеста. Сначала мы рассматриваем использование алгоритма AES и алгоритма дайджеста с использованием MD5. Давайте посмотрим, как работает алгоритм AES.
Принцип шифрования AES
AES, Advanced Encryption Standard, является одним из самых классических алгоритмов для алгоритмов симметричного шифрования и дешифрования.Стандартная разрядность шифрования AES составляет 128 бит на блок, а ключ делится на 128 бит, 192 бит и 256 бит. обычно упоминается как AES-128, AES-192, AES-256. Давайте посмотрим на шифрование AES с нескольких сторон.
- Процесс шифрования AES
- Процесс расшифровки AES
- Режим шифрования AES и заполнение
- Почему компонент шифрования AOE выбирает алгоритм шифрования AES?
Процесс шифрования AES
Алгоритм AES имеет четыре основные операции, а именно: «Добавить ключ раунда», «Подбайты», «Сдвинуть строки» и «Смешать столбцы». Процесс шифрования AES — это не простая операция с открытым текстом и ключом. Возьмем, к примеру, AES128, он выполняет 10 раундов шифрования. Фактический процесс выполнения выглядит следующим образом:
- Раунд 0, XOR исходных данных с исходным ключом;
- Раунды 1-9, выполнить полный процесс SubBytes, ShiftRows, MixColumns, AddRoundKey;
- Раунд 10, выполнять SubBytes, ShiftRows, не выполнять MixColumns;
static void Cipher(state_t* state, const uint8_t* RoundKey)
{
uint8_t round = 0;
// Add the First round key
AddRoundKey(0, state, RoundKey);
// There will be Nr rounds.
for (round = 1; round < Nr; ++round)
{
SubBytes(state);
ShiftRows(state);
MixColumns(state);
AddRoundKey(round, state, RoundKey);
}
// The last round is given below.
SubBytes(state);
ShiftRows(state);
AddRoundKey(Nr, state, RoundKey);
}
SubBytes
SubBytes, запутывание байтов. Минимальной единицей обработки AES является 8-битное целое число без знака, которое просто соответствует элементу в поле Галуа GF (2 ^ 8). Метод путаницы заключается в том, чтобы сначала вычислить мультипликативную инверсию каждого байта в GF (2 ^ 8) элемент, целью которого является обеспечение нелинейного преобразования. Над результатом выполняется еще одно аффинное преобразование, чтобы изменить структуру поля Галуа.
Поскольку каждый элемент в GF(2^8) может быть представлен полиномом: a7x^7 + a6x^6 + a5x^5 + ... + a1x + a0, где a7-a0 может быть получен только из GF(2) принять значение. Следовательно, вычисление инверсии определенного байта можно преобразовать в нахождение инверсии многочлена. Взяв в качестве примера 0xac, это 10101100 при записи в двоичном формате и x ^ 7 + x ^ 5 + x ^ 3 + x ^ 2 при записи в виде полинома, и вычисление обратного становится вычислением обратного этого полинома. Получив обратный многочлен, мы можем преобразовать его в шестнадцатеричное значение. Аффинное преобразование просто для понимания, то есть путем определенного вычисления получается новое значение. Конкретный метод расчета мы не будем вводить больше. На практике для выполнения этого шага можно использовать метод справочной таблицы.
Поскольку значение каждого байта, полученного на этих шагах, является фиксированной парой, мы можем вычислить значение, соответствующее каждому элементу в GF(2^8), и, наконец, мы можем получить справочную таблицу 16*16, называемую Substitution -box, по ссылке как sbox или s box. Для каждого входного байта, такого как бит шестнадцатеричной формы входного байта 0xAB, найдите A в ординате таблицы, затем поместите B в ординате и, наконец, используйте значение s (a, b), чтобы заменить значение этого байта . На этом шаге наши входные данные D1-D16 становятся S1-S16.
ShiftRows
Преобразованные байты 16 блоков S записываются в матрицу сверху вниз и слева направо. Первая строка остается неизменной, вторая строка перемещается на 1 сетку влево, третья строка перемещается на 2 сетки влево, а четвертая строка сдвигается на 3 сетки влево, как показано на рисунке:
MixColumns
Умножьте следующую матрицу на результат после ShiftRows. Операция запутывания столбца запутывает каждый столбец входной матрицы, так что каждый байт ввода влияет на 4 байта вывода. Эта часть охватывает умножение матриц, сложение и умножение в полях Галуа. В целом, два шага ShiftRows и MixColumns обеспечивают диффузность этой криптосистеме.
Полиномы, соответствующие 01, 02 и 03 в левой матрице, равны 1, x и x+1 соответственно. Предполагая, что все входные данные матрицы справа равны 0x11, соответствующий многочлен равен x^4+1. Используя сложение и умножение в GF (2 ^ 8), вычисление выглядит следующим образом:
C(i) = (01 + 01 + 02 + 03) * 11
=(1 + 1 + x + x + 1) * (x^4 + 1)
= 1 * (x^4+1)
= x^4 + 1
Есть два случая результата умножения:
- Наивысшая степень не превышает x^7, а результат в это время является результатом после умножения.
- Если он превышает x^8, нам нужно взять этот полином по модулю P(x), где P(x) = x^8 + x^4 + x^3 + x + 1.
AddRoundKey
В приведенных выше шагах мы запутываем ввод данных. Каждое выполнение AddRoundKey называется раундом шифрования, и этот шаг будет выполняться несколько раз. Проще говоря, ключ и запутанный результат подвергаются операции xor, но ключ, используемый в каждом раунде, преобразуется из ключа предыдущего раунда.
Как генерируется круглый ключ? Взяв в качестве примера AES-128, ключ имеет всего 16 байт, мы делим их на группу по 4 байта и считаем их W0-W3. В каждом раунде с помощью преобразования функции g и фиксированной формулы можно получить ключ этого раунда. Всего генерируется 44 W(i), и каждая группа из 4 генерирует в общей сложности 11 ключей k0-k10, где k0 — исходный ключ. Количество раундов зависит от длины ключа: 10 раундов для 16-байтового ключа, 12 раундов для 24-байтового ключа и 14 раундов для 32-байтового ключа. Не будем описывать конкретный процесс расчета, он выглядит просто, но на самом деле за ним стоит много математических знаний и исследований.
Процесс расшифровки AES
Для расшифровки процесс шифрования выполняется в обратном порядке, как показано в следующем справочном коде, где InvShiftRows, InvSubBytes и InvMixColumns — это операции, обратные соответствующим алгоритмам.
static void InvCipher(state_t* state, const uint8_t* RoundKey)
{
uint8_t round = 0;
// Add the First round key
AddRoundKey(Nr, state, RoundKey);
// There will be Nr rounds.
for (round = (Nr - 1); round > 0; --round)
{
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(round, state, RoundKey);
InvMixColumns(state);
}
// The last round is given below.
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(0, state, RoundKey);
}
В обычной работе мы не рекомендуем писать такие зрелые и профессиональные алгоритмы шифрования самостоятельно, так как легко написать лазейки или ошибки, которые со временем вызовут серьезные проблемы с безопасностью.
Режим шифрования и заполнение
AES может шифровать только данные фиксированной длины.Для данных неопределенной длины нам нужно разделить их на несколько данных фиксированной длины, а затем зашифровать и расшифровать их.Это то, что мы часто называем блочным шифрованием. Существует несколько режимов шифрования ECB, CBC, CFB и OFB для блочного шифрования.Давайте представим режим ECB и режим CBC, а также влияние заполнения на шифрование и дешифрование.
режим ЕЦБ
Режим ECB, также известный как режим Electronic codebook (Электронная кодовая книга): ECB — это простейший режим шифрования блочного шифра.Перед шифрованием он делится на несколько блоков в соответствии с размером зашифрованного блока (например, AES — 128 бит), а затем каждый блок использует один и тот же ключ отдельно, шифрование и дешифрование одинаковы. Подробности смотрите на рисунке ниже:
Поскольку шифрование каждого блока данных независимо в режиме ECB, параллельное шифрование или дешифрование может выполняться блоками. Его недостатком является то, что один и тот же блок открытого текста будет зашифрован в один и тот же блок зашифрованного текста, поэтому этот метод относительно менее безопасен при определенных условиях.
режим CBC
Режим CBC также известен как цепочка шифровальных блоков: в режиме CBC для каждого шифрующего блока перед шифрованием выполняется операция XOR с зашифрованным текстом предыдущего шифроблока перед шифрованием, а затем шифруется шифровальщик. блок данных, называемый вектором инициализации IV. Подробности смотрите на рисунке ниже:
Вектор инициализации IV будет обновлен после завершения шифрования или дешифрования Режим CBC более безопасен, но поскольку шифрование каждого блока данных зависит от шифрования предыдущего блока данных, шифрование не может быть распараллелено.
Используя изображение для сравнения эффектов шифрования ECB и CBC, можно обнаружить, что использование режима CBC лучше для дисперсии и безопасности.
Padding
В процессе шифрования и дешифрования AES, если данные, подлежащие шифрованию, не кратны 16, необходимо заполнить исходные данные. Методы заполнения включают pkcs7padding/zeropadding/NoPadding и т. д.
Посмотрим как заполняются разные способы заливки.Например данные в начале FF FF FF FF FF FF FF FF FF FF
Заполнение PKCS7: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07
Заполнение нулями: FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00
NoPadding: без заполнения, вам необходимо убедиться, что данные кратны 16.
Очевидно, что разные заполнения влияют на шифрование и дешифрование, поэтому необходимо убедиться, что методы заполнения непротиворечивы при шифровании и дешифровании.
Почему компонент шифрования AOE выбирает алгоритм шифрования AES?
Теоретически большинство алгоритмов можно взломать, но расчет может занять много времени. Практически невозможно напрямую взломать алгоритм шифрования AES при нынешних вычислительных мощностях. Для нашей модели защиты достаточно использовать AES-128. Кроме того, после стандартизации алгоритма AES многие аппаратные чипы и программные средства реализовали поддержку AES, и алгоритм AES используется для шифрования и дешифрования, и производительность также очень высока. Принимая во внимание производительность и безопасность, мы используем алгоритм AES-128/CBC для шифрования и на этой основе объединяем алгоритм дайджеста MD5 для проверки целостности файла.
Инженерная практика AOE — сочетание AES и AOE
Давайте посмотрим, как реализован компонент шифрования AOE со следующих сторон:
- Зашифрованная файловая структура AOE
- Процесс шифрования AOE
- Процесс расшифровки AOE
- Использование компонентов шифрования AOE
Зашифрованная файловая структура AOE
Мы разработали новую файловую структуру, и зашифрованная файловая структура выглядит следующим образом:
1byte | 4bytes | 16bytes | nbytes |
---|---|---|---|
Version Code | File Length | File MD5 | Зашифрованные данные файла модели |
Мы добавляем голову перед зашифрованными данными модели, и голова имеет всего 21 байт:
- Код версии, 1 байт, указывает индекс метода шифрования модели, начиная с 1 и последовательно увеличивая.
Если зашифрованный номер версии модели > номера версии, поддерживаемого SDK для расшифровки, расшифровка не удалась, и SDK необходимо обновить. - Длина файла, 4 байта, указывает исходную длину файла модели.
- Файл MD5, 16 байт, представляет исходный MD5 файла модели, и MD5 расшифрованного файла модели должен соответствовать этому MD5.
- Зашифрованные данные файла модели, нбайт, имеют разную длину в соответствии с разными алгоритмами шифрования.
Алгоритм шифрования первой версии AOE (код версии 1), как шифрование, так и дешифрование могут быть выполнены локально без взаимодействия с сервером, соответствующий процесс шифрования и дешифрования выглядит следующим образом:
Процесс шифрования AOE
1. Используйте AES-128/CBC/No Padding для шифрования модели.
2. Добавьте к файлу 21-байтовый заголовок файла, Код версии + Длина файла + MD5 файла.
3. Используйте файл MD5 и зашифрованную модель, чтобы выполнить простую операцию Swap и обменяйте 16 байтов MD5 с первым байтом зашифрованных первых 16 КБ данных модели.
При шифровании AES мы сталкиваемся с проблемой, заключающейся в том, что ключ может быть легко украден. Чтобы решить эту проблему, во-первых, мы выбираем режим CBC, а во-вторых, мы обфусцируем файл после шифрования. Таким образом, даже если кто-то знает наш КЛЮЧ AES, если он не знает метод обфускации в нашем компоненте шифрования, поскольку он зашифрован в режиме CBC, он не сможет расшифровать наш зашифрованный файл.
Процесс расшифровки AOE
Процесс расшифровки противоположен процессу шифрования, конкретный алгоритм выглядит следующим образом:
1. Прочитайте первые 21 байт зашифрованного файла, чтобы получить код версии, длину файла.
2. Прочитайте первый байт первых 16 КБ данных зашифрованных данных и выполните обмен с полем MD5 в заголовке.После этого шага можно получить MD5 файла и исходные зашифрованные данные.
3. Используйте AES-128/CBC/No Padding для расшифровки модели и используйте файл MD5 для проверки целостности файла после получения расшифрованного файла.
Использование компонентов шифрования AOE
Компонент шифрования AOE предоставляет версию C и пакет JNI, версию JAVA и версию Python.Мы рекомендуем использовать версию C на терминале, и мы рекомендуем использовать версию JAVA или версию Python в фоновом режиме сервера для выполнения некоторой пакетной работы. Мы предлагаем два способа расшифровки в память и в файл.Мы рекомендуем расшифровать непосредственно в память, что не создает временных файлов и является более безопасным.
думать и подводить итоги
Криптография очень профессиональна для большинства людей и требует больших математических знаний.Шифрование и взлом всегда были отношениями между копьем и щитом. В настоящее время AOE SDK опирается на зрелые алгоритмы и сочетает в себе алгоритм AES для шифрования модели.В будущем мы расширим некоторые новые алгоритмы шифрования для вашего ознакомления и использования. Добро пожаловать, чтобы использовать и вносить предложения.github.com/didi/aoe
(AoE (AI on Edge, интеллектуальные терминалы, граничные вычисления) — это интегрированная среда выполнения AI (IRE) на стороне терминала, помогающая разработчикам повысить эффективность)