• XSS.stack #1 – первый литературный журнал от юзеров форума

Как расшифровать данные кредитной карты

WhiteCollar

floppy-диск
Забанен
Регистрация
03.12.2020
Сообщения
4
Реакции
0
Пожалуйста, обратите внимание, что пользователь заблокирован
Как расшифровать данные кредитной карты, часть I
Часто возникает вопрос: данные треков, которые я получаю от устройства чтения кредитных карт, зашифрованы. Как мне его расшифровать?

Ответ: вам необходимо получить правильный сеансовый ключ для транзакции, а затем использовать этот ключ для расшифровки полезной нагрузки данных с помощью Triple-DES (или AES, в зависимости от ситуации). b2ap3_thumbnail_security_padlock.jpg
Сам процесс дешифрования, к счастью, не приносит никаких результатов. Скорее всего, вы будете использовать любую из существующих реализаций TDES или AES с открытым исходным кодом (нет необходимости самостоятельно реализовывать основные криптографические подпрограммы), работая в режиме CBC (Cipher Block Chaining), с начальным вектором по умолчанию, состоящим из всех нулевых байтов. . Если у вас есть правильный 16-байтовый ключ дешифрования, процесс дешифрования прост.

Сложная часть - получить ключ. Для этого вам нужно понимать ANSI X9.24-1, также известный как DUKPT.



Добро пожаловать в мир DUKPT

Важно понимать, что в устройствах чтения кредитных карт каждая транзакция создает данные, которые будут зашифрованы с использованием другого ключа. Ключ уникален для данной транзакции (отсюда и аббревиатура DUKPT: Derived Unique Key Per Transaction). Ни один ключ никогда не используется дважды. В результате атаки повторного воспроизведения практически невозможны.

Чтобы понять, как работает DUKPT, вы должны немного узнать о концепции серийного номера ключа или KSN. Главное, что нужно знать, это то, что KSN - это 10-байтовое значение, которое изменяется для каждой транзакции, поскольку нижний 21 бит составляет счетчик.




Макет ключевого серийного номера.

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

Когда устройство чтения карт настроено на шифрование на заводе, ему вводится 16-байтовый ключ и 10-байтовый начальный KSN. Вводимый ключ является производным от суперсекретного ключа (который никогда не вводился), который называется BDK или базовым ключом производного ключа. (Обратите внимание, что, поскольку многие ключи могут быть получены из одного BDK, возможно, и на самом деле это обычное дело, ввести сотни или даже тысячи картридеров с уникальными ключами, которые происходят из одного BDK.) Сам процесс создания требует использования KSN. Поскольку KSN включает в себя информацию о серийном номере устройства (плюс множество другой разной информации о «пространстве имен»), хэш (или ключ), созданный из данной комбинации BDK + KSN, будет по существу уникальным для устройства. Более того, исходный BDK никогда не может быть вычислен на основе хэша (даже если вы знаете KSN), потому что мы говорим о криптографически безопасном одностороннем хеш-коде.

Всякий раз, когда происходит транзакция, устройство для чтения карт (если оно поддерживает DUKPT, как это делают практически все устройства чтения карт в наши дни) генерирует уникальный ключ из текущего значения KSN и из так называемого IPEK (или ключа шифрования исходного PIN-кода). Полученный одноразовый сеансовый ключ затем используется для шифрования конфиденциальных частей данных транзакции.

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



ИПЭК

Отправной точкой для получения сеансового ключа DUKPT всегда является получение IPEK, или начального ключа, что вы можете сделать, только если вы знаете исходный BDK и KSN. (Здесь любой KSN от рассматриваемого устройства будет работать, поскольку вы собираетесь обнулить счетчик для этого шага.)

Чтобы получить начальный ключ шифрования ПИН-кода (IPEK), вам необходимо сделать следующее:

1. Если ваш BDK имеет размер 16 байт, увеличьте его до 24 байтов с помощью так называемого метода EDE3. Это просто означает: скопируйте первые 8 байтов ключа в конец ключа, создав 24-байтовый ключ, в котором первые и последние 8 байтов совпадают.

Если ваш исходный ключ (шестнадцатеричный) выглядит так:

0123456789ABCDEFFEDCBA9876543210
Вы хотите, чтобы это выглядело так:

0123456789ABCDEFFEDCBA98765432100123456789ABCDEF
2. Замаскируйте свой 10-байтовый начальный KSN, связав его с шестнадцатеричным значением 0xFFFFFFFFFFFFFFE00000. Назовем результат «замаскированный KSN».

3. Создайте 8-байтовое значение из замаскированного KSN, сохранив только первые (т. Е. Крайние левые) 8 байтов 10-байтового замаскированного KSN. Другими словами, отрежьте два крайних правых байта.

4. Используя расширенный 24-байтовый BDK в качестве ключа, зашифруйте TDES 8 байтов замаскированного KSN, полученного на шаге 3. Для этого вы будете использовать начальный вектор всех нулей. (Обратите внимание, что цепочка блоков шифрования здесь не имеет смысла, поскольку данные в этом случае представляют собой всего один блок lon

g: 8 байт.) Сохраните 8-байтовый шифр, полученный на этом этапе, потому что он станет левой половиной 16-байтового IPEK.

5. Чтобы получить правую половину IPEK, сначала выполните операцию XOR исходного 16-байтового BDK с шестнадцатеричным значением 0xC0C0C0C000000000C0C0C0C000000000. (Если вы используете язык программирования, который поддерживает математику с большими целыми числами, это можно сделать в одной строке кода. Если нет, вам нужно будет выполнить операцию XOR для двух значений постепенно, по частям.)

6. EDE3-разверните 16-байтовое значение, полученное на шаге 5, чтобы получить 24-байтовое значение ключа.

7. Используя 24-байтовое значение ключа на шаге 6, TDES-зашифруйте 8 байтов замаскированного KSN, полученного на шаге 3. Теперь это правая половина IPEK.

8. Соедините левую и правую половинки IPEK. Теперь у вас есть последний 16-байтовый IPEK.

Если вы реализуете это в коде самостоятельно, попробуйте создать IPEK из значения тестового ключа 0123456789ABCDEFFEDCBA9876543210 и KSN 62994900000000000001. В результате IPEK должен быть B5610650EBC24CA3CACDD08DDAFE8CE3.



Управление ключами и алгоритмы шифрования

Кстати, вы заметите, что Triple-DES (TDES) часто используется в DUKPT. AES никогда не используется (даже если ваш кардридер настроен на использование AES для шифрования). Стандарт X9.24 требует TDES, а иногда и простого DES. Помните, что процесс получения ключа DUKPT полностью отделен от процесса шифрования / дешифрования данных транзакции. В одном случае вы получаете ключ. В другом случае вы используете этот ключ для кодирования TDES или AES. Ни одна процедура шифрования не знает и не заботится о том, откуда взялся ваш ключ или какие алгоритмы использовались при его создании; единственное, что имеет значение, так это то, что работает сам ключ. Таким образом, хотя данные, которые вам нужно разблокировать, вполне могли быть зашифрованы с помощью AES, ключ, который вы используете для разблокировки этих данных, будет получен с помощью DUKPT, который (внутренне) использует TDES.



Где код?

Часть II

Как расшифровать данные кредитной карты, часть II
Клиенты часто спрашивают: как я могу расшифровать данные, поступающие с моего устройства чтения кредитных карт ID TECH?

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

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

Возникает вопрос: как получить ключ DUKPT, который разблокирует данную транзакцию? Ответ: Вообще говоря, вам нужен серийный номер ключа (KSN) для транзакции, а также специальное значение, называемое IPEK, или начальный ключ, который был введен в считыватель кредитных карт. IPEK, в свою очередь, является производным от суперсекретного ключа (который никогда не вводится в устройство чтения карт), называемого BDK (базовый ключ получения). В отличие от BDK, IPEK уникален для данного физического устройства. (Один BDK может быть источником множества уникальных IPEK.) Если вы не знаете IPEK для вашего устройства (и нет причин, по которым вы это знаете, поскольку IPEK никогда нигде не записывается), вы можете получить его из KSN. и базовый ключ деривации, используя технику, описанную в Части I этой статьи.

Получение сеансового ключа (иногда называемого рабочим ключом или просто «ключом данных») на самом деле лучше всего рассматривать как трехэтапный процесс. Шаги следующие:

1. Используйте BDK и KSN для получения IPEK. (Подробнее о том, как это сделать, см. В Части I этой статьи.)

2. Используйте алгоритм получения ключа ANSI X9.24 (DUKPT), чтобы получить базовый ключ или начальный «производный ключ» из KSN и IPEK.

3. Преобразуйте ключ, полученный на шаге 2, в выбранный вами ключ данных, ключ PIN или ключ MAC. (Обратите внимание, что, хотя большинство устройств чтения кредитных карт настроено на использование ключа варианта данных для ключа сеанса транзакции, некоторые фактически настроены на использование варианта ПИН-кода.)

Давайте посмотрим, что нужно для получения «производного ключа» (шаг 2), поскольку это, безусловно, самая трудоемкая часть трехэтапного процесса. Как только мы получим производный ключ, мы поговорим о том, как преобразовать его в вариант данных, PIN или MAC, что относительно просто.

Мы будем использовать изрядное количество псевдокода ниже, но будьте уверены, вы можете найти полный рабочий исходный код (на JavaScript) для всех следующих шагов в нашем популярном инструменте шифрования / дешифрования. (Попробуйте прямо сейчас, если вы еще этого не сделали. Это автономная веб-страница, которая работает в любом современном браузере.)



Получение ключа

Чтобы получить базовый ключ, на основе которого можно создать вариант данных, PIN-кода или MAC, вам необходимо начать с транзакции KSN и IPEK. Как только они у вас появятся (опять же: см. Часть I этой серии), сделайте следующее:

1. Получите нижние (крайние правые) 8 байтов вашего 10-байтового KSN. Отбросьте два верхних байта.

2. Создайте переменную BaseKSN для хранения замаскированной версии вашего 8-байтового KSN. Получите маскированную версию, выполнив И 8-байтовый KSN из шага 1 с (шестнадцатеричным) значением 0xFFFFF

FFFFFE00000.

3. Получите биты счетчика из исходного (не замаскированного!) 10-байтового KSN, сложив его нижние три байта AND с 0x1FFFFF. (Напомним, что нижний 21 бит KSN составляет счетчик транзакций.) Мы поместим это в переменную, называемую (что еще?) Counter.

4. Скопируйте свой 16-байтовый IPEK в переменную curKey.

5. Теперь нам нужно создать петлю. Каждый раз при прохождении цикла мы будем проверять биты счетчика (начиная с верхнего бита или 21-го бита; при втором проходе цикла мы проверяем 20-й бит, затем 19-й бит и т. Д.) . Каждый раз, когда мы находим включенный бит, мы вводим его в BaseKSN с помощью ИЛИ, а затем вызываем generateKey () для обновления curKey. BaseKSN будет накапливать биты при каждом прохождении цикла, а значение curKey будет обновляться с каждым включенным битом счетчика, который мы найдем.

for (var shiftReg = 0x100000; shiftReg> 0; shiftReg >> = 1) if ((shiftReg & counter)> 0) {baseKSN | = shiftReg; curKey = generateKey (curKey, BaseKSN); }
Что делает generateKey ()? Рад, что ты спросил! Если ваш язык программирования поддерживает математику BigInteger, код будет выглядеть примерно так:

функция generateKey (key, ksn) {var mask = 0xC0C0C0C000000000C0C0C0C000000000; var maskedKey = маска ^ ключ; var left = encryptRegister (maskedKey, ksn); var right = encryptRegister (ключ, ksn); return (left << 64) | верно; // соединяем левую и правую части вместе}
Хорошо. Вы можете видеть, что 16-байтовый ключ замаскирован, а затем используется для шифрования 8-байтового значения ksn, чтобы получить левую половину (левые 8 байтов) нового ключа. Правая половина нового ключа - это шифр, созданный из того же ksn, но с использованием немаскированного ключа.

Наконец, вам нужно знать, как выглядит encryptRegister (). Это оно:

// Возвращает 8-байтовый результат function encryptRegister (key, ksn) {var CBC = 1; // включение цепочки блоков шифрования var iv = ""; // начальный вектор var bottom8 = key & 0xFFFFFFFFFFFFFFFF; // 8 нижних байтов var top8 = (key & 0xFFFFFFFFFFFFFFFF0000000000000000) >> 64; // верхние 8 байтов var bottom8xorKSN = bottom8 ^ ksn; // Это будет одинарный DES из-за 8-байтового ключа: var desEncrypted = des (top8, bottom8xorKSN, true, / * encrypt * / CBC, iv); var result = bottom8 ^ desEncrypted; вернуть результат; // возвращаем 8-байтовый результат}
Обратите внимание, что цепочка блоков шифрования здесь на самом деле бессмысленна, потому что мы шифруем 8-байтовое значение (один блок данных). Нет ничего, что можно было бы связать. Он включен в код просто потому, что для процедуры шифрования требуется параметр, который говорит «да» или «нет» цепочке.

Также обратите внимание, что мы используем 8-байтовый ключ для шифрования. TDES по умолчанию использует одинарный DES, если длина ключа составляет всего 8 байтов. Это потому, что 8-байтовый ключ (в тройном DES) приведет к циклу шифрования / дешифрования / шифрования, который эквивалентен выполнению одиночного шифрования.

Простым английским объяснением происходящего является то, что процедура использует верхние 8 байтов 16-байтового ключа для шифрования специального значения, полученного в результате операции XOR с нижними 8 байтами ключа с помощью (8-байтового) ksn. В результате получается односторонний хеш ksn.

Сложите все это вместе, и в результате цикл из шага 5 выше дает значение curKey, которое в конечном итоге становится базовым ключом, из которого мы можем получить варианты Data, PIN или MAC. (Цикл на шаге 5 является или должен быть частью функции, которая в конечном итоге возвращает curKey, который является базовым ключом.)

Пришло время более подробно рассмотреть эти три «ключевых варианта».



Создание вариантов ключей данных, PIN и MAC

ANSI X9.24 позволяет ключу DUKPT принимать одну из трех окончательных форм, называемых вариантами. Формы: MAC, PIN и данные. Давайте отложим обсуждение того, для чего используются эти различные типы ключей, чтобы сосредоточиться на том, как они создаются.

Отправной точкой для любого из вариантов является базовый ключ DUKPT (производный ключ, который мы назвали curKey на шаге 5 выше). Чтобы получить вариант MAC, вам просто нужно выполнить XOR базового ключа («производного ключа») со специальной константой:

MACkey = производный ключ ^ 0x000000000000FF00000000000000FF00;
Вариант ПИН-кода также создается аналогичным образом, но с другой константой:

PINkey = производный ключ ^ 0x00000000000000FF00000000000000FF;
Вариант данных требует еще одной константы:

Datakey = производный ключ ^ 0x0000000000FF00000000000000FF0000;
Для вариантов MAC и PIN операция XOR представляет собой последний шаг в создании соответствующего сеансового ключа. Для варианта данных обычно выполняется один дополнительный шаг, связанный с односторонним хешированием (чтобы исключить любую возможность обратного преобразования ключа данных в ключ MAC). В псевдокоде:

// левая половина: var left = des (EDE3KeyExpand (производный ключ), top8bytes (производный ключ), true, CBC, iv); // правая половина: var right = des (EDE3KeyExpand (производный ключ), bottom8bytes (производный ключ), true, CBC, iv); finalDataKey = (left << 64) | верно; // объединяем половинки
На английском языке: сначала получите 24-байтовую версию производного ключа, используя метод расширения EDE3. (Это просто означает копирование первых 8 байтов 16-байтового ключа в конец ключа, создавая

24-байтовый ключ, в котором первые и последние 8 байтов совпадают.) Используйте этот ключ для TDES-шифрования первых 8 байтов вашего 16-байтового производного ключа, создавая тем самым 8-байтовый шифр. Это левая половина окончательного ключа данных. Чтобы создать правую половину, используйте тот же 24-байтовый ключ для шифрования нижних 8 байтов производного ключа. Объедините два 8-байтовых шифра (левый и правый), и все готово.



Известные хорошие ценности

Если вы пытаетесь сделать это дома, возможно, вы захотите сравнить свою работу с некоторыми общеизвестными ценностями. Итак, начните с 16-байтового BDK 0123456789ABCDEFFEDCBA9876543210 (шестнадцатеричное), которое является значением тестового ключа, которое все склонны использовать. Попробуйте проверить значение KSN 629949012C0000000003. Эти два значения должны позволить вам получить IPEK D2943CCF80F42E88E23C12D1162FD547. (Обратитесь к части I этой статьи, если хотите узнать, как получить IPEK.)

Начиная с вышеупомянутого IPEK, вы должны увидеть следующие значения при выводе «производного ключа» (или базового ключа DUKPT):

При первом прохождении через «если» цикла KSN-counter ваш BaseKSN будет 49012C0000000002, а curKey станет B58CDA5C7A1E9FF5E7335B988626D01A после generateKey ().

Во время второго прохода через «if» цикла счетчика вы обработаете оба бита «ON» счетчика, и поэтому ваш BaseKSN будет 49012C0000000003, а результирующий curKey будет 841AB7B94ED086EBC2B8A8385DA7DFCA. (Помните, что вы выполняете операцию ИЛИ битов счетчика, сначала MSB, в BaseKSN. Если счетчик заканчивается на 0x0F, BaseKSN переходит с 49012C0000000008 на 49012C000000000C, на 49012C000000000E и на 49012C000000000F, если вы последовательно выполняете операцию OR битов.)

Таким образом, ваш «производный ключ» будет 841AB7B94ED086EBC2B8A8385DA7DFCA.

После выполнения XOR константы варианта данных производный ключ изменится на 841AB7B94E2F86EBC2B8A8385D58DFCA.

После шифрования верхней и нижней половин последнего значения с помощью ключа расширения EDE3 841AB7B94E2F86EBC2B8A8385D58DFCA841AB7B94E2F86EB вы должны получить окончательный ключ данных F739AEF595D3877F731782D28BB6AC4F. То есть: используя 24-байтовое значение ключа EDE3 для шифрования 841AB7B94E2F86EB, вы должны получить шифр F739AEF595D3877F, и используя тот же ключ для шифрования C2B8A8385D58DFCA, вы должны получить шифр 731782D28BB6AC4F. Соедините шифры, и все готово. Теперь у вас есть 16-байтовый ключ, с помощью которого вы можете расшифровать данные из транзакции, KSN которой был 629949012C0000000003.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Моё предложение - сделать нормальный шрифт у темы, а то уж очень вырвиглазно читать.
к сожалению, у меня нет разрешения на редактирование моей темы
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Аа в чем смысл этого поста? Конкурс подразумевает уникальную статью а не копии ctrl+c-ctrl+v еще и без указания источника...
source: carder.uk/threads/kak-rasshifrovat-dannye-kreditnoj-karty.94948
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
Как расшифровать данные кредитной карты, часть I
Часто возникает вопрос: данные треков, которые я получаю от устройства чтения кредитных карт, зашифрованы. Как мне его расшифровать?

Ответ: вам необходимо получить правильный сеансовый ключ для транзакции, а затем использовать этот ключ для расшифровки полезной нагрузки данных с помощью Triple-DES (или AES, в зависимости от ситуации). b2ap3_thumbnail_security_padlock.jpg
Сам процесс дешифрования, к счастью, не приносит никаких результатов. Скорее всего, вы будете использовать любую из существующих реализаций TDES или AES с открытым исходным кодом (нет необходимости самостоятельно реализовывать основные криптографические подпрограммы), работая в режиме CBC (Cipher Block Chaining), с начальным вектором по умолчанию, состоящим из всех нулевых байтов. . Если у вас есть правильный 16-байтовый ключ дешифрования, процесс дешифрования прост.

Сложная часть - получить ключ. Для этого вам нужно понимать ANSI X9.24-1, также известный как DUKPT.



Добро пожаловать в мир DUKPT

Важно понимать, что в устройствах чтения кредитных карт каждая транзакция создает данные, которые будут зашифрованы с использованием другого ключа. Ключ уникален для данной транзакции (отсюда и аббревиатура DUKPT: Derived Unique Key Per Transaction). Ни один ключ никогда не используется дважды. В результате атаки повторного воспроизведения практически невозможны.

Чтобы понять, как работает DUKPT, вы должны немного узнать о концепции серийного номера ключа или KSN. Главное, что нужно знать, это то, что KSN - это 10-байтовое значение, которое изменяется для каждой транзакции, поскольку нижний 21 бит составляет счетчик.




Макет ключевого серийного номера.

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

Когда устройство чтения карт настроено на шифрование на заводе, ему вводится 16-байтовый ключ и 10-байтовый начальный KSN. Вводимый ключ является производным от суперсекретного ключа (который никогда не вводился), который называется BDK или базовым ключом производного ключа. (Обратите внимание, что, поскольку многие ключи могут быть получены из одного BDK, возможно, и на самом деле это обычное дело, ввести сотни или даже тысячи картридеров с уникальными ключами, которые происходят из одного BDK.) Сам процесс создания требует использования KSN. Поскольку KSN включает в себя информацию о серийном номере устройства (плюс множество другой разной информации о «пространстве имен»), хэш (или ключ), созданный из данной комбинации BDK + KSN, будет по существу уникальным для устройства. Более того, исходный BDK никогда не может быть вычислен на основе хэша (даже если вы знаете KSN), потому что мы говорим о криптографически безопасном одностороннем хеш-коде.

Всякий раз, когда происходит транзакция, устройство для чтения карт (если оно поддерживает DUKPT, как это делают практически все устройства чтения карт в наши дни) генерирует уникальный ключ из текущего значения KSN и из так называемого IPEK (или ключа шифрования исходного PIN-кода). Полученный одноразовый сеансовый ключ затем используется для шифрования конфиденциальных частей данных транзакции.

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



ИПЭК

Отправной точкой для получения сеансового ключа DUKPT всегда является получение IPEK, или начального ключа, что вы можете сделать, только если вы знаете исходный BDK и KSN. (Здесь любой KSN от рассматриваемого устройства будет работать, поскольку вы собираетесь обнулить счетчик для этого шага.)

Чтобы получить начальный ключ шифрования ПИН-кода (IPEK), вам необходимо сделать следующее:

1. Если ваш BDK имеет размер 16 байт, увеличьте его до 24 байтов с помощью так называемого метода EDE3. Это просто означает: скопируйте первые 8 байтов ключа в конец ключа, создав 24-байтовый ключ, в котором первые и последние 8 байтов совпадают.

Если ваш исходный ключ (шестнадцатеричный) выглядит так:

0123456789ABCDEFFEDCBA9876543210
Вы хотите, чтобы это выглядело так:

0123456789ABCDEFFEDCBA98765432100123456789ABCDEF
2. Замаскируйте свой 10-байтовый начальный KSN, связав его с шестнадцатеричным значением 0xFFFFFFFFFFFFFFE00000. Назовем результат «замаскированный KSN».

3. Создайте 8-байтовое значение из замаскированного KSN, сохранив только первые (т. Е. Крайние левые) 8 байтов 10-байтового замаскированного KSN. Другими словами, отрежьте два крайних правых байта.

4. Используя расширенный 24-байтовый BDK в качестве ключа, зашифруйте TDES 8 байтов замаскированного KSN, полученного на шаге 3. Для этого вы будете использовать начальный вектор всех нулей. (Обратите внимание, что цепочка блоков шифрования здесь не имеет смысла, поскольку данные в этом случае представляют собой всего один блок lon

g: 8 байт.) Сохраните 8-байтовый шифр, полученный на этом этапе, потому что он станет левой половиной 16-байтового IPEK.

5. Чтобы получить правую половину IPEK, сначала выполните операцию XOR исходного 16-байтового BDK с шестнадцатеричным значением 0xC0C0C0C000000000C0C0C0C000000000. (Если вы используете язык программирования, который поддерживает математику с большими целыми числами, это можно сделать в одной строке кода. Если нет, вам нужно будет выполнить операцию XOR для двух значений постепенно, по частям.)

6. EDE3-разверните 16-байтовое значение, полученное на шаге 5, чтобы получить 24-байтовое значение ключа.

7. Используя 24-байтовое значение ключа на шаге 6, TDES-зашифруйте 8 байтов замаскированного KSN, полученного на шаге 3. Теперь это правая половина IPEK.

8. Соедините левую и правую половинки IPEK. Теперь у вас есть последний 16-байтовый IPEK.

Если вы реализуете это в коде самостоятельно, попробуйте создать IPEK из значения тестового ключа 0123456789ABCDEFFEDCBA9876543210 и KSN 62994900000000000001. В результате IPEK должен быть B5610650EBC24CA3CACDD08DDAFE8CE3.



Управление ключами и алгоритмы шифрования

Кстати, вы заметите, что Triple-DES (TDES) часто используется в DUKPT. AES никогда не используется (даже если ваш кардридер настроен на использование AES для шифрования). Стандарт X9.24 требует TDES, а иногда и простого DES. Помните, что процесс получения ключа DUKPT полностью отделен от процесса шифрования / дешифрования данных транзакции. В одном случае вы получаете ключ. В другом случае вы используете этот ключ для кодирования TDES или AES. Ни одна процедура шифрования не знает и не заботится о том, откуда взялся ваш ключ или какие алгоритмы использовались при его создании; единственное, что имеет значение, так это то, что работает сам ключ. Таким образом, хотя данные, которые вам нужно разблокировать, вполне могли быть зашифрованы с помощью AES, ключ, который вы используете для разблокировки этих данных, будет получен с помощью DUKPT, который (внутренне) использует TDES.



Где код?

Часть II

Как расшифровать данные кредитной карты, часть II
Клиенты часто спрашивают: как я могу расшифровать данные, поступающие с моего устройства чтения кредитных карт ID TECH?

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

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

Возникает вопрос: как получить ключ DUKPT, который разблокирует данную транзакцию? Ответ: Вообще говоря, вам нужен серийный номер ключа (KSN) для транзакции, а также специальное значение, называемое IPEK, или начальный ключ, который был введен в считыватель кредитных карт. IPEK, в свою очередь, является производным от суперсекретного ключа (который никогда не вводится в устройство чтения карт), называемого BDK (базовый ключ получения). В отличие от BDK, IPEK уникален для данного физического устройства. (Один BDK может быть источником множества уникальных IPEK.) Если вы не знаете IPEK для вашего устройства (и нет причин, по которым вы это знаете, поскольку IPEK никогда нигде не записывается), вы можете получить его из KSN. и базовый ключ деривации, используя технику, описанную в Части I этой статьи.

Получение сеансового ключа (иногда называемого рабочим ключом или просто «ключом данных») на самом деле лучше всего рассматривать как трехэтапный процесс. Шаги следующие:

1. Используйте BDK и KSN для получения IPEK. (Подробнее о том, как это сделать, см. В Части I этой статьи.)

2. Используйте алгоритм получения ключа ANSI X9.24 (DUKPT), чтобы получить базовый ключ или начальный «производный ключ» из KSN и IPEK.

3. Преобразуйте ключ, полученный на шаге 2, в выбранный вами ключ данных, ключ PIN или ключ MAC. (Обратите внимание, что, хотя большинство устройств чтения кредитных карт настроено на использование ключа варианта данных для ключа сеанса транзакции, некоторые фактически настроены на использование варианта ПИН-кода.)

Давайте посмотрим, что нужно для получения «производного ключа» (шаг 2), поскольку это, безусловно, самая трудоемкая часть трехэтапного процесса. Как только мы получим производный ключ, мы поговорим о том, как преобразовать его в вариант данных, PIN или MAC, что относительно просто.

Мы будем использовать изрядное количество псевдокода ниже, но будьте уверены, вы можете найти полный рабочий исходный код (на JavaScript) для всех следующих шагов в нашем популярном инструменте шифрования / дешифрования. (Попробуйте прямо сейчас, если вы еще этого не сделали. Это автономная веб-страница, которая работает в любом современном браузере.)



Получение ключа

Чтобы получить базовый ключ, на основе которого можно создать вариант данных, PIN-кода или MAC, вам необходимо начать с транзакции KSN и IPEK. Как только они у вас появятся (опять же: см. Часть I этой серии), сделайте следующее:

1. Получите нижние (крайние правые) 8 байтов вашего 10-байтового KSN. Отбросьте два верхних байта.

2. Создайте переменную BaseKSN для хранения замаскированной версии вашего 8-байтового KSN. Получите маскированную версию, выполнив И 8-байтовый KSN из шага 1 с (шестнадцатеричным) значением 0xFFFFF

FFFFFE00000.

3. Получите биты счетчика из исходного (не замаскированного!) 10-байтового KSN, сложив его нижние три байта AND с 0x1FFFFF. (Напомним, что нижний 21 бит KSN составляет счетчик транзакций.) Мы поместим это в переменную, называемую (что еще?) Counter.

4. Скопируйте свой 16-байтовый IPEK в переменную curKey.

5. Теперь нам нужно создать петлю. Каждый раз при прохождении цикла мы будем проверять биты счетчика (начиная с верхнего бита или 21-го бита; при втором проходе цикла мы проверяем 20-й бит, затем 19-й бит и т. Д.) . Каждый раз, когда мы находим включенный бит, мы вводим его в BaseKSN с помощью ИЛИ, а затем вызываем generateKey () для обновления curKey. BaseKSN будет накапливать биты при каждом прохождении цикла, а значение curKey будет обновляться с каждым включенным битом счетчика, который мы найдем.

for (var shiftReg = 0x100000; shiftReg> 0; shiftReg >> = 1) if ((shiftReg & counter)> 0) {baseKSN | = shiftReg; curKey = generateKey (curKey, BaseKSN); }
Что делает generateKey ()? Рад, что ты спросил! Если ваш язык программирования поддерживает математику BigInteger, код будет выглядеть примерно так:

функция generateKey (key, ksn) {var mask = 0xC0C0C0C000000000C0C0C0C000000000; var maskedKey = маска ^ ключ; var left = encryptRegister (maskedKey, ksn); var right = encryptRegister (ключ, ksn); return (left << 64) | верно; // соединяем левую и правую части вместе}
Хорошо. Вы можете видеть, что 16-байтовый ключ замаскирован, а затем используется для шифрования 8-байтового значения ksn, чтобы получить левую половину (левые 8 байтов) нового ключа. Правая половина нового ключа - это шифр, созданный из того же ksn, но с использованием немаскированного ключа.

Наконец, вам нужно знать, как выглядит encryptRegister (). Это оно:

// Возвращает 8-байтовый результат function encryptRegister (key, ksn) {var CBC = 1; // включение цепочки блоков шифрования var iv = ""; // начальный вектор var bottom8 = key & 0xFFFFFFFFFFFFFFFF; // 8 нижних байтов var top8 = (key & 0xFFFFFFFFFFFFFFFF0000000000000000) >> 64; // верхние 8 байтов var bottom8xorKSN = bottom8 ^ ksn; // Это будет одинарный DES из-за 8-байтового ключа: var desEncrypted = des (top8, bottom8xorKSN, true, / * encrypt * / CBC, iv); var result = bottom8 ^ desEncrypted; вернуть результат; // возвращаем 8-байтовый результат}
Обратите внимание, что цепочка блоков шифрования здесь на самом деле бессмысленна, потому что мы шифруем 8-байтовое значение (один блок данных). Нет ничего, что можно было бы связать. Он включен в код просто потому, что для процедуры шифрования требуется параметр, который говорит «да» или «нет» цепочке.

Также обратите внимание, что мы используем 8-байтовый ключ для шифрования. TDES по умолчанию использует одинарный DES, если длина ключа составляет всего 8 байтов. Это потому, что 8-байтовый ключ (в тройном DES) приведет к циклу шифрования / дешифрования / шифрования, который эквивалентен выполнению одиночного шифрования.

Простым английским объяснением происходящего является то, что процедура использует верхние 8 байтов 16-байтового ключа для шифрования специального значения, полученного в результате операции XOR с нижними 8 байтами ключа с помощью (8-байтового) ksn. В результате получается односторонний хеш ksn.

Сложите все это вместе, и в результате цикл из шага 5 выше дает значение curKey, которое в конечном итоге становится базовым ключом, из которого мы можем получить варианты Data, PIN или MAC. (Цикл на шаге 5 является или должен быть частью функции, которая в конечном итоге возвращает curKey, который является базовым ключом.)

Пришло время более подробно рассмотреть эти три «ключевых варианта».



Создание вариантов ключей данных, PIN и MAC

ANSI X9.24 позволяет ключу DUKPT принимать одну из трех окончательных форм, называемых вариантами. Формы: MAC, PIN и данные. Давайте отложим обсуждение того, для чего используются эти различные типы ключей, чтобы сосредоточиться на том, как они создаются.

Отправной точкой для любого из вариантов является базовый ключ DUKPT (производный ключ, который мы назвали curKey на шаге 5 выше). Чтобы получить вариант MAC, вам просто нужно выполнить XOR базового ключа («производного ключа») со специальной константой:

MACkey = производный ключ ^ 0x000000000000FF00000000000000FF00;
Вариант ПИН-кода также создается аналогичным образом, но с другой константой:

PINkey = производный ключ ^ 0x00000000000000FF00000000000000FF;
Вариант данных требует еще одной константы:

Datakey = производный ключ ^ 0x0000000000FF00000000000000FF0000;
Для вариантов MAC и PIN операция XOR представляет собой последний шаг в создании соответствующего сеансового ключа. Для варианта данных обычно выполняется один дополнительный шаг, связанный с односторонним хешированием (чтобы исключить любую возможность обратного преобразования ключа данных в ключ MAC). В псевдокоде:

// левая половина: var left = des (EDE3KeyExpand (производный ключ), top8bytes (производный ключ), true, CBC, iv); // правая половина: var right = des (EDE3KeyExpand (производный ключ), bottom8bytes (производный ключ), true, CBC, iv); finalDataKey = (left << 64) | верно; // объединяем половинки
На английском языке: сначала получите 24-байтовую версию производного ключа, используя метод расширения EDE3. (Это просто означает копирование первых 8 байтов 16-байтового ключа в конец ключа, создавая

24-байтовый ключ, в котором первые и последние 8 байтов совпадают.) Используйте этот ключ для TDES-шифрования первых 8 байтов вашего 16-байтового производного ключа, создавая тем самым 8-байтовый шифр. Это левая половина окончательного ключа данных. Чтобы создать правую половину, используйте тот же 24-байтовый ключ для шифрования нижних 8 байтов производного ключа. Объедините два 8-байтовых шифра (левый и правый), и все готово.



Известные хорошие ценности

Если вы пытаетесь сделать это дома, возможно, вы захотите сравнить свою работу с некоторыми общеизвестными ценностями. Итак, начните с 16-байтового BDK 0123456789ABCDEFFEDCBA9876543210 (шестнадцатеричное), которое является значением тестового ключа, которое все склонны использовать. Попробуйте проверить значение KSN 629949012C0000000003. Эти два значения должны позволить вам получить IPEK D2943CCF80F42E88E23C12D1162FD547. (Обратитесь к части I этой статьи, если хотите узнать, как получить IPEK.)

Начиная с вышеупомянутого IPEK, вы должны увидеть следующие значения при выводе «производного ключа» (или базового ключа DUKPT):

При первом прохождении через «если» цикла KSN-counter ваш BaseKSN будет 49012C0000000002, а curKey станет B58CDA5C7A1E9FF5E7335B988626D01A после generateKey ().

Во время второго прохода через «if» цикла счетчика вы обработаете оба бита «ON» счетчика, и поэтому ваш BaseKSN будет 49012C0000000003, а результирующий curKey будет 841AB7B94ED086EBC2B8A8385DA7DFCA. (Помните, что вы выполняете операцию ИЛИ битов счетчика, сначала MSB, в BaseKSN. Если счетчик заканчивается на 0x0F, BaseKSN переходит с 49012C0000000008 на 49012C000000000C, на 49012C000000000E и на 49012C000000000F, если вы последовательно выполняете операцию OR битов.)

Таким образом, ваш «производный ключ» будет 841AB7B94ED086EBC2B8A8385DA7DFCA.

После выполнения XOR константы варианта данных производный ключ изменится на 841AB7B94E2F86EBC2B8A8385D58DFCA.

После шифрования верхней и нижней половин последнего значения с помощью ключа расширения EDE3 841AB7B94E2F86EBC2B8A8385D58DFCA841AB7B94E2F86EB вы должны получить окончательный ключ данных F739AEF595D3877F731782D28BB6AC4F. То есть: используя 24-байтовое значение ключа EDE3 для шифрования 841AB7B94E2F86EB, вы должны получить шифр F739AEF595D3877F, и используя тот же ключ для шифрования C2B8A8385D58DFCA, вы должны получить шифр 731782D28BB6AC4F. Соедините шифры, и все готово. Теперь у вас есть 16-байтовый ключ, с помощью которого вы можете расшифровать данные из транзакции, KSN которой был 629949012C0000000003.
Но очень интересно.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх