Jak szyfr został wygenerowany w czytniku kart przy użyciu szyfrowania DUKPT?

Dla

`BDK = "0123456789ABCDEFFEDCBA9876543210"` `KSN = "FFFF9876543210E00008"` 

Wygenerowany tekst szyfrowy znajdował się poniżej

"C25C1D1197D31CAA87285D59A892047426D9182EC11353C051ADD6D0F072A6CB3436560B3071FC1FD11D9F7E74886742D9BEE0CFD1EA1064C213BB55278B2F12"`

Które znalazłem tutaj. Wiem, że ten szyfr-tekst jest oparty na BDK i KSN, ale jak ten tekst szyfrowy o długości 128 został wygenerowany? Jakie kroki są w nim zaangażowane lub algorytm używany do tego celu? Czy ktoś mógłby wyjaśnić w prostych krokach. Trudno mi było zrozumieć dokumenty, które dostałem podczas googlowania.

Author: Dolo, 2013-06-28

4 answers

Odnośnie DUKPT , są pewne wyjaśnienia podane na Wiki. Jeśli to Ci nie wystarczy, oto krótkie wyjaśnienie.

Cytowanie http://www.maravis.com/library/derived-unique-key-per-transaction-dukpt/

Co to jest DUKPT?

Derived Unique Key Per Transaction (DUKPT) to schemat zarządzania kluczami. Używa jednorazowych kluczy szyfrowania, które pochodzą z tajnego klucza głównego, który jest współdzielony przez jednostkę (lub urządzenie), które szyfruje i podmiot (lub urządzenie), które odszyfrowuje dane. Dlaczego DUKPT? Każdy algorytm szyfrowania jest tak bezpieczny jak jego klucze. Najsilniejszy algorytm jest bezużyteczny, jeśli klucze używane do szyfrowania danych za pomocą algorytmu nie są bezpieczne. To jak zamknięcie drzwi największym i najsilniejszym zamkiem, ale jeśli schowałeś klucz pod wycieraczką, sam zamek jest bezużyteczny. Kiedy mówimy o szyfrowaniu, musimy również pamiętać, że dane muszą być odszyfrowane w drugi koniec. Zazwyczaj najsłabszym ogniwem w każdym schemacie szyfrowania jest dzielenie kluczy między stronami szyfrującymi i odszyfrowującymi. DUKPT jest próbą zapewnienia, że obie strony mogą szyfrować i odszyfrowywać dane bez konieczności przekazywania kluczy szyfrujących/deszyfrujących. W opublikowanym przez VISA dokumencie dotyczącym najlepszych praktyk kryptograficznych zaleca się również stosowanie DUKPT w celu zapewnienia zgodności z PCI DSS.

Jak działa DUKPT

DUKPT używa kluczy jednorazowych, które są generowane dla każdej transakcji, a następnie odrzucane. Zaletą jest to, że jeśli jeden z tych kluczy zostanie naruszony, tylko jedna transakcja zostanie naruszona. W przypadku DUKPT strony inicjujące (powiedzmy, urządzenie do wprowadzania Pin lub PED) i odbierające (procesor, Brama itp.) mają wspólny klucz. Ten klucz nie jest w rzeczywistości używany do szyfrowania. Zamiast tego do szyfrowania i deszyfrowania danych używany jest inny klucz jednorazowy, który pochodzi z tego klucza głównego. Ważne jest, aby pamiętać, że klucz główny nie powinien być odzyskiwalny z wyprowadzonego klucza jednorazowego. Aby odszyfrować dane, odbiorca musi wiedzieć, który klucz główny został użyty do wygenerowania klucza jednorazowego. Oznacza to, że odbiorca musi przechowywać i śledzić klucz główny dla każdego urządzenia. To może być dużo pracy dla kogoś, kto obsługuje wiele urządzeń. Potrzebny jest lepszy sposób, aby sobie z tym poradzić. Tak to działa w rzeczywistości: odbiornik ma klucz główny zwany kluczem bazowym (BDK). BDK ma być tajne i nigdy nie będą udostępniane nikomu. Ten klucz jest używany do generowania kluczy zwanych początkowym kluczem szyfrowania Pin (IPEK). Z tego generowany jest zestaw kluczy zwanych przyszłymi kluczami i Ipek jest odrzucany. Każdy z kluczy przyszłości jest osadzany w PED przez producenta urządzenia, z którym są one udostępniane. Ten dodatkowy krok wyprowadzenia oznacza, że odbiorca nie musi śledzić każdego klucza, który trafia do PED. W razie potrzeby można je ponownie wygenerować.

Tutaj wpisz opis obrazka

Odbiornik dzieli się przyszłymi kluczami z producentem PED, który osadza jeden klucz w każdym PED. Jeśli jeden z tych kluczy jest zagrożony, PED może zostać ponownie uruchomiony z nowym kluczem przyszłości, który pochodzi z BDK, ponieważ BDK jest nadal bezpieczny.

Szyfrowanie i deszyfrowanie

Gdy dane muszą być wysłane z PED do odbiornika, przyszły klucz w tym urządzeniu jest używany do generowania klucza jednorazowego, a następnie ten klucz jest używany z algorytmem szyfrowania do Zaszyfruj dane. Dane te są następnie wysyłane do odbiornika wraz z numerem seryjnym klucza (KSN), który składa się z identyfikatora urządzenia i licznika transakcji urządzenia. Tutaj wpisz opis obrazka

Na podstawie KSN odbiornik generuje następnie IPEK i z tego generuje przyszły klucz, który był używany przez urządzenie, a następnie rzeczywisty klucz, który został użyty do szyfrowania danych. Za pomocą tego klucza odbiornik będzie mógł odszyfrować dane.

Source

 14
Author: Shankar Damodaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-22 02:22:59

Po pierwsze, pozwolę sobie zacytować kompletny kod źródłowy, który połączyłeś i który podałeś tylko 3 linijki...

require 'bundler/setup'
require 'test/unit'
require 'dukpt'

class DUKPT::DecrypterTest < Test::Unit::TestCase

      def test_decrypt_track_data
        bdk = "0123456789ABCDEFFEDCBA9876543210"
        ksn = "FFFF9876543210E00008"
        ciphertext = "C25C1D1197D31CAA87285D59A892047426D9182EC11353C051ADD6D0F072A6CB3436560B3071FC1FD11D9F7E74886742D9BEE0CFD1EA1064C213BB55278B2F12"
        plaintext = "%B5452300551227189^HOGAN/PAUL ^08043210000000725000000?\x00\x00\x00\x00"

        decrypter = DUKPT::Decrypter.new(bdk, "cbc")
        assert_equal plaintext, decrypter.decrypt(ciphertext, ksn)
      end
end
Pytasz, Jak powstał "szyfertext"...

Cóż, pierwszą rzeczą, jaką wiemy, jest to, że jest on oparty na "zwykłym tekście", który jest używany w kodzie do sprawdzenia, czy deszyfrowanie działa.

Tekst jawny jest wypełniony 0-co pasuje do szyfrowania, które jest testowane przez weryfikację deszyfrowania za pomocą tej skrzynki testowej DecrypterTest.

Spójrzmy na kodowanie więc...

Znalazłem powiązany kod szyfrujący na https://github.com/Shopify/dukpt/blob/master/lib/dukpt/encryption.rb .

Jak DecrypterTEst używa "cbc", staje się oczywiste, że szyfrowanie używa:

 @cipher_type_des = "des-cbc"
 @cipher_type_tdes = "des-ede-cbc"

Nieco bardziej w dół tego kodu szyfrującego, następujące rozwiązanie rozwiązuje nasze poszukiwanie odpowiedzi:

ciphertext = des_encrypt(...

Co pokazuje, że rzeczywiście patrzymy na wynik szyfrowania DES.

Teraz, DES ma rozmiar bloku 64 bitów. Czyli (64/8=) 8 bajtów binarny, lub-jako "ciphertext" jest kodowaną szesnastkowo tekstową reprezentacją bajtów-16 znaków szesnastkowych.

"ciphertext" ma długość 128 znaków szesnastkowych, co oznacza, że zawiera (128 znaków szesnastkowych/16 znaków szesnastkowych=) 8 bloków DES z każdym 64 bitami zaszyfrowanej informacji.

Podsumowując to wszystko w prostej odpowiedzi:

Patrząc na "ciphertext" , patrzysz na (8 bloków) zaszyfrowanych danych DES, które są reprezentowane za pomocą zapis szesnastkowy czytelny dla człowieka (2 znaki szesnastkowe = 1 bajt) zamiast oryginalnych bajtów binarnych, które generuje szyfrowanie DES.

Jeśli chodzi o kroki związane z "odtworzeniem" szyfrogramu, zazwyczaj mówię ci, abyś po prostu użył odpowiednich częściruby projektu, na którym oparłeś swoje pytanie. Wystarczy spojrzeć na kod źródłowy. Plik w "https://github.com/Shopify/dukpt/blob/master/lib/dukpt/encryption.rb" prawie wyjaśnia to wszystko i jestem prawie pewien, że wszystkie potrzebne funkcje można znaleźć w repozytorium GitHub projektu. Alternatywnie, możesz spróbować odtworzyć go samodzielnie-używając preferowanego języka programowania. Musisz tylko obsługiwać 2 rzeczy: szyfrowanie DES / deszyfrowanie i tłumaczenie bin-to-hex / hex-TO-bin.

 5
Author: e-sushi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-04 11:44:33

Ponieważ jest to jeden z pierwszych tematów, które pojawiają się na ten temat, pomyślałem, że podzielę się tym, jak udało mi się zakodować tekst szyfrowy. Po raz pierwszy pracowałem z Rubim i było to specjalnie do pracy z DUKPT

Najpierw musiałem uzyskać metodę ipek i pek (taką samą jak w decrypt). Następnie rozpakuj ciąg tekstowy. Przekonwertuj rozpakowany łańcuch na 72-bajtową tablicę(jeszcze raz, wybacz, jeśli moja terminologia jest niepoprawna).

Zauważyłem w przykładzie autora klejnotów dukpt, że użył następujący ciąg tekstowy

"%B5452300551227189^0804321000000725000000?\x00\x00\x00\x00 "

Uważam, że ten ciąg jest nieprawidłowy, ponieważ nie powinno być spacji po nazwie (AFAIK).. więc powinno być

"%B5452300551227189^0804321000000725000000?\x00\x00\x00\x00 "

Podsumowując, jest to rozwiązanie, na którym skończyłem, które może zaszyfrować ciąg znaków, a następnie odszyfrować go za pomocą DUKPT

class Encrypt
include DUKPT::Encryption
attr_reader :bdk

def initialize(bdk, mode=nil)
  @bdk = bdk
  self.cipher_mode = mode.nil? ? 'cbc' : mode
end

def encrypt(plaintext, ksn)
  ipek = derive_IPEK(bdk, ksn)
  pek = derive_PEK(ipek, ksn)
  message =  plaintext.unpack("H*").first
  message = hex_string_from_unpacked(message, 72)
  encrypted_cryptogram = triple_des_encrypt(pek,message).upcase
  encrypted_cryptogram
end
def hex_string_from_unpacked val, bytes
  val.ljust(bytes * 2, "0")
end

End

Boomedukpt FFFF9876543210E00008 " %B5452300551227189^0804321000000725000000?"

(Mój rubinowy klejnot, KSN i zwykły ciąg tekstowy)

2542353435323330303535313232373138395e484f47414e2f5041554c5e30383034333231303030303030303732353030303030303f000000000000000000000000000000000000

(Mój ruby gem robi puts na rozpakowany łańcuch po wywołaniu hex_string_from_unpacked)

C25C1D1197D31CAA87285D59A892047426D9182EC11353C0B82D407291CED53DA14FB107DC0AAB9974DB6E5943735BFFE7D72062708FB389E65A38C444432A6421B7F7EDD559AF11

(Mój rubinowy klejnot robiący zaszyfrowany ciąg)

%B5452300551227189^HOGAN / PAUL^0804321000000725000000?

(Mój klejnot rubinowy robi puts po wywołaniu deszyfrowania na klejnocie dukpt)

 2
Author: ainesophaur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-19 09:30:30

Zobacz też: https://github.com/sgbj/Dukpt.NET , byłem w podobnej sytuacji, kiedy zastanawiałem się, jak zaimplementować dukpt na terminalu, gdy terminal ma własne wywołania funkcji, które biorą INIT i KSN, aby utworzyć pierwszy klucz, więc moim jedynym problemem było upewnienie się, że klucz INIT został wygenerowany w ten sam sposób na terminalu, jak to jest w powyższym kodzie repo, co było wystarczająco proste przy użyciu biblioteki szyfrowania ossl dla 3DES z ebc i zastosowaniu odpowiedniego klucza. maski.

 0
Author: user5710183,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-23 07:46:15