Как да декриптирате данни от магнитна следа с помощта на DUKPT

Предлагам на читателите на "Хабракхабр" превод на статията "Как да дешифрираме данни от магнитна карта с DUKPT".

Наскоро трябваше да декриптирам данни от карта от четец на магнитни записи. Изглежда, че е просто. Вземам ключа и изпълнявам определен алгоритъм за дешифриране. Но го нямаше.

Оказа се, че моите читатели използват схема, известна като DUKPT (Изведен уникален ключ за транзакция - дефиниране на уникален ключ за транзакция). Идеята на тази схема е, че за всяка транзакция (или в нашия случай за всеки наем на карта) данните се криптират с помощта на ключа, изчислен за индивидуалния наем на карта.

По този начин, за да дешифрирате данни, които са криптирани с помощта на тази схема, трябва да можете да изчислите ключа за индивидуална карта под наем. Процесът на изчисляване на такъв ключ (сесиен ключ) далеч не е прост. Процесът е описан в ANSI X9.24 част 1. Документът обаче струва приблизително $140. Безплатна, лесно достъпна документация, описваща този процес, е трудна за намиране. Най-добрият ресурс, който можах да намеря, е тук; има доста добро обяснение как се изчислява IPEK (първоначален ключ за шифроване на ПИН). За съжаление това е само част от пълната схема. В тази публикация ще се опитам да обясня схемата DUKPT по изчерпателен начин.

Дефиниции

BDK: Това е съкращение от Base Derivation Key. Този ключ е известен само на производителя и разработчика на софтуер, който взаимодейства със скенера за магнитни следи.

IPEK: Това е съкращение от Initial Pin Encryption Key. Този ключ се определя от BDK. Този ключ се зарежда в устройството от производителя и се използва за генериране на бъдещи ключове. Компромисът на IPEK не е такъвкомпрометира BDK.

KSN: Това е съкращение от сериен номер на ключ. KSN е комбинация от серийния номер на скенера с магнитна лента и брояча на броя наети карти, извършени на устройството.

Как работи

BDK се използва от производителя за генериране на IPEK, който се зарежда в устройството по време на разработката. Устройството използва IPEK и KSN за изчисляване на сесийния ключ, който криптира данните, прочетени от картата.

BDK се изисква от разработчиците на софтуер за изчисляване на IPEK. След като получат IPEK, те могат да поискат KSN от устройството. IPEK и KSN се използват за получаване на ключ за една транзакция/карта под наем. С тези ключове разработчиците могат да дешифрират данните на картата.

IPEK Изчисление

За да получим първоначалния ключ за изчисляване на ключове (IPEK), имаме нужда от ключ за основен алгоритъм (BDK) и сериен номер на ключа (KSN). IPEK се определя с помощта на алгоритъма TripleDES. TripleDES е прост DES алгоритъм, изпълняван в три преминавания.

Алгоритъмът използва 24-байтов ключ. Алгоритъмът DES се използва три пъти, първо с ключ от 1-8 байта, след това 9-16 байта и накрая 17-24 байта отделно за всяко преминаване.

TripleDES може да използва 16-байтов ключ, този метод се нарича EDE3. Първо ще бъдат използвани байтове 1-8, след това 9-16 и отново 1-8, излъчвайки 24-байтов ключ.

Някои реализации на TripleDES може да не използват автоматично краткия ключ. Преди да разбера това, прекарах много време в опити да разбера какъв е проблемът. Ако приемем, че това е персонализирана реализация на TripleDES, използвах излъчен 24-байтов ключ от 16 байта.

След много мъки ми хрумна да опитам да взема първите 8 байта и да ги добавя в края на ключа преди да го предамв алгоритъма TripleDES. Това реши проблема.

Подробности

IPEK се състои от две 8-байтови части, които са резултат от две отделни преминавания на алгоритъма TripleDES. И двете се получават чрез шифроване на горните 8 байта на KSN с нулиран брояч. Разликата между лявата и дясната част е, че дясната част се получава чрез KSN криптиране с помощта на леко модифицирана версия на BDK. Ще опиша този процес по-долу.

Да предположим, че имаме 16-байтов BDK, представен от шестнадесетичен низ "0123456789ABCDEFFEDCBA9876543210". Имаме и 10-байтов KSN с брояч 8, представен от шестнадесетичния низ "FFFF9876543210E00008".

Накарайте BDK да шифрова лявата страна на IPEK, като добавите първите 8 байта към края на BDK, това ще бъде следващият 24-байтов ключ.

Ако дължината на KSN не е равна на 10 байта, тогава я подпълнете до 10 байта с шестнадесетично "F" (1111). Важно е да се отбележи, че IPEK е първият ключ на устройството. Това означава, че го изчисляваме с KSN брояч, равен на 0. За да получим KSN с брояч 0, ние го маскираме с шестнадесетично представяне, което е низът "FFFFFFFFFFFFFFFFE00000".

Прекрасно. Сега имаме нулев KSN. Нуждаем се обаче от горните 8 байта на KSN. Получаваме ги чрез изместване на KSN надясно с 16 бита.

Отлично. Следващата стъпка е TripleDES криптиране на низа "FFFF9876543210E0" с помощта на 24-байтов BDK ключ "0123456789ABCDEFFEDCBA98765432100123456789ABCDEF". Резултатът от това криптиране ще бъде лявата страна на IPEK.

Ако си спомняте, споменах, че ще се използва леко модифицирана версия на BDK, за да се получи дясната страна. За да направим това, трябва да вземем оригиналния 16-байтов BDK "0123456789ABCDEFFEDCBA9876543210" и XOR следната маска„C0C0C0C000000000C0C0C0C000000000“. Изглежда, че това е напълно произволна маска, но уви, тя е необходима, за да получите правилния IPEK.

Ще направим същото, както направихме с ключа за лявата страна, вземем горните 8 байта и ги добавим към края, получаваме следващия 24-байтов ключ.

След това вземете горните 8 байта на KSN с нулев брояч (който изчислихме по-рано) и го шифровайте с помощта на TripleDES с ключа, който току-що изчислихме. Това ще ни даде правилния IPEK регистър, което ще доведе до следните 16 байта IPEK (разделих лявата и дясната част за яснота).

Изчисляване на ключ на сесия

Имаме IPEK. След това трябва да получим от IPEK уникален ключ за конкретна карта под наем (сесиен ключ). За да го получите, се използва някаква подпрограма, да я наречем черна кутия, чиято цел е да върне отделен сесиен ключ. Какво се случва в черната кутия все още не е наша грижа. Точно сега ще разгледаме входа на тази подпрограма.

Нашата черна кутия има два входа. Единият е ключът, а вторият е низът за шифроване. Низът представлява модифицирания KSN.

Ако си спомняте, долните 21 бита на KSN съдържат брояча на броя наети карти на устройството. Ще предадем модифицирания KSN на подпрограмата толкова пъти, колкото има единици в двоичното представяне на брояча. Ключът, който се предава с променения KSN, е IPEK на първата итерация, а на следващите итерации ще бъде ключът, получен от черната кутия на предишната итерация.

Нека започнем с промяна на KSN. Като начало ще вземем долните 8 байта на KSN и ще нулираме стойността на брояча в KSN. Това може да стане чрез маскиране на KSN с помощта на следната маска.

Ще използваме получената стойност, за да изчислим всяко съобщение, изпратено до черната кутия. В нашия контра примерравно на 8, трябва да предадем двоичното представяне на числото 8 (1000) към черната кутия. За целите на демонстрацията, нека приемем, че броячът има по-сложната стойност 10 (1010).

Ще извличаме набор от двоични числа от брояч. В нашия случай за числото 10 (1010) ще има две двоични числа: 1000 и 0010. Хванахте ли схемата? Получаваме набор от числа, представляващи всяка двоична единица на числото 10.

След това вземете първото число и ИЛИ KSN с неговия брояч, зададен на нула, както е показано по-рано (обърнете внимание, че шестнадесетичното представяне на първото число ще бъде 0008).

Сега предайте IPEK като ключ и новомодифицирания KSN към черната кутия. Черната кутия ще върне нов ключ. Това е първият сесиен ключ (представен в шестнадесетичен): "27f66d5244ff62e1aa6f6120edeb4280".

След това повторете процеса със следващото двоично число, изчислено по-рано, 2 (0010). Този път ще използваме първия сесиен ключ, който току-що получихме, и ще изчислим новата KSN модификация.

За да изчислим новата модификация на KSN, ще изпълним операцията ИЛИ с последната получена модификация: 9876543210E00008.

Сега предайте нашия нов ключ "27f66d5244ff62e1aa6f6120edeb4280" и новата модификация на KSN "9876543210E0000A" в черната кутия и вземете друг бъдещ ключ, "6cf2500a22507c7cc776ceadc1e33014". Това е ключът на сесията за нашето устройство с брояч 10.

Въпреки това, нашият реален брояч беше равен на 8 и ние изчислихме реалния сесиен ключ "27F66D5244FF62E1AA6F6120EDEB4280" на първия етап.

Последната операция, която трябва да направим с получената стойност, е окончателната трансформация на ключа, с който ще дешифрираме данните. Трябва да XOR ключа с маската "00000000000000FF00000000000000FF".

Товаключа, необходим за дешифриране на данните.

Черна кутия

Нарекох черната кутия алгоритъм, който изчислява сесийните ключове. Черната кутия приема текущия сесиен ключ, който ще нарекаcurrent_sk, и KSN модификацията, която ще нарекаksn_mod.

Ако в началото предположението, че IPEK, получено по-горе, беше предадено катоcurrent_skиksn_modбеше равно на стойността "9876543210E00008", която изчислихме по-горе.

Първо трябва да вземемcurrent_sk, да вземем горните 8 байта и да ги изместим 64 бита надясно, получаваме "6AC292FAA1315B4D". Това може да се получи с помощта на битова маска.

Тук трябва да изместим тази стойност 64 бита надясно, за да получим "6AC292FAA1315B4D". Нека го наречемleft_key(изглежда като лявата страна наcurrent_sk).

След това получаваме 8 по-ниски байтаcurrent_sk, използвайки маска.

Нека наречем тази стойност (познахте)right_key. След това вземетеright_keyи XOR сksn_mod"9876543210E00008".

Нека наречем тази стойност съобщение. След това вземаме съобщението и го шифроваме с DES (обикновен DES). Ще предадем алгоритъма на съобщението на DES като данните за криптиране иleft_keyкато ключ за криптиране. Стойността ще бъде "2FE5D2833A3ED1BA". Сега трябва да XOR тази стойност иright_key.

Тази стойност е долните 8 байта от нашия сесиен ключ! Сега трябва да повторим току-що описаните операции с други входове. Този път вземамеcurrent_skи го XOR с "C0C0C0C000000000C0C0C0C000000000". Тази стойност е произволна, доколкото мога да преценя, но е част от стандарта ANSI, така че просто ще трябва да повярвате на думата ми.

Ако вземем стойността"AA02523AA1315B4D454A7363D7D5933A" и го заместваме сcurrent_skв описаната по-горе операция, получаваме "27F66D5244FF62E1". Това са високите 8 байта на нашия сесиен ключ. Комбинирайки ги, получаваме "27F66D5244FF62E1AA6F6120EDEB4280".

Заключение

И тук можете да получите грант за тестов период на Yandex.Cloud. Необходимо е само да въведете "Habr" в полето "секретна парола".