2012-07-31 17 views
11

जैसा कि शीर्षक कहता है, मैं डीयूकेपीटी सक्षम स्कैनर से आने वाले डीयूकेपीटी एन्क्रिप्टेड ट्रैक डेटा को डिक्रिप्ट करने का प्रयास कर रहा हूं।डिक्रिप्टिंग डीयूकेपीटी एन्क्रिप्टेड ट्रैक डेटा

मेरे पास डीयूकेपीटी के लिए एएनएसआई मानक (एक्स 9.24) है और केएसएन और बीडीके से आईपीईके उत्पन्न करने की क्षमता को सफलतापूर्वक कार्यान्वित किया है। इसके अलावा, मैंने पिन एन्क्रिप्शन कुंजी को एक्सोरिंग करके बाएं और दाएं मैक अनुरोध और प्रतिक्रिया कुंजी उत्पन्न करने की क्षमता को सफलतापूर्वक कार्यान्वित किया है। अंत में, मैं ईपीबी उत्पन्न करने में सक्षम हूं।

यहां से, मुझे समझ में नहीं आता कि मैं उत्पन्न एल/आर कुंजी से मैक अनुरोध और प्रतिक्रिया कैसे उत्पन्न करूं।

आखिरकार, एक बार जब मैं उस चरण में जाता हूं, तो अगला क्या आता है? मेरे पास वास्तव में कुंजी है जो DUKPT सक्षम डिवाइस द्वारा भेजे गए ट्रैक डेटा को डिक्रिप्ट करता है?

मुझे थाल्स सिम्युलेटर और जेपीओएस के बारे में पता है। मेरा कोड वर्तमान में थाल्स सिम्युलेटर को इसके सभी काम करने के लिए संदर्भित कर रहा है। लेकिन, फ़ाइल डिक्रिप्शन प्रक्रिया सिर्फ अपेक्षित डेटा वापस नहीं कर रही है।

यदि कोई ट्रैक डेटा डिक्रिप्ट करने में कुछ अंतर्दृष्टि प्रदान कर सकता है, तो इसकी सराहना की जाएगी।

http://thalessim.codeplex.com/

http://jpos.org/

उत्तर

34

मैं बहुत अधिक समय बिताया भयानक X9.24 कल्पना का अध्ययन और अंत में दोनों एन्क्रिप्शन और डिक्रिप्शन मेरे विक्रेता के उदाहरण और विपणन के साथ काम मिल गया तुरंत विक्रेताओं स्विच करने के लिए फैसला किया। चूंकि यह एक मानक है, आप सोचेंगे कि किसी का कार्यान्वयन वही होगा। मैं चाहता हूँ। वैसे भी, चीजें कैसे लागू की जाती हैं इस पर भिन्नताएं हैं। आपको यह सुनिश्चित करने के लिए ठीक प्रिंट का अध्ययन करना होगा कि आप चीजें काम कर रहे हैं जैसे आपकी दूसरी तरफ।

लेकिन यह आपका प्रश्न नहीं है।

सबसे पहले यदि आपको क्रेडिट कार्ड से डेटा ट्रैक डिक्रिप्ट करने की आवश्यकता है, तो संभवतः आप एक कुंजी बनाने में रुचि रखते हैं जो मूल सुपर गुप्त बेस व्युत्पन्न कुंजी के आधार पर डेटा को डिक्रिप्ट करेगा। इसका मैक पीढ़ी के साथ कुछ लेना देना नहीं है और केवल उस भयानक कल्पना में गुजरने में उल्लेख किया गया है। आपको उस कुंजी सीरियल नंबर और डिवाइस आईडी के लिए आईपीईके जेनरेट करने की आवश्यकता है और एचएसएम से पूर्ण कुंजी सीरियल नंबर के काउंटर हिस्से में बिट्स सेट होने पर बार-बार "गैर-परिवर्तनीय कुंजी जनरेशन प्रक्रिया" को लागू करें। (एक पोस्टिंग में लंबे लिस्टिंग के लिए क्षमा करें।)

/* 
* Bit "zero" set (this is a 21 bit register)(ANSI counts from the left) 
* This will be used to test each bit of the encryption counter 
* to decide when to find another key. 
*/ 
testBit=0x00100000; 
/* 
* We have to "encrypt" the IPEK repeatedly to find the current key 
* (See Section A.3). Each time we encrypt (generate a new key), 
* we need to use the all prior bits to the left of the current bit. 
* The Spec says we will have a maximum of ten bits set at any time 
* so we should not have to generate more than ten keys to find the 
* current encryption key. 
*/ 
cumBits=0; 
/* 
* For each of the 21 possible key bits, 
* if it is set, we need to OR that bit into the cumulative bit 
* variable and set that as the KSN count and "encrypt" again. 
* The encryption we are using the goofy ANSI Key Generation 
* subroutine from page 50. 
*/ 
for(int ii=0; ii<21; ii++) 
{ 
    if((keyNumber&testBit) != 0) 
    { 
     char ksr[10]; 
     char eightByte[8]={0}; 

     cumBits |= testBit; 
     ksn.count=cumBits; /* all bits processed to date */ 

     memcpy(ksr, &ksn,10);  /* copy bit structure to char array*/ 
     memcpy(crypt,&ksr[2],8); /* copy bytes 2 through 9 */ 

     /* 
     * Generate the new Key overwriting the old. 
     * This will apply the "Non-reversible Key Generation Process" 
     * to the lower 64 bits of the KSN. 
     */ 
     keyGen(&key, &crypt, &key); 
    } 
    testBit>>=1; 
} 

कहाँ keyNumber KSN KSN से वर्तमान काउंटर है एक 80 बिट संरचना शामिल है जो:

मेरे कोड का हिस्सा इस तरह दिखता है कि एचएसएम क्रिप्ट से 80 बिट कुंजी सीरियल नंबर डेटा का एक 64 बिट ब्लॉक है, जिसमें मेरे पास DES_cblock टाइप है क्योंकि मैं openSSL का उपयोग कर रहा हूं। कुंजी एक 128 बिट डबल DES_cblock संरचना है। कुंजीजेन दिनचर्या स्पेस के पृष्ठ 50 पर "गैर-परिवर्तनीय कुंजी जनरेशन प्रक्रिया" स्थानीय सबराउटिन से लगभग क्रियात्मक है।

इसके अंत में, कुंजी चर में कुंजी शामिल होगी जिसका उपयोग डिक्रिप्शन के लिए किया जा सकता है। भाषणों को लिखने वाले दोस्तों ने हमें अपने पैर की उंगलियों पर रखने के लिए कुछ "संस्करण" व्यवहार जोड़ा। यदि क्रेडिट कार्ड ट्रैक जैसे डेटा स्ट्रीम को डिक्रिप्ट करने के लिए कुंजी का उपयोग किया जाना है, तो आपको 0xFF के साथ एक्सओआर बाइट्स 5 और 13 की आवश्यकता होगी और ट्रिपल डीईएस स्वयं को कुंजी (ईसीबी मोड) एन्क्रिप्ट करेगा।

DOUBLE_KEY keyCopy; 
char *p; 
p=(char*)&key; 
p[ 5]^=0xff; 
p[13]^=0xff; 
keyCopy=key; 
des3(&keyCopy, (DES_cblock *)&key.left, &key.left); 
des3(&keyCopy, (DES_cblock *)&key.right, &key.right); 

आप इस का उपयोग कर रहे हैं, तो एक पिन ब्लॉक डिक्रिप्ट करने के लिए, आप XOR बाइट्स 7 और 15 0xFF के साथ करने की आवश्यकता होगी: मेरा कोड की तरह दिखता है। (मुझे 100% यकीन नहीं है कि इसे स्ट्रीम मोड के लिए भी लागू नहीं किया जाना चाहिए, लेकिन मेरा विक्रेता इसे छोड़ रहा है।)

यदि यह पिन ब्लॉक है, तो इसे ईसीबी मोड में 3-डीईएस के साथ एन्क्रिप्ट किया जाएगा। यदि यह डेटा स्ट्रीम है, तो इसे शून्य प्रारंभिक वेक्टर के साथ सीबीसी मोड में एन्क्रिप्ट किया जाएगा।

(क्या मैंने उल्लेख किया है कि मुझे spec की बहुत परवाह नहीं है?) यह ध्यान रखना दिलचस्प है कि एन्क्रिप्शन पक्ष गैर-हार्डवेयर, टैपर प्रतिरोधी सुरक्षा मॉड्यूल में उपयोग किया जा सकता है यदि सर्वर पक्ष (ऊपर) याद करता है और उन चाबियों को अस्वीकार करता है जिनका पहले उपयोग किया गया था। तकनीक बहुत साफ है। एएनएसआई स्पेस कुछ वांछित होने के लिए छोड़ देता है लेकिन तकनीक ठीक है।

शुभकामनाएं। /बॉब ब्रायन

+1

कुछ शानदार जानकारी है कि में प्रासंगिक कोड है। इस तरह के महान विवरण में जवाब देने के लिए समय निकालने के लिए धन्यवाद। मैं निश्चित रूप से आपके प्रदान किए गए काम के साथ आगे बढ़ जाऊंगा। – bdeetz

+1

मेरी इच्छा है कि मैं आपको हजारों वोट दूंगा। इंटरनेट पर सर्वश्रेष्ठ संसाधन। – Jonathan

3

डेटा एन्क्रिप्शन के लिए, संस्करण 0000000000FF0000.0000000000FF0000 ताकि आप XOR बाइट्स 5 की जरूरत है और 13 7 और 15. इसके अलावा के बजाय, आप प्रत्येक प्रमुख भागों का एक अतिरिक्त 3DES आत्म एन्क्रिप्शन कदम (छोड़ दिया और जरूरत है सही)।

यहाँ jPOS https://github.com/jpos/jPOS/blob/master/jpos/src/main/java/org/jpos/security/jceadapter/JCESecurityModule.java#L1843-1856

संबंधित मुद्दे