Aes 128 расшифровка: RSA — шифрование online

Содержание

RSA — шифрование online


Комментарий:
Описание: RSA (Rivest-Shamir-Adleman) является одной из первых криптосистем с открытым ключом и широко используется для безопасной передачи данных. В такой криптосистеме ключ шифрования является открытым и отличается от ключа расшифровки, который хранится в секрете (private). В RSA эта асимметрия основана на практической сложности факторизации произведения двух больших простых чисел, «проблема факторинга». Аббревиатура RSA состоит из начальных букв фамилий Рона Ривеста, Ади Шамира и Леонарда Адлемана, которые впервые публично описали алгоритм в 1978 году. Клиффорд Кокс, английский математик, работающий в Британском разведывательном управлении правительственной связи (GCHQ), разработал эквивалентную систему в 1973 году, но это не было рассекречено до 1997 года.

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

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


Ресурсы:

SHA512 — шифрование online


Описание: SHA512 — хеш-функция из семейства алгоритмов SHA-2 предназначена для создания «отпечатков» или «дайджестов» для сообщений произвольной длины. Применяется в различных приложениях или компонентах, связанных с защитой информации.

SHA-256 и SHA-512, и, в меньшей степени, SHA-224 и SHA-384 подвержены атакам расширения длины, делая его небезопасным для некоторых приложений. Поэтому обычно рекомендуется переключиться на SHA-3 для 512-битных хэшей и использовать SHA-512/224 и SHA-512/256 вместо SHA-224 и SHA-256. Это также происходит быстрее, чем SHA-224 и SHA-256 на x86-64, так как SHA-512 работает на 64 бит вместо 32 битных слов.

SHA-256 и SHA-512 являются новыми хэш-функциями, вычисленными с 32-разрядными и 64-разрядными словами соответственно. Они используют различные количества сдвига и аддитивные константы, но их структуры в остальном практически идентичны, отличаясь только количеством раундов. SHA-224 и SHA-384 являются просто усеченными версиями первых двух, вычисленными с различными начальными значениями. SHA-512/224 и SHA-512/256 также являются усеченными версиями SHA-512, но начальные значения генерируются с использованием метода, описанного в федеральных стандартах обработки информации (FIPS) PUB 180-4. SHA-2 было опубликовано в 2001 Национальным Институтом стандартов и технологии (NIST) Федеральный стандарт США (FIPS). Семейство алгоритмов SHA-2 запатентовано в патенте США 6829355. Соединенные Штаты выпустили патент под безвозмездной лицензией.


Ресурсы:

Как устроен AES / Хабр

О чём эта статья

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

В этой статье я напишу как устроен алгоритм шифрования AES (которого иногда называют Rijndael) и напишу его на JavaScript.

Почему на JavaScript? Чтобы запустить программу на этом языке, нужен только браузер в котором вы читаете эту статью. Чтобы запустить программу, скажем, на C, нужен компилятор и найдётся совсем мало желающих, готовых потратить время на компиляцию кода из какой то статьи. В конце есть ссылка по которой можно скачать архив с html страницей и несколькими js файлами — это пример реализации AES на JavaScript.

Как применить AES

Этот алгоритм преобразует один 128-битный блок в другой, используя секретный ключ который нужен для такого преобразования. Для расшифровки полученного 128-битного блока используют второе преобразование с тем же секретным ключом. Выглядит это так:

cipher = encrypt(block, key) // шифруем block с помощью key
block = decrypt(cipher, key) // расшифровываем cipher с помощью key

Размер блока всегда равен 128 бит. Размер ключа также имеет фиксированный размер. Чтобы зашифровать произвольный текст любым паролем можно поступить так:

  • получить хеш от пароля
  • преобразовать хеш в ключ по правилам описанным в стандарте AES
  • разбить текст на блоки по 128 бит
  • зашифровать каждый блок функцией cipher

Это можно записать так:

hash = md5(password) // MD5 хеш имеет длину 128 бит
key = keyexpansion(hash) // преобразуем хеш в ключ
blocks = split(text, 16) // разбить текст на блоки по 16 байт

for (i = 0; i < blocks. length; i++)
cipher[i] = encrypt(blocks[i], key)

Чтобы расшифровать массив блоков cipher нужно применить к каждому блоку decrypt:

hash = md5(password)
key = keyexpansion(hash)

for (i = 0; i < cipher.length; i++)
blocks[i] = decrypt(cipher[i], key)

text = merge(blocks) // соединить все блоки в одну строку

Конечно, длина текста может быть не кратна 128 битам. В таких случаях можно дополнить текст нулями до нужной длины, а в зашифрованные данные добавить несколько байт с зашифрованным размером оригинального текста. Функции aes.encrypt и aes.decrypt в файле aes.js в примере используют этот подход.

Поле GF(28)

AES активно использует так называемое конечное поле GF(28). Чтобы написать AES на JavaScript не обязательно знать, что это за поле, но если вы хотите лучше понять AES, прочтите этот раздел.

Поле GF(28) это числа 0..255 для которых определили особое умножение и особое сложение. Возмём какое нибудь число из этого поля и представим его в виде восьми битов: a = a

7a6a5a4a3a2a1a0. Точно также представим число b. Сложение a и b это известная побитовая операция xor:

a + b = a xor b

У сложения есть простые свойства:

a + a = 0
-a = 0 - a = a
a - b = a + (-b) = a + b

Умножение определяется сложнее. Запишем многочлены с коэффициентами из битов этих чисел:

p = a7x7 + a6x6 + a5x5 + a4x4 + a3x3 + a2x2 + a1x + a0

q = b7x7 + b6x6 + b5x5 + b4x4 + b3x3 + b2x2 + b1x + b0

Теперь перемножим эти два многочлена и найдём остаток от деления на m:

m = x8 + x4 + x3 + x + 1
r = pq mod (m)

Почему выбран именно такой m? У этого многочлена есть только два делителя-многочлена на которых он делится без остатка: единица и он сам. По аналогии с простыми числами, многочлен m «простой». Находить остаток от деления можно также как для обычных чисел: для этого достаточно уметь умножать, складывать и вычитать многочлены, причём сложение и вычитание производят по правилам GF(28), т.е. сложение и вычитание многочленов это xor между каждой парой коэффициентов. Вот два примера:

x3 + x2 + 1 mod (x3 + 1) = x2 // нужно один раз отнять x3+1
x3 + x2 + 1 mod (x2 + 1) = (x3 + x2 + 1) - (x + 1)(x2 + 1) = -x

Многочлен r представим в виде

r = r7x7 + r6x6 + r5x5 + r4x4 + r3x3 + r2x2 + r1x + r0

Его 8 коэффициентов представляют собой 8-битовое число из поля GF(28) и это число называется произведением a•b. В отличие от сложения, умножение нельзя найти парой простых побитовых операций. Однако умножение на произвольный многочлен в поле GF(2

8) можно свести к умножению на многочлен x, а умножить на x можно несколькими побитовыми операциями, о чём пойдёт речь ниже.

Для обозначения многочленов в GF(28) используют 16-ричные цифры. Например

m = x8 + x4 + x3 + x + 1 = 100011011 = 0x011b = {01}{1b}

Умножить на многочлен x = {02} в поле GF(28) очень просто. Рассмотрим произведение:

xp = x(a7x7 + a6x6 + a5x5 + a4x4 + a3x3 + a2x2 + a1x + a0) =
a7x8 + a6x7 + a5x6 + a4x5 + a3x4 + a

2x3 + a1x<2 + a0x
p = a7a6a5a4a3a2a1a0
xp = a7a6a5a4a3a2a1a00 // это сдвиг влево на один бит

Теперь нужно найти остаток от деления на m. 0x1b }

Зная как умножать на x можно умножить на любой другой многочлен. Для примера найдём a•b где a = {3c}, b = {a1}:

b = {a1} = 10100001 = {80} + {20} + {01}
a•b = a•{80} + a•{20} + a•{01} = a•x7 + a•x5 + a =
a•{02}•{02}•{02}•{02}•{02}•{02}•{02} + a•{02}•{02}•{02}•{02}•{02} + a =
{29} + {c1} + {3c} = {d4}

Осталась одна простая операция в поле GF(28). У любого байта b, кроме нуля, есть обратный байт a = b-1 который обладает свойством a•b = {01}. Все три функции для работы с полем — умножение на x, умножение двух произвольных байтов и нахождение обратного — я собрал в маленькую библиотеку gf на JavaScript.

Таблица SBox

Эта таблица представляет собой 256-байтый массив и используется для замены одного байта другим. Не обязательно понимать как она получается, потому что в код можно просто скопировать этот массив. Чтобы узнать чему равен элемент SBox[b] нужно три действия:

  1. найти обратный байт к b в поле GF(28) (ноль оставить без изменений)
  2. умножить результат состоящий из восьми битов на матрицу 8×8 из 64 битов
  3. добавить {63}

В сумме эти три действия дают афинное преобразование:

Несложно понять как построена эта матрица из битов. 0x63 }

Построенная таблица выглядит так:

63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76
ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0
b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15
04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75
09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84
53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf
d0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8
51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2
cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73
60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db
e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79
e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08
ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a
70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e
e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df
8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16

Её можно просто скопировать в код, как часто делают, а можно вычислять функцией sbox по мере надобности.

Таблица InvSBox

Для дешифрования текста AES использует таблицу обратную к SBox. Таблица InvSBox обладает одним свойством: InvSBox[SBox[i]] = i. InvSBox выглядит так:

52 09 6a d5 30 36 a5 38 bf 40 a3 9e 81 f3 d7 fb
7c e3 39 82 9b 2f ff 87 34 8e 43 44 c4 de e9 cb
54 7b 94 32 a6 c2 23 3d ee 4c 95 0b 42 fa c3 4e
08 2e a1 66 28 d9 24 b2 76 5b a2 49 6d 8b d1 25
72 f8 f6 64 86 68 98 16 d4 a4 5c cc 5d 65 b6 92
6c 70 48 50 fd ed b9 da 5e 15 46 57 a7 8d 9d 84
90 d8 ab 00 8c bc d3 0a f7 e4 58 05 b8 b3 45 06
d0 2c 1e 8f ca 3f 0f 02 c1 af bd 03 01 13 8a 6b
3a 91 11 41 4f 67 dc ea 97 f2 cf ce f0 b4 e6 73
96 ac 74 22 e7 ad 35 85 e2 f9 37 e8 1c 75 df 6e
47 f1 1a 71 1d 29 c5 89 6f b7 62 0e aa 18 be 1b
fc 56 3e 4b c6 d2 79 20 9a db c0 fe 78 cd 5a f4
1f dd a8 33 88 07 c7 31 b1 12 10 59 27 80 ec 5f
60 51 7f a9 19 b5 4a 0d 2d e5 7a 9f 93 c9 9c ef
a0 e0 3b 4d ae 2a f5 b0 c8 eb bb 3c 83 53 99 61
17 2b 04 7e ba 77 d6 26 e1 69 14 63 55 21 0c 7d

Виды AES

Алгоритм AES преобразует блок длиной 128 битов в другой блок той же длины. Для преобразования применяется расписание ключей w получаемое из ключа. 128-битный блок в AES представляется в виде матрицы 4×Nb. Стандарт допускает только одно значение Nb = 4, поэтому длина блока всегда 128 бит, хотя алгоритм может работать с любым Nb. Длина ключа равна 4Nk байт. Алгоритм шифрования блока состоит из Nr раундов — применений одной и той же группы преобразований к 128-битному блоку данных. Стандарт допускает следующие комбинации этих трёх параметров:

Nk Nb Nr
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14
Преобразование KeyExpansion

Для шифрования текста AES применяет не пароль или хеш от пароля, а так называемое «расписание ключей» получаемое из ключа. Это расписание можно представить как Nr + 1 матриц размера 4×Nb. Алгоритм шифрования делает Nr + 1 шагов и на каждом шаге он, помимо других действий, берёт одну матрицу 4×Nb из «расписания» и поэлементно добавляет её к блоку данных.

Шифрование блока данных

Алгоритм шифрования получает на вход 128-битный блок данных input и расписание ключей w, которое получается после KeyExpansion. 16-байтый input он записывает в виде матрицы s размера 4×Nb, которая называется состоянием AES, и затем Nr раз применяет к этой матрице 4 преобразования. В конце он записывает матрицу в виде массива и подаёт его на выход — это зашифрованный блок. Каждое из четырёх преобразований очень простое.

  1. AddRoundKey берёт из расписания ключей одну матрицу размера 4×Nb и поэлементно добавляет её к матрице состояния. Если два раза применить AddRoundKey, то ничего не изменится, поэтому преобразование обратное к AddRoundKey это оно само.
  2. SubBytes заменяет каждый элемент матрицы состояния соответвующим элементом таблицы SBox: sij = SBox[sij]. Преобразование SubBytes обратимо. Обратное к нему находится с помощью таблицы InvSBox.
  3. ShiftRows сдвигает i-ую строку матрицы s на i позиций влево, считая i с нуля. Обратное преобразование InvShiftRows сдвигает строки вправо.
  4. MixColumns умножает каждый столбец матрицы s слева на особую матрицу размера 4×4:

    Для шифрования используют [a b c d] = [{02} {03} {01} {01}]. Можно проверить, что преобразование обратное к MixColumns[{02} {03} {01} {01}] это MixColumns[{0e} {0b} {0d} {09}].

Схематично шифрование можно изобразить так:

AddRoundKey(0)	

for (var i = 1; i <= Nr - 1; i++)
{			
	SubBytes()
	ShiftRows()
	MixColumns([0x02, 003, 0x01, 0x01])
	AddRoundKey(i)
}

SubBytes()
ShiftRows()
AddRoundKey(Nr)
Расшифровка

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

Немного оптимизации

Функция sbox имеет всего 256 возможных входных значений и 256 возможных выходных значений. Чтобы не вычислять много раз sbox для одного аргумента, нужно кешировать результаты. На JavaScript это несложно сделать даже не меняя код написанный ранее. Для этого нужно всего лишь дописать ниже вот это:

Function.prototype.cached = function()
{
	var old = this
	var cache = {}
	
	return function(x)
	{
		if (cache[x] !== undefined)
			return cache[x]
			
		cache[x] = old(x)
		return cache[x]
	}
}

aes.sbox = aes.sbox.cached()

Этот код заменяет sbox функцией которая кеширует результаты sbox. Тоже самое можно сделать для любой функции, например для invsbox и rcon. Этот же приём можно применить для функции gf.mul которая умножает два байта в поле GF(28), но в этом случае размер кеша будет равен 256×256 элементов, что довольно много.

Ссылки

Документация к AES на английском называется FIPS 197.

Алгоритм шифрования AES и его надежность

После того как мы на прошлой неделе опубликовали информацию о готовящихся к продаже новых криптотелефонах X-Telecom Secure Mobile, в которых используется алгоритм шифрования AES-256, многие люди стали звонить и интересоваться, что это за алгоритм AES, насколько он надежен и удовлетворяет ли он требования информационной безопасности.

Алгоритм Advanced Encryption Standard

Advanced Encryption Standard – симметричный алгоритм блочного шифрования, принятый правительством США в качестве стандарта в результате конкурса, проведенного между технологическими институтами. Он заменил устаревший Data Encryption Standard, который больше не соответствовал требованиям сетевой безопасности, усложнившимся в XXI веке.

Этот алгоритм, кроме аббревиатуры AES, иногда называют еще Rijndael – это анаграмма из частей имен бельгийских программистов Joan Daemen и Vinent Rijmen, которые разработали AES. Строго говоря, AES и Rijndael – не совсем одно и то же, поскольку AES имеет фиксированный размер блока в 128 бит и размеры ключей в 128, 192 и 256 бит, в то время как для Rijndael могут быть заданы любые размеры блока и ключа, от минимума в 32 бит до максимума в 256 бит.

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

Информация, определенная как секретная, должна быть защищена посредством AES с длиной ключей 128, 192 и 256 бит. Для информации, определенной как особо секретная, эта длина составляет 192 или 256 бит. Суть AES в том, что любая «лобовая атака» на защищенные данные – то есть подбор всех возможных паролей – в перспективе очень сильно растягивается. Если представить, что взломщик располагает огромными ресурсами, то есть целой коллекцией суперкомпьютеров, то при усердном старании доступ к зашифрованным данным он мог бы получить через десятки лет. Если же в его распоряжении ничего этого нет, то взлом AES займет астрономически долгое время.

Надежность алгоритма шифрования AES

Считается, что используемый в Advanced Encryption Standard ключ длиной в 128 бит – достаточно надежная защита против лобовой атаки, то есть с чисто математической точки зрения подобрать один правильный пароль из всех возможных – трудноосуществимая задача. Несмотря даже на некоторые недостатки AES, взломать защищенную с помощью этого алгоритма информацию практически нереально.

Любой криптографический алгоритм требует ключ размером в то или иное количество бит, чтобы зашифровать данные, как показано в схеме №1.

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

Вот пример перебора 4-битного ключа:

Потребуется максимум 16 стадий, чтобы проверить каждую возможную комбинацию, начиная с «0000». Лобовая атака за некоторое время может пробить такой простой алгоритм.

Таблица на рисунке ниже показывает возможное число комбинаций с учетом размера ключа:

Обратите внимание на то, что по мере увеличения размера ключа количество комбинаций возрастает экспоненциально. Математические исчисления доказывают, что размер ключа в 128 бит надежнейшим образом защищает от лобовой атаки:

Таким образом, даже суперкомпьютеру понадобилось бы неисчислимо огромное количество времени, чтобы получить доступ к информации под защитой AES посредством лобовой атаки.

Для сравнения: возраст Вселенной – где-то между 13 и 14 миллиардами лет. Даже если предположить, что некий супер-суперкомпьютер мог быть справляться с алгоритмом DES за одну секунду, то на взлом AES  у него ушло бы около 149 триллионов лет.

Как видите, размера ключа в 128 бит вполне достаточно, хотя совершенно секретная информация все равно шифруется с размером в 256 бит. Следующее предположение доказывает, что стандарт 128 бит будет оставаться актуальным и в будущем.

Представьте:

  • каждый человек на Земле имеет десять компьютеров
  • на Земле семь миллиардов человек
  • каждый из этих компьютеров может проверять один миллиард комбинаций в секунду
  • ключ считается взломанным, если проверено 50% всех возможных комбинаций

При всех этих условиях все население планеты смогло бы взломать один ключ… за 77,000,000,000,000,000,000,000,000 лет.

При этом интересно отметить, что разница между размером ключа в 128 бит и 256 бит не так уж принципиальна. Если бы кто-то придумал бы некую программу, способную взломать 128-битную систему, то 256 бит для этого гения не были бы помехой.

Наконец, лучше всего за AES говорит статистика: защищенные этим алгоритмом данные никогда не были взломаны. Впрочем, все это работает при размере ключа минимум в 128 бит, поскольку более ранние шифровальные алгоритмы все же не выдерживали испытания на прочность.

Несмотря на то, что скорость вычисления компьютеров увеличивается в геометрической прогрессии согласно закону Мура, 128-битного ключа вполне должно хватить на много лет вперед.

Таким образом, все звонки и сообщения в криптотелефонах X-Telecom шифруются очень надежно, ведь кроме AES-256 еще дополнительно используется алгоритм Twofish и несколько вспомогательных алгоритмов — в комплексе это дает совершенную 100%-ую защиту вашего общения от прослушки любыми современными способами.

Использование динамического шифрования AES-128 и службы доставки ключей

В этой статье



Службы мультимедиа можно использовать для доставки содержимого HTTP Live Streaming (HLS) и Smooth Streaming, зашифрованного с помощью 128-битных ключей шифрования AES.You can use Media Services to deliver HTTP Live Streaming (HLS) and Smooth Streaming encrypted with the AES by using 128-bit encryption keys. Они также включают в себя службу доставки ключей, которая доставляет ключи шифрования авторизованным пользователям.Media Services also provides the key delivery service that delivers encryption keys to authorized users. Если нужно зашифровать ресурс-контейнер с помощью служб мультимедиа, то свяжите с ним ключ шифрования и настройте политики авторизации для ключа. If you want Media Services to encrypt an asset, you associate an encryption key with the asset and also configure authorization policies for the key. Когда поток запрашивается проигрывателем, службы мультимедиа используют указанный ключ для динамического шифрования содержимого с помощью AES.When a stream is requested by a player, Media Services uses the specified key to dynamically encrypt your content by using AES encryption. Чтобы расшифровать поток, проигрыватель запросит ключ у службы доставки ключей.To decrypt the stream, the player requests the key from the key delivery service. Чтобы определить, есть ли у пользователя право на получение ключа, служба оценивает политики авторизации, заданные для ключа.To determine whether the user is authorized to get the key, the service evaluates the authorization policies that you specified for the key.

Службы мультимедиа поддерживают несколько способов аутентификации пользователей, которые запрашивают ключи.Media Services supports multiple ways of authenticating users who make key requests. Для политики авторизации ключа содержимого можно задать одно или несколько ограничений: открытая авторизация или авторизация с помощью маркера.The content key authorization policy can have one or more authorization restrictions, either open or token restrictions. При ограничении с помощью маркера к политике должен прилагаться маркер, выданный службой маркеров безопасности (STS).The token-restricted policy must be accompanied by a token issued by a security token service (STS). Службы мультимедиа поддерживают маркеры в форматах простого веб-маркера (SWT) и JSON Web Token (JWT).Media Services supports tokens in the simple web token (SWT) and JSON Web Token (JWT) formats. Дополнительные сведения см. в статье Настройка политики авторизации для ключа содержимого.For more information, see Configure the content key’s authorization policy.

Чтобы воспользоваться преимуществами динамического шифрования, необходимо иметь ресурс-контейнер, содержащий набор многоскоростных MP4-файлов или многоскоростных исходных файлов Smooth Streaming. To take advantage of dynamic encryption, you need to have an asset that contains a set of multi-bitrate MP4 files or multi-bitrate Smooth Streaming source files. Вам также потребуется настроить политику доставки для ресурса-контейнера (описывается далее в этой статье).You also need to configure the delivery policy for the asset (described later in this article). В зависимости от формата, указанного в URL-адресе потоковой передачи, сервер потокового воспроизведения по запросу обеспечивает доставку содержимого по выбранному протоколу.Then, based on the format specified in the streaming URL, the on-demand streaming server ensures that the stream is delivered in the protocol you selected. Благодаря этому можно хранить и оплачивать файлы в одном формате хранения.As a result, you need to store and pay only for the files in single storage format. Службы мультимедиа создают и обрабатывают соответствующий ответ с учетом запросов клиента.Media Services builds and serves the appropriate response based on requests from a client.

Эта статья полезна разработчикам приложений, которые доставляют защищенные файлы мультимедиа.This article is useful to developers who work on applications that deliver protected media. В ней показано, как настроить политики авторизации для службы доставки ключей, чтобы только авторизованные клиенты могли получать ключи шифрования,The article shows you how to configure the key delivery service with authorization policies so that only authorized clients can receive encryption keys. а также рассматривается использование динамического шифрования.It also shows how to use dynamic encryption.

Дополнительные сведения о том, как шифровать содержимое с помощью Advanced Encryption Standard (AES) для доставки в Safari на macOS, см. в этой записи блога.For information on how to encrypt content with the Advanced Encryption Standard (AES) for delivery to Safari on macOS, see this blog post. Обзор способов защиты содержимого мультимедиа с помощью шифрования AES представлен в этом видео.For an overview of how to protect your media content with AES encryption, see this video.

Рабочий процесс динамического шифрования AES-128 и службы доставки ключейAES-128 dynamic encryption and key delivery service workflow

Выполните описанные ниже общие действия для шифрования файлов с помощью AES, используя службу доставки ключей служб мультимедиа и динамическое шифрование.Perform the following general steps when you encrypt your assets with AES by using the Media Services key delivery service and also by using dynamic encryption:

  1. Создайте ресурс и отправьте файлы в ресурс.Create an asset, and upload files into the asset.

  2. Закодируйте ресурс с файлами в набор MP4-файлов с переменной скоростью.Encode the asset that contains the file to the adaptive bitrate MP4 set.

  3. Создайте ключ содержимого и свяжите его с закодированным ресурсом-контейнером.Create a content key, and associate it with the encoded asset. В службах мультимедиа ключ содержимого содержит ключ шифрования ресурса.In Media Services, the content key contains the asset’s encryption key.

  4. Настройте политику авторизации ключа содержимого.Configure the content key’s authorization policy. Потребуется настроить политику авторизации для ключа содержимого.You must configure the content key authorization policy. Прежде чем ключ содержимого будет доставлен в клиент, его нужно привести в соответствие с политикой.The client must meet the policy before the content key is delivered to the client.

  5. Настройте политику доставки для ресурса-контейнера.Configure the delivery policy for an asset. Конфигурация политики доставки включает URL-адрес для получения ключа и вектор инициализации (IV).The delivery policy configuration includes the key acquisition URL and an initialization vector (IV). (Для шифрования и расшифровки алгоритму AES-128 требуется один и тот же вектор инициализации.) Конфигурация также включает протокол доставки (например, MPEG-ТИРЕ, HLS, Smooth Streaming или все) и тип динамического шифрования (например, конверт или без динамического шифрования). (AES-128 requires the same IV for encryption and decryption.) The configuration also includes the delivery protocol (for example, MPEG-DASH, HLS, Smooth Streaming, or all) and the type of dynamic encryption (for example, envelope or no dynamic encryption).

    К разным протоколам можно применять разные политики в отношении одного и того же ресурса.You can apply a different policy to each protocol on the same asset. Например, вы можете применить шифрование PlayReady при использовании Smooth или DASH и конвертное шифрование AES при использовании HLS.For example, you can apply PlayReady encryption to Smooth/DASH and an AES envelope to HLS. Потоковая передача по тем протоколам, которые не определены в политике доставки блокируется.Any protocols that aren’t defined in a delivery policy are blocked from streaming. (Например, при добавлении одной политики, указывающей только HLS в качестве протокола.) Исключением является отсутствие определенной политики доставки ресурсов.(An example is if you add a single policy that specifies only HLS as the protocol. ) The exception is if you have no asset delivery policy defined at all. Тогда все протоколы разрешено использовать в незашифрованном виде.Then, all protocols are allowed in the clear.

  6. Создайте указатель OnDemand, чтобы получить URL-адрес для потоковой передачи.Create an OnDemand locator to get a streaming URL.

В статье также показано, как клиентское приложение может запрашивать ключ у службы доставки ключей.The article also shows how a client application can request a key from the key delivery service.

В конце статьи вы найдете полный пример для .NET.You can find a complete .NET example at the end of the article.

На следующем изображении показан описанный выше рабочий процесс.The following image demonstrates the workflow previously described. В этом случае для аутентификации используется маркер.Here, the token is used for authentication.

В оставшейся части статьи приводятся объяснения, примеры кода и ссылки на статьи с инструкциями для выполнения описанных выше задач. The remainder of this article provides explanations, code examples, and links to topics that show you how to achieve the tasks previously described.

Текущие ограниченияCurrent limitations

При добавлении или обновлении политики доставки ресурсов необходимо удалить все существующие указатели и создать новый.If you add or update your asset’s delivery policy, you must delete any existing locator and create a new locator.

Создание ресурса-к

Объяснение шифрования AES и RSA

Вот как работает шифрование с использованием Boxcryptor

Мы шифруем файлы и тем самым обеспечиваем повышенную защиту от шпионажа и кражи данных. Для шифрования мы используем комбинацию шифрования AES-256 и шифрования RSA. Здесь мы объясняем два алгоритма.

Шифрование AES-256

Advanced Encryption Standard (AES) — один из наиболее часто используемых и наиболее безопасных алгоритмов шифрования, доступных сегодня. Это общедоступно, и это шифр, который NSA использует для обеспечения безопасности документов с классификацией «Совершенно секретно». История его успеха началась в 1997 году, когда NIST (Национальный институт стандартов и технологий) официально начал искать замену стареющему стандарту DES. Алгоритм под названием «Rijndael», разработанный бельгийскими криптографами Daemen и Rijmen, отличался повышенной безопасностью, а также производительностью и гибкостью.

Он вышел на первое место среди нескольких конкурентов и был официально анонсирован в 2001 году новым стандартом шифрования AES. Алгоритм основан на нескольких подстановках, перестановках и линейных преобразованиях, каждый из которых выполняется на блоках данных по 16 байтов, отсюда термин blockcipher. Эти операции повторяются несколько раз, называемые «раундами». Во время каждого раунда уникальный ключ раунда рассчитывается из ключа шифрования и включается в вычисления. Основываясь на блочной структуре AES, изменение отдельного бита либо в ключе, либо в блоке открытого текста приводит к совершенно другому блоку зашифрованного текста — явное преимущество перед традиционными потоковыми шифрами. Наконец, разница между AES-128, AES-192 и AES-256 — это длина ключа: 128, 192 или 256 бит — все радикальные улучшения по сравнению с 56-битным ключом DES. В качестве иллюстрации: взлом 128-разрядного ключа AES с помощью современного суперкомпьютера займет больше времени, чем предполагаемый возраст вселенной. А Boxcryptor даже использует 256-битные ключи! На сегодняшний день не существует никакой реальной атаки на AES. Поэтому AES остается предпочтительным стандартом шифрования для правительств, банков и систем высокой безопасности по всему миру.


Шифрование RSA

RSA — одна из самых успешных, асимметричных систем шифрования на сегодня. Первоначально обнаруженный в 1973 британским разведывательным агентством GCHQ, он получил классификацию «совершенно секретно». Мы должны поблагодарить криптологов Rivest, Shamir и Adleman за его гражданское повторное открытие в 1977 году. Они наткнулись на него во время попытки решить еще одну криптографическую проблему.

В отличие от традиционных симметричных систем шифрования, RSA работает с двумя различными ключами: публичным и частным. Оба они дополняют друг друга, что означает, что сообщение, зашифрованное одним из них, может быть дешифровано только его дополняющей стороной. Поскольку частный ключ не может быть вычислен из открытого ключа, последний, как правило, доступен для общественности.

Эти свойства позволяют использовать асимметричные криптосистемы в широком спектре функций, таких как цифровые подписи. В процессе подписания документа к файлу прикрепляется отпечаток пальца, зашифрованный с помощью RSA, который позволяет получателю проверять как отправителя, так и целостность документа. Безопасность RSA основана главным образом на математической проблеме факторизации целого числа. Сообщение, которое должно быть зашифровано, рассматривается как одно большое число. При шифровании сообщения оно увеличивается до степени ключа и делится с остатком на фиксированное произведение двух простых чисел. Повторяя процесс с другим ключом, открытый текст можно получить снова. Лучший известный в настоящее время способ взломать шифрование требует факторизации продукта, используемого при делении. В настоящее время невозможно вычислить эти коэффициенты для чисел, превышающих 768 бит. Вот почему современные криптосистемы используют минимальную длину ключа 3072 бита.

Как Boxcryptor Шифрует и Расшифровывает файлы

Boxcryptor реализует комбинированный процесс шифрования, основанный на асимметричном RSA и симметричном шифровании AES. Каждый файл имеет свой собственный уникальный случайный файловый ключ, который создается при создании файла.

AES Encryption — Простое шифрование или дешифрование строк или файлов

Symmetric Ciphers Online позволяет зашифровать или расшифровать произвольное сообщение используя несколько хорошо известных симметричные алгоритмы шифрования например AES, 3DES или BLOWFISH.

Симметричные шифры используют одинаковые (или очень похожие с алгоритмической точки зрения view) ключи как для шифрования, так и для дешифрования сообщения. Они предназначены для быть легко вычисляемым и способным обрабатывать даже большие сообщения в реальном времени.Таким образом, симметричные шифры удобны для использования одним объектом, который знает секретный ключ, используемый для шифрования и необходимый для расшифровки его частные данные — например, алгоритмы шифрования файловой системы основаны на симметричные шифры. Если симметричные шифры должны использоваться для безопасной связи между двумя или более сторонами проблемы, связанные с управлением симметричными ключами возникают. Такие проблемы можно решить с помощью гибридный подход это включает в себя использование асимметричные шифры. Симметричные шифры являются базовыми блоками многих криптографических систем и часто используется с другими механизмами криптографии, которые компенсируют их недостатки.

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

В блочном режиме обработки, если блоки были зашифрованы полностью независимо от того, зашифрованное сообщение может быть уязвимо для некоторых тривиальных атак.Очевидно, если бы было два одинаковых блока, зашифрованных без дополнительных контекст и используя ту же функцию и ключ, соответствующие зашифрованные блоки тоже будет идентичным. Вот почему блочные шифры обычно используются в различных режимы работы. Режимы работы вводят дополнительную переменную в функцию, которая содержит состояние расчета. Состояние изменяется во время шифрования / дешифрования процесс и объединены с содержанием каждого блока. Такой подход смягчает проблемы с идентичными блоками, а также могут служить для других целей.В значение инициализации дополнительной переменной называется вектор инициализации. В различия между режимами работы блочных шифров заключаются в том, как они сочетаются вектор состояния (инициализации) с входным блоком и путь вектора значение изменяется во время расчета. Потоковые шифры сохраняются и меняются их внутреннее состояние по дизайну и обычно не поддерживает явный входной вектор значения на их входе.

Примечание по безопасности: данные передаются по сети в незашифрованном виде ! Пожалуйста, не вводите конфиденциальную информацию в форму выше поскольку мы не можем гарантировать вам, что ваши данные не будут скомпрометированы.

Используя выбор Тип входа , выберите тип входа — текстовая строка или файл. В случае ввода текстовой строки введите свой ввод в Входной текст textarea 1,2 . В противном случае используйте кнопку «Обзор», чтобы выбрать входной файл для загрузки. Затем выберите криптографическую функцию, которую вы хотите использовать в поле Функция . В зависимости от выбранной функции поле Вектор инициализации (IV) имеет вид показано или скрыто.Вектор инициализации — это всегда последовательность байтов, каждый байт должен быть представлен в шестнадцатеричной форме.

Выберите режим работы в поле Mode и введите ключ в поле Key . Допустимая длина ключей для определенных криптографических функций перечислены ниже. Если вы не укажете ключ с допустимой длиной, ключ будет продлен на правильное количество нулевых байтов в конце. При смене ключа префикс функции sha1 (ключ) будет автоматически заполняется поле IV.Вы все еще можете изменить IV. Функция предназначена только для вашего удобства. С помощью переключателей под Ключ поле ввода, вы можете указать, вводится ли значение ключа следует интерпретировать как обычный текст или шестнадцатеричное значение.

Наконец, нажмите «Зашифровать!» или кнопку «Расшифровать!» кнопка в зависимости от того, хотите ли вы, чтобы входное сообщение было зашифровано или расшифровано.

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

Криптографическая функция Длина ключа Длина вектора инициализации (все режимы)
В байтах В битах В байтах В битах
AES 16, 24 или 32 128, 192 или 256 16 128
DES 1-8 байтов 8-64 16 128
ТРОЙНИКИ От 1 до 24 от 8 до 192 16 128
BLOWFISH 1 до 56 8 до 448 16 128
BLOWFISH-compat от 1 до 56 от 8 до 448 16 128
RIJNDAEL-256 от 1 до 32 от 8 до 256 64 512
R4 1 до 256 8 до 2048
SERPENT 1 до 32 8 до 256 32 256
ДВА РЫБКИ от 1 до 32 от 8 до 256 32 256
Таблица 1. Поддерживаемые длины ключей и длины IV
1 При расшифровке строки можно использовать только шестнадцатеричные символы, символы новой строки, табуляторы и символы новой строки.
2 В вашем распоряжении есть функция автоопределения вводимого текста. Автоопределение определяет, находится ли содержимое поля Входной текст в форма обычного текста или шестнадцатеричной строки. Вы можете отключить эту функцию, нажав на «ВЫКЛ» или изменив текущий тип ввода в поле Текст ввода поле.

Максимальный размер вводимой текстовой строки — 131 072 символа. Максимальный размер входного файла — 2 097 152 байта.

AES — документация PyCryptodome 3.9.9

Параметры:
  • ключ ( байтов / bytearray / memoryview ) —

    Секретный ключ для использования в симметричном шифре.

    Должен быть длиной 16, 24 или 32 байта (соответственно для AES-128 , AES-192 или AES-256 ).

    Только для MODE_SIV удваивается до 32, 48 или 64 байтов.

  • mode (одна из поддерживаемых констант MODE_ * ) — режим цепочки, используемый для шифрования или дешифрования. В случае сомнений используйте MODE_EAX .
  • iv ( байтов , байтов , memoryview ) — (Применимо только для MODE_CBC , MODE_CFB , MODE_OFB , и MODE_OPENPGP ).

    Вектор инициализации, используемый для шифрования или дешифрования.

    Для MODE_CBC , MODE_CFB и MODE_OFB он должен быть длиной 16 байт.

    Только для режима MODE_OPENPGP , он должен быть 16 байт для шифрования и 18 байт для расшифровки (в последнем случае это фактически зашифровал IV, к которому был добавлен префикс зашифрованного текста).

    Если не указан, генерируется случайная строка байтов (тогда вы должны прочтите его значение с помощью атрибута iv ).

  • nonce ( байтов , байтов , memoryview ) — (Применимо только для MODE_CCM , MODE_EAX , MODE_GCM , MODE_SIV , MODE_OCB и MODE_CTR ).

    Значение, которое нельзя использовать повторно для любого другого шифрования. с этим ключом (кроме, возможно, MODE_SIV , см. ниже).

    Для MODE_EAX , MODE_GCM и MODE_SIV нет ограничения на его длину (рекомендуется: 16 байт).

    Для MODE_CCM его длина должна быть в диапазоне [7..13] . Имейте в виду, что с CCM существует компромисс между nonce длина и максимальный размер сообщения. Рекомендация: 11 байт.

    Для MODE_OCB его длина должна быть в диапазоне [1..15] (рекомендуется: 15 ).

    Для MODE_CTR его длина должна быть в диапазоне [0. .15] (рекомендуется: 8 ).

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

    Если не указано, для режимов, отличных от MODE_SIV` , случайный используется байтовая строка рекомендуемой длины (тогда вы должны прочтите его значение с помощью атрибута nonce ).

  • размер_сегмента ( целое число ) — (Только MODE_CFB ). Количество бит открытый текст и зашифрованный текст сегментированы. Оно должно быть кратным 8. Если не указано иное, будет принято значение 8.

  • mac_len : ( целое число ) — (Только MODE_EAX , MODE_GCM , MODE_OCB , MODE_CCM ) Длина тега аутентификации в байтах.

    Должен быть четным и находиться в диапазоне [4. .16] . Рекомендуемое значение (и значение по умолчанию, если не указано): 16 .

  • msg_len : ( целое число ) — (Только MODE_CCM ). Длина сообщения для (де) шифрования. Если не указано иное, encrypt должен вызываться со всем сообщением. Точно так же дешифрует может

aes.h Ссылка на файл — Документация API

AES_context * ctxПодробнее …
ES расшифровка блока A внутренняя блокировка

Этот файл содержит определения и функции AES.

Advanced Encryption Standard (AES) определяет одобренный FIPS криптографический алгоритм, который может использоваться для защиты электронных данных.

Алгоритм AES — это симметричный блочный шифр, который может шифровать и расшифровывать информацию. Для получения дополнительной информации см. Публикация 197 FIPS: Расширенный стандарт шифрования и ISO / IEC 18033-2: 2006: Информационные технологии — Методы безопасности — Алгоритмы шифрования — Часть 2: Асимметричные шифры .

Блочный режим AES-XTS стандартизирован NIST SP 800-38E https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38e.pdf и подробно описан IEEE P1619 https://ieeexplore. ieee .org / servlet / opac? punumber = 4375278.

Определение в файле aes.h.

void mbedtls_aes_init (mbedtls_aes_context * ctx)
void mbedtls_aes_free (mbedtls_aes_context * ctx)
Эта функция освобождает и очищает указанный контекст AES. Подробнее …
void mbedtls_aes_xts_init (mbedtls_aes_xts_context * ctx)
Эта функция инициализирует указанный контекст AES XTS. Подробнее …
void mbedtls_aes_xts_free (mbedtls_aes_xts_context * ctx)
Эта функция освобождает и очищает указанный контекст AES XTS.Подробнее …
int mbedtls_aes_setkey_enc (mbedtls_aes_context * ctx, const unsigned char * key, unsigned int keybits)
Эта функция устанавливает ключ шифрования. Подробнее …
int mbedtls_aes_setkey_dec (mbedtls_aes_context * ctx, const unsigned char * key, unsigned int keybits)
Эта функция устанавливает ключ дешифрования.Подробнее …
int mbedtls_aes_xts_setkey_enc (mbedtls_aes_xts_context * ctx, const unsigned char * key, unsigned int keybits)
Эта функция подготавливает шифрование XTS и устанавливает шифрование XTS ключ. Подробнее …
int mbedtls_aes_xts_setkey_dec (mbedtls_aes_xts_context * ctx, const unsigned char * key, unsigned int keybits)
Эта функция подготавливает дешифрование XTS и ключ.Подробнее …
int mbedtls_aes_crypt_ecb (mbedtls_aes_context * ctx, int mode, const unsigned char input [16], unsigned char output [16])
Эта функция выполняет Одноблочное шифрование или дешифрование AES. Подробнее …
int mbedtls_aes_crypt_cbc (mbedtls_aes_context * ctx, int mode, size_t length, unsigned char iv [16], const unsigned char * input, unsigned char * output)
Эта функция выполняет операцию шифрования или дешифрования AES-CBC для полных блоков. Подробнее …
int mbedtls_aes_crypt_xts (mbedtls_aes_xts_context * ctx, int mode, size_t length, const unsigned char data_unit [16], const unsigned char * input, unsigned char * output) Эта функция выполняет операцию шифрования или дешифрования AES-XTS для всего блока данных XTS. Подробнее …
int mbedtls_aes_crypt_cfb128 (mbedtls_aes_context * ctx, int mode, size_t length, size_t * iv_off, unsigned char iv [16], const unsigned char * input, unsigned char * input)
Эта функция выполняет операцию шифрования или дешифрования AES-CFB128.Подробнее …
int mbedtls_aes_crypt_cfb8 (mbedtls_aes_context * ctx, int mode, size_t length, unsigned char iv [16], const unsigned char * input, unsigned char * output)
Эта функция выполняет операцию шифрования или дешифрования AES-CFB8. Подробнее …
int mbedtls_aes_crypt_ofb (mbedtls_aes_context * ctx, size_t length, size_t * iv_off, unsigned char iv [16], const unsigned char * input, unsigned char * output)
Эта функция выполняет операцию шифрования или дешифрования AES-OFB (режим обратной связи по выходу).Подробнее …
int mbedtls_aes_crypt_ctr (mbedtls_aes_context * ctx, size_t length, size_t * nc_off, unsigned char nonce_counter [16], unsigned char stream_block [16], unsigned char stream_block [16], unsigned char stream_block [16] char * output)
Эта функция выполняет операцию шифрования или дешифрования AES-CTR. Подробнее …
int mbedtls_internal_aes_encrypt (mbedtls_aes_context * ctx, const unsigned char input [16], unsigned char output [16])
Внутренняя функция шифрования блока AES. Подробнее …
int mbedtls_internal_aes_decrypt (mbedtls_aes_context * ctx, const unsigned char input [16], unsigned char output [16])
Внутренняя функция дешифрования блока AES. Подробнее …
MBEDTLS_DEPRECATED void mbedtls_aes_encrypt (mbedtls_aes_context * ctx, const unsigned char input [16], unsigned char output [16])
внутренняя функция шифрования без знака [16]) без возвращаемого значения.Подробнее …
MBEDTLS_DEPRECATED void mbedtls_aes_decrypt (mbedtls_aes_context * ctx, const unsigned char input [16], unsigned char output [16])
c без возвращаемого значения. Подробнее …
int mbedtls_aes_self_test (int verbose)
Процедура проверки.Подробнее …
инт mbedtls_aes_crypt_cfb128 ( mbedtls_aes_context * CTX ,
внутренний режим ,
size_t длина ,
размер_т * iv_off ,
беззнаковый символ iv [16],
const беззнаковый символ * вход ,
беззнаковый символ * выход
)

Эта функция выполняет операцию шифрования или дешифрования AES-CFB128.

Он выполняет операцию, определенную в параметре mode (шифрование или дешифрование), в буфере входных данных, определенном в параметре input .

Для CFB вы должны установить контекст с помощью mbedtls_aes_setkey_enc (), независимо от того, выполняете ли вы операцию шифрования или дешифрования, то есть независимо от параметра mode . Это связано с тем, что в режиме CFB используется одно и то же расписание ключей для шифрования и дешифрования.

Примечание
При выходе содержимое IV обновляется, так что вы можете снова вызвать ту же функцию в следующем блоке (ах) данных и получить такой же результат, как если бы он был зашифрован за один вызов.Это позволяет «потоковое» использование. Если вам нужно сохранить содержимое IV, вы должны либо сохранить его вручную, либо вместо этого использовать модуль шифрования.
Параметры
ctx Контекст AES, используемый для шифрования или дешифрования. Он должен быть инициализирован и привязан к ключу.
режим Операция AES: MBEDTLS_AES_ENCRYPT или MBEDTLS_AES_DECRYPT.
length Длина входных данных в байтах.
iv_off Смещение в IV (обновляется после использования). Он должен указывать на действительный size_t .
iv Вектор инициализации (обновляется после использования). Это должен быть читаемый и записываемый буфер размером 16 байта.
input Буфер, содержащий входные данные. Он должен быть читаемым и иметь размер , длина байта.
output Буфер, содержащий выходные данные.Он должен быть записываемым и иметь размер , длина байта.
Возвращает
0 в случае успеха.
инт mbedtls_aes_crypt_ctr ( mbedtls_aes_context * CTX ,
size_t длина ,
размер_т * nc_off ,
беззнаковый символ nonce_counter [16],
беззнаковый символ блок_потока [16],
const беззнаковый символ * вход ,
беззнаковый символ * выход
)

Эта функция выполняет операцию шифрования или дешифрования AES-CTR.

Эта функция выполняет операцию, определенную в параметре mode (шифрование / дешифрование), в буфере входных данных, определенном в параметре input .

Из-за характера CTR вы должны использовать одно и то же расписание ключей для операций шифрования и дешифрования. Следовательно, вы должны использовать контекст, инициализированный с помощью mbedtls_aes_setkey_enc () как для MBEDTLS_AES_ENCRYPT, так и для MBEDTLS_AES_DECRYPT.

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

Есть две распространенные стратегии управления одноразовыми номерами с CTR:

  1. Вы ​​можете обрабатывать все как одно сообщение, обрабатываемое последовательными вызовами этой функции. В этом случае вы хотите установить nonce_counter и nc_off на 0 для первого вызова, а затем сохранить значения nonce_counter , nc_off и stream_block для вызовов этой функции, поскольку они будут обновлены эта функция.

При использовании этой стратегии вы не должны шифровать более 2 ** 128 блоков данных с одним и тем же ключом.

  1. Вы ​​можете зашифровать отдельные сообщения, разделив буфер nonce_counter на две области: первая используется для одноразового номера сообщения, обрабатываемого вами, а вторая обновляется этой функцией внутренне.

Например, вы можете зарезервировать первые 12 байтов для одноразового номера сообщения, а последние 4 байта — для внутреннего использования. В этом случае перед вызовом этой функции в новом сообщении вам необходимо установить первые 12 байтов nonce_counter на выбранное значение nonce, последние 4 на 0 и nc_off на 0 (что приведет к тому, что stream_block будет игнорировать).Таким образом, вы можете зашифровать не более 2 ** 96 сообщений, содержащих до 2 ** 32 блоков, каждое с одним и тем же ключом.

Одноразовый номер сообщения (или информация, достаточная для его восстановления) должен быть передан с зашифрованным текстом и должен быть уникальным. Рекомендуемый способ гарантировать уникальность — использовать счетчик сообщений. Альтернативой является генерация случайных одноразовых номеров, но это ограничивает количество сообщений, которые могут быть надежно зашифрованы: например, с 96-битными случайными одноразовыми номерами вы не должны шифровать более 2 ** 32 сообщений одним и тем же ключом.

Обратите внимание, что для обоих состояний размеры измеряются в блоках, а размер блока AES составляет 16 байтов.

Предупреждение
По возвращении stream_block содержит конфиденциальные данные. Его содержимое не должно записываться в небезопасное хранилище и должно быть безопасно удалено, как только оно больше не понадобится.
Параметры
ctx Контекст AES, используемый для шифрования или дешифрования. Он должен быть инициализирован и привязан к ключу.
длина Длина входных данных.
nc_off Смещение в текущем stream_block для возобновления в текущем потоке шифров. Указатель смещения должен быть равен 0 в начале потока. Он должен указывать на действительный size_t .
nonce_counter 128-битный одноразовый номер и счетчик. Это должен быть буфер с возможностью чтения и записи размером 16 байта.
stream_block Сохраненный блок потока для возобновления.Это перезаписывается функцией. Это должен быть буфер с возможностью чтения и записи размером 16 байта.
input Буфер, содержащий входные данные. Он должен быть читаемым и иметь размер , длина байта.
output Буфер, содержащий выходные данные. Он должен быть записываемым и иметь размер , длина байта.
Возвращает
0 в случае успеха.
инт mbedtls_aes_crypt_ofb ( mbedtls_aes_context * CTX ,
size_t длина ,
размер_т * iv_off ,
беззнаковый символ iv [16],
const беззнаковый символ * вход ,
беззнаковый символ * выход
)

Эта функция выполняет операцию шифрования или дешифрования AES-OFB (режим обратной связи по выходу).

Для OFB вы должны настроить контекст с помощью mbedtls_aes_setkey_enc (), независимо от того, выполняете ли вы операцию шифрования или дешифрования. Это связано с тем, что в режиме OFB используется одно и то же расписание ключей для шифрования и дешифрования.

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

Примечание
При выходе содержимое iv, вектора инициализации, обновляется, так что вы можете снова вызвать ту же функцию в следующем блоке (ах) данных и получить такой же результат, как если бы он был зашифрован за один вызов .Это позволяет использовать «потоковую передачу», инициализируя iv_off значением 0 перед первым вызовом и сохраняя его значение между вызовами.

Для использования без потоковой передачи iv должен быть инициализирован при каждом вызове уникальным значением, а iv_off установлен в 0 при каждом вызове.

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

Предупреждение
Для режима OFB вектор инициализации должен быть уникальным для каждой операции шифрования.Повторное использование вектора инициализации поставит под угрозу безопасность.
Параметры
ctx Контекст AES, используемый для шифрования или дешифрования. Он должен быть инициализирован и привязан к ключу.
длина Длина входных данных.
iv_off Смещение в IV (обновляется после использования). Он должен указывать на действительный size_t .
iv Вектор инициализации (обновляется после использования).Это должен быть читаемый и записываемый буфер размером 16 байта.
input Буфер, содержащий входные данные. Он должен быть читаемым и иметь размер , длина байта.
output Буфер, содержащий выходные данные. Он должен быть записываемым и иметь размер , длина байта.

Отправить ответ

avatar
  Подписаться  
Уведомление о