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

Carding 4 Carders

Professional
Messages
2,731
Reputation
12
Reaction score
1,305
Points
113
Часто возникает вопрос: данные треков, которые я получаю от устройства чтения кредитных карт ID TECH, зашифрованы. Как мне его расшифровать?

Ответ: вам необходимо получить правильный сеансовый ключ для транзакции, а затем использовать этот ключ для расшифровки полезной нагрузки данных с помощью Triple-DES (или AES, в зависимости от ситуации).

Сам процесс дешифрования, к счастью, не приносит никаких результатов. Скорее всего, вы будете использовать любую из существующих реализаций 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 от рассматриваемого устройства будет работать, поскольку вы собираетесь обнулить счетчик для этого шага.)

Чтобы получить начальный ключ шифрования PIN-кода (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. Для этого вы будете использовать начальный вектор всех нулей. (Обратите внимание, что цепочка блоков шифрования здесь не имеет смысла, поскольку данные в этом случае составляют всего один блок: 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.

Где код?

Во второй части этого поста мы подробно рассмотрим, как использовать IPEK и KSN для получения фактического сеансового ключа DUKPT. Мы увидим реальный исходный код, чтобы вы могли все сделать самостоятельно. Если вы не можете дождаться следующего раза, чтобы увидеть исходный код, загляните в популярный инструмент шифрования / дешифрования, который содержит полнофункциональную реализацию JavaScript алгоритмов DUKPT, о которых я расскажу в части II ( в комплекте с реализациями TDES и AES с открытым исходным кодом). Вы можете использовать инструмент шифрования / дешифрования для получения ключей DUKPT (во всех трех вариантах: PIN, данные и MAC), шифрования или дешифрования данных (с помощью TDES или AES), генерации различных типов хэшей и многого другого. Лучше всего, поскольку инструмент представляет собой просто веб-страницу, он будет работать в любом браузере (на любой платформе), поддерживающем JavaScript.

Хотите получить сеансовый ключ DUKPT с вариантами данных из KSN и IPEK? Перейдите к Части II этой статьи.

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

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

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

Возникает вопрос: как получить ключ DUKPT, который разблокирует данную транзакцию? Ответ: Вообще говоря, вам нужен серийный номер ключа (KSN) для транзакции, а также специальное значение, называемое IPEK, или начальный ключ, который был введен в считыватель кредитных карт. IPEK, в свою очередь, является производным от суперсекретного ключа (который никогда не вводится в устройство чтения карт), который называется BDK (Base Derivation Key). В отличие от 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 с (шестнадцатеричным) значением 0xFFFFFFFFFFE00000.

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

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

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

Code:
for (var shiftReg = 0x100000; shiftReg > 0; shiftReg >>= 1)         if ( ( shiftReg & counter ) > 0 )  { baseKSN |= shiftReg; curKey = generateKey( curKey, BaseKSN );  }

Что generateKey() делать? Рад, что ты спросил! Если ваш язык программирования поддерживает математику BigInteger, код будет выглядеть примерно так:

Code:
function generateKey(key, ksn) { var mask = 0xC0C0C0C000000000C0C0C0C000000000; var maskedKey = mask ^ key; var left = encryptRegister( maskedKey, ksn ); var right = encryptRegister( key, ksn ); return (left << 64) | right; // join left and right together }

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

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

Code:
// Returns an 8-byte result function encryptRegister(key, ksn) { var CBC = 1; // cipher block chaining enabled var iv = ""; // initial vector var bottom8 = key & 0xFFFFFFFFFFFFFFFF; // bottom 8 bytes var top8 = (key & 0xFFFFFFFFFFFFFFFF0000000000000000) >> 64; // top 8 bytes var bottom8xorKSN = bottom8 ^ ksn; // This will be single-DES because of the 8-byte key: var desEncrypted = des( top8, bottom8xorKSN, true, /* encrypt */ CBC, iv ); var result = bottom8 ^ desEncrypted; return result; // return the 8-byte result }

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

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

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

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

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

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

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

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

Вариант ПИН-кода также создается аналогичным образом, но с другой константой:
Code:
PINkey = derivedKey ^ 0x00000000000000FF00000000000000FF;

Вариант данных требует еще одной константы:
Code:
Datakey = derivedKey ^ 0x0000000000FF00000000000000FF0000;

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

Code:
// left half: var left = des( EDE3KeyExpand( derivedKey ), top8bytes( derivedKey ), true, CBC, iv ); // right half: var right = des( EDE3KeyExpand( derivedKey ), bottom8bytes( derivedKey ), true, CBC, iv ); finalDataKey = (left << 64) | right; // combine halves

На английском языке: сначала получите 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 ваш 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.

Пример кода: средство шифрования / дешифрования ID TECH

Чтобы увидеть полный исходный код всех описанных здесь подпрограмм получения ключей DUKPT, обязательно загрузите (и проверьте исходный код) инструмент шифрования / дешифрования на основе HTML и JavaScript, который может вычислять IPEK, выводить все три DUKPT. ключевые варианты, шифрование или дешифрование данных с использованием TDES или AES и многое другое. Вы можете использовать отличный набор инструментов консоли разработчика Chrome для пошагового выполнения кода инструмента в режиме реального времени, проверки значений переменных по мере их изменения, установки точек останова и т.д. Это огромная помощь в обучении. И это бесплатно! Так что загрузите инструмент шифрования / дешифрования, поиграйте с ним и расскажите о нем своим друзьям. Насколько мне известно, это единственная реализация DUKPT на чистом JavaScript в сети.
 

peachmotion

Member
Messages
5
Reputation
0
Reaction score
0
Points
1
what about info like this , found it while sniffing a request for set pin to thales hsm.


1234FW001UCED6B6E7EA25BEC6835C2FE599B5148FU3AA8CDBC69C788350AF30A20CB30590 77CF8F4FF124B3048013291118225070
1234FW001UCED6B6E7EA25BEC6835C2FE599B5148FU3AA8CDBC69C788350AF30A20CB30590 7E8F61CB2CCF203DD013291120645690
1234FW001UCED6B6E7EA25BEC6835C2FE599B5148FU3AA8CDBC69C788350AF30A20CB30590 74051C102874CE942013291120645900
1234FW001UCED6B6E7EA25BEC6835C2FE599B5148FU3AA8CDBC69C788350AF30A20CB30590 76E5E5A642BD64AE0013291085146900
 
Top