Аппаратная поддержка алгоритма AES современными процессорами


    Компанией Intel в 2008 г. были предложены новые команды для x86 архитектуры, которые добавили поддержку на аппаратном уровне симметричного алгоритма шифрование AES(Advanced Encryption Standard). На данный момент AES — один из самых популярных алгоритмов блочного шифрования. Поэтому аппаратная реализация должна привести к повышению производительности программ использующих этот алгоритм шифрования(OpenSSL, The Bat, TrueCrypt ...). Новое расширение команд получило название AES-NI. Оно содержит в себе следующие инструкции:
    • AESENC — Выполнить один раунд шифрования AES,
    • AESENCLAST- Выполнить последний раунд шифрования AES,
    • AESDEC — Выполнить один раунд расшифрования AES,
    • AESDECLAST — Выполнить последний раунд расшифрования AES,
    • AESKEYGENASSIST — Поспособствовать в генерации раундового ключа AES,
    • AESIMC — Обратный Mix Columns.

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


    Для начала вспомним, как работает AES. Это потребуется для того, чтобы понять, какие механизмы реализованы в этих инструкциях.
    Алгоритм AES использует 4 функции:
    1. AddRound — XOR(исключающие или) сообщения с ключом,
    2. SubBytes — функция подстановки,
    3. ShiftRows- циклический сдвиг полей в блоке по заданному правилу,
    4. MixColumns — процедура смешивания.

    Сам алгоритм шифрования выглядит так:

    Начинаем


    Для начало, необходимо убедится что расширение AES-NI присутствует в нашем процессоре. Для этого существует специальная команда CPUID, которая при значение eax=0x00000001, должна выставить в регистрах биты относительно присутствующих расширений. Для расширения AES это 25 бит регистра ECX:
    код проверки AES-NI:
    		mov eax,0x00000001;
    		CPUID;
    		test ecx,0x2000000;
    		je L_no_AES; 
    

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

    Расширение ключа/ExpandKey


    Алгоритм расширения ключа в псевдокоде выглядит так:
    KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)
    begin
        word temp
        i = 0;
        while ( i < Nk)
            w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4*i+3])
            i = i+1
        end while
        i = Nk
        while ( i < Nb * (Nr+1))
            temp = w[i-1]
            if (i mod Nk = 0)
                temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
            else if (Nk > 6 and i mod Nk = 4)
                temp = SubWord(temp)
            end if
            w[i] = w[i-Nk] xor temp
            i = i + 1
        end while
    end
    

    Для аппаратной поддержки надо использовать инструкцию AESKEYGENASSIST, которая выполнит:
    AESKEYGENASSIST xmm1, xmm2/m128, imm8 
    Tmp := xmm2/LOAD(m128) 
    X3[31-0] = Tmp[127-96]; 
    X2[31-0] = Tmp[95-64]; 
    X1[31-0] = Tmp[63-32]; 
    X0[31-0] = Tmp[31-0]; 
    RCON[7-0]:= imm8; 
    RCON [31-8]:= 0; 
    xmm1 :=[RotWord (SubWord (X3)) XOR RCON, SubWord (X3), RotWord (SubWord (X1)) XOR RCON, SubWord (X1)] 
    

    Как легко заметить, инструкция не выполняет:
    w[i] = w[i-Nk] xor temp
    

    Эти операции придется выполнить самим, используя MMX инструкции
    Пример расширения 128b ключа
    aeskeygenassist xmm2, xmm1, 0x1 ; 1 раунд
    pshufd xmm2, xmm2, 0xff; 
    movups xmm3, xmm4;
    pxor xmm2,xmm3;
    pshufd xmm2, xmm2, 0x00;
    
    pshufd xmm3, xmm3, 0x39;
    pslldq xmm3,0x4;
    pxor xmm2,xmm3;
    pshufd xmm2, xmm2, 0x14;
    
    pshufd xmm3, xmm3, 0x38;
    pslldq xmm3,0x4;
    pxor xmm2,xmm3;
     pshufd xmm2, xmm2, 0xA4;
    
    pshufd xmm3, xmm3, 0x34;
    pslldq xmm3,0x4;
    pxor xmm2,xmm3;
    



    Шифрование/Encryption


    Для реализации одного раунда шифрования используется инструкция AESENC, которая выполняет следующие действия:

    AESENC xmm1, xmm2/m128
    Tmp = xmm1
    Round Key := xmm2/m128
    Tmp = ShiftRows (Tmp)
    Tmp = SubBytes (Tmp)
    Tmp = MixColumns (Tmp)
    xmm1 = Tmp xor Round Key 
    


    Последний раунд шифрования реализуется при помощи инструкции AESENCLAST:
    AESENC xmm1, xmm2/m128
    Tmp = xmm1
    Round Key := xmm2/m128
    Tmp = ShiftRows (Tmp)
    Tmp = SubBytes (Tmp)
    xmm1 = Tmp xor Round Key 
    

    Отличие этой инструкции от AESENC состоит в том, что операция MixColums на последнем шаге не выполняется:
    Пример процедуры шифрования
    aesenc xmm1, xmm2 ; 
    aesenclast xmm1, xmm3;
    


    Расшифровывание/decryption


    Для реализации процедуры расшифрования используется инструкция AESDEC:

    AESDEC xmm1, xmm2/m128
    Tmp = xmm1
    Round Key = xmm2/m128
    Tmp = InvShift Rows (Tmp)
    Tmp = InvSubBytes (Tmp)
    Tmp = InvMixColumns (Tmp)
    xmm1 = Tmp xor Round Key 
    

    Для получения InvKey надо выполнить операцию InvMixClomuns для ключа. Инструкция, которая это делает — AESIMC xmm1.xmm2
    И для последнего раунда расшифрования используется Инструкция AESDECLAST:
    AESDECLAST xmm1, xmm2/m128
    State = xmm1
    Round Key = xmm2/m128
    Tmp = InvShift Rows (State)
    Tmp = InvSubBytes (Tmp)
    xmm1= Tmp xor RoundKey
    

    Пример процедуры расшифрования
    aesmic xmm2,xmm2;
    aesdec xmm1, xmm2 ; 
    aesdeclast xmm1, xmm3;
    



    Итак, аппаратное поддержка должна нам дать приличный прирост к скорости шифрования. В качестве завершения поста приведу класс на C++, реализующий операции шифрования и расшифрования в режиме ECB. После прогона теста была достигнута скорость шифрования на одном ядре i5-3740 (3.2GHz), равная 320MB/sec

    Ссылки:


    1. Intel Advanced Encryption Standard(AES) New Instructions Set
    2. Список процессоров поддерживающих расширение команд AES-NI
    3. C++ класс с AES-NI ассемблерными вставками
    4. Анимашка как работает AES
    5. Статья на wikipedia со списком библиотек и программ использующих AES-Ni инструкции
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 23

      +4
      Еще важную страницу можно добавить — en.wikipedia.org/wiki/AES_instruction_set — на ней же и список библиотек, которые используют эти инструкции. OpenSSL, например.
        0
        Добавил. Спасибо за коментарий
        0
        А как программно определить есть эти инструкции или нет? Или только разные билды под разный набор инструкций?
          –1
          Проверить, пустой ли вывод grep aes /proc/cpuinfo?
            +5
            Before an application attempts to use AESNI instructions or PCLMULQDQ, the application should follow the steps illustrated in Section 11.6.2, “Checking for SSE/SSE2 Support.” Next, use the additional step provided below:
            Check that the processor supports AESNI (if CPUID.01H:ECX.AESNI[bit 25] = 1);

            (Intel® 64 and IA-32 Architectures Software Developer’s Manual)
              0
              Добавил, спасибо за комент.
            0
            Можно еще упомянуть о другом, схожем AES расширении для x86, предложенным компанией VIA TechnologiesPadLock engine, которое между прочим появилось раньше, чем AESNI.
              –1
              *параноик мод он* Это чтобы АНБ легче работалось?
                +4
                И где же на процессоре энергонезависимая память, куда он будет сохранять ваши ключи?
                Это как раз вариант для параноиков, шифруем с использованием ассемблерных инструкций, не используя никакие библиотеки или API. То есть доверяем только железу и asm компилятору.
                  +1
                  А в алгоритме закладочки нет? А то тут вон пару дней назад была темка… :)
                    +2
                    Шнайер, вроде, сказал, что нет.
                      +1
                      Атаки на сам алгоритм существуют, а вот бекдоров быть не должно.
                      Но вы можете поискать в нем, AES так же как и RSA был сертифицирован NIST.
                        +1
                        Мой преподаватель по криптографии говорил (как раз насчет АЕС) — Утверждать что в алгоритме нет закладки на этапе его создания, можно только после того как она будет найдена и алгоритм переработан с ее учетом. Но тогда нужно начинать искать следующую.
                      –6
                      При чем тут ключи? В железных реализациях криптоалгоритмов, можно сделать такую закладку, что ее никакой «Шнайер» не заметит, так как будет анализировать программную часть. А уязвимость зароют в каком-нибудь флаге регистра, который не участвуя в вычислениях сам по себе, будет так влиять на результат, что зная об этотм можно будет снижать сложность криптоанализа на порядки. Я как раз про ваше — «доверяем железу».
                        +6
                        А причем тут реализация? Тут речь о самом алгоритме, для вскрытия кода нужны ключи. Результат работы AES от выбранного подхода не зависит.
                        Данные зашифрованные AES должны расшифровываться любой реализацией этого алгоритма. Помимо ассемблерных инструкций процессора, это могут быть как специализированные микросхемы, так и обычный программный код(без ускоряющих инструкций). Можно даже на листе бумаги вручную проверить его работу — сам алгоритм опубликован.
                        Так, что ваш комментарий о железных реализациях совсем не в тему. Если сложность снижена, значит алгоритм изменен и на выходе будет совсем другой результат, тогда другая реализация алгоритма с тем же самым ключем шифротекст не откроет(и наоборот).

                          –2
                          Ну-ну. Читать-то умеем? Я не про сложность алгоритма, а про сложность криптоанализа, на которую влияют такие ньюансы, что не специалист не поверит. Но можно и на алгоритм повлиять. Предположим, аппаратная закладка переодически переводит алгоритм из основного режима CBC переводится в ECB. Результат — сообщения шифруются штатно — принимающая сторона все расшифровывает — вроде бы все ок. Но в шифртекстах становится очень много информации для вскрытия ключа. После того как статистика накапливается — ключ вскрывается. Да и в конце-концов что мешает аппаратной закладке после пытаться подмешивать ключ шифрования в служебную информацию, скажем сетевых пакетов? И вообще, чем железная реализация в процессоре отличается от программной, кроме быстродействия? Тем что ее проверить намного сложнее, обратный инжиниринг интеловских процессоров могут себе позволить очень немногие. Так что, параноикам стоит продолжать пользоваться софтовыми реализациями алгоритма.
                            0
                            Но можно и на алгоритм повлиять. Предположим, аппаратная закладка переодически переводит алгоритм из основного режима CBC переводится в ECB. Результат — сообщения шифруются штатно — принимающая сторона все расшифровывает — вроде бы все ок. Но в шифртекстах становится очень много информации для вскрытия ключа.

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

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

                            Слишком заметная закладка, для процессоров серийного производства.
                              –2
                              Прочитайте хотя бы на википедии, про режимы шифрования ECB и CBC

                              Лучше сами почитайте и желательно не википедию. Я прекрасно знаю. И как реализуются криптоалгоритмы тоже почитайте. Вы думаете что стороны заранее все ньюансы(касательно смены режимов, например) обговаривают?
                              Информации в шифротексте для взлома ключа больше не станет, из-за смены режима шифрования.
                              Мне нравится ваша безаппеляционность. А позвольте узнать чем эти режимы отличаются? Как раз тем что в шифртексте появляется сохраняется статистика открытого текста, что и позволяет, зная специфику сообщений, гораздо успешнее проводить криптоанализ.
                              Слишком заметная закладка, для процессоров серийного производства.
                              С какого перепугу она заметная? Кому она заметная? Тем кто будет реверсить процессор?
                                +1
                                Вы думаете что стороны заранее все ньюансы(касательно смены режимов, например) обговаривают?

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

                                Изначально вы говорили что режимы влияют на стойкость ключа. А не на поиск одинаковых блоков в открытом тексте.
                                С какого перепугу она заметная? Кому она заметная? Тем кто будет реверсить процессор?

                                firewall, IPS/IDS системы
                                  –2
                                  Да

                                  Обычно в криптопротоколах, соединение устанавливается во время работы, и на этапе рукопожатия устанавливаются режимы, версии алгоритма и тд. То есть если режим сменится, то пользователь может и не узнать об этом.
                                  Изначально вы говорили что режимы влияют на стойкость ключа. А не на поиск одинаковых блоков в открытом тексте.
                                  ЭЭЭ? Извините вы криптоанализом занимались? Если режим предназначенный для коротких сообщений используется на длинных, и в шифртекст попадает статистика открытого текста, то это позволяет со временем вскрыть сообщения. Для симметричных шифров это означает вскрытие ключа. И это не о стойкости шифра или ключа. Это о неправильном использовании алгоритма.
                                  firewall, IPS/IDS системы

                                  Я говорил не об крупных изменениях сетевых пакетоа, а о минимальных изменениях в служебных заголовках в пределах тонкости реализации сетевого протокола, причем количество этой информации может быть очень мелким за один раз — вплоть до 1 байта. 1 байт в служебных заголовках не обнаружт ни одна высокоуровневая система, там не будет сигнатур атаки. Опять же менятся могут скажем не tcp/up пакеты, а например ethernet, если сниффер внедрен в локалку. И это был простейший пример про сетевые пакеты. Вариантов то миллион. Попытаться передать значимую для криптоанализа информацию можно множеством способов — поиграть мощностью wi-fi, лишнюю точку при печати на принтере поставить на полях, монитором померцать, щелчком в динамике и тд. Если противник наблюдает и знает что искать — он эту информацию
                                  получит и использует в криптоанализе.
                                    +2
                                    Криптопротокол и шифрование — это разные вещи.
                                    AES — это алгоритм блочного шифрования. Есть важный момент, при шифровании объем данных не изменяется(выравнивание последнего блока не в счёт), а о моменте смены режима стороны тоже должны договориться. Например, можно зашифровать файл, а через месяц его расшифровать на другом ПК другой реализацией алгоритма. Теперь вопрос: как вторая сторона узнает, что посреди процесса шифрования внезапно изменился режим?

                                      –5
                                      Ребят, вы чего? Я вам что всем прямо сейчас должен прямо конкретную атаку на алгоритм выложить? Моя точка зрения — аппаратная реализация в коммерческом процессоре компании, вынужденной соблюдать законы США, заслуживает гораздо меньшего доверия чем софтовая, потому что для проверки аппаратной реализации нужен реверс инжиниринг всего процессора, а софтовую реазилацию проверить вполне реально даже собственными силами. Итого имеем — плюс аппаратной реализации — быстродействие, минус — огромную трудоемкость проверки. Если за вами АНБ не следит — пользуйтесь пжалста. Потом на тюремном курорте будет считать сэкономленные секунды. :)
                    0
                    мимо

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое