java वीज़ा चेकआउट के साथ भुगतान डेटा को डिक्रिप्ट करना



encryption coldfusion (1)

नमूना कोड के बारे में समझने के लिए एक महत्वपूर्ण बात यह है कि यह बाइट्स को दर्शाती है। आपका सीएफ़ कोड वर्णों का उपयोग कर रहा है यह एक तुच्छ अंतर की तरह लग सकता है, लेकिन वे पूरी तरह से अलग चीजें हैं, जो बहुत, बहुत अलग परिणाम उत्पन्न करेंगे। सफलतापूर्वक डिक्रिप्ट करने के लिए, आपको दिए गए स्ट्रिंग्स के बाइट (या बाइनरी) के साथ काम करने की आवश्यकता है - पात्र नहीं

यद्यपि सर सीएसएफ फ़ंक्शंस जैसे द्विआधारी सरणियों का उपयोग करना संभव है, जैसे सरणी स्लाइस () , सिंटैक्स को समय पर थोड़ा भारी / क्लैन्की मिलता है इसका कारण यह है कि द्विआधारी सरणियां आपके मानक सीएफ़ अरैड की तुलना में एक अलग प्रकार के ऑब्जेक्ट हैं, यानी बाइट [] बनाम जावापाइल । सूची। इसलिए फ़ंक्शन का उपयोग करने के आधार पर, आपको अपेक्षित प्रकार में चर को जबरन करने के लिए जवाकास्ट की आवश्यकता हो सकती है। ये ध्यान रखते हुए ..

भाग I - एन्केकी को डिक्रिप्ट करें

  1. Base64- encKey को डीकोड करें
  2. डिकोड किए गए मान के पहले 32 बाइट्स निकालें। यह एचएमएसी (हैश मैसेज प्रमाणीकरण कोड) है अपने एपीआई साझा सीक्रेट का उपयोग करते हुए बाकी डीकोड किए गए डेटा के SHA-256 एचएमएसी की गणना करें और इसे पहले 32 बाइट्स से एचएमएसी से तुलना करें।

पहले बेस 64 स्ट्रिंग को द्विआधारी डीकोड का उपयोग करके बाइनरी में कनवर्ट करें। फिर लौटे सरणी से बाइट्स की उपयुक्त संख्या निकालें। यह अपेक्षित एचएमएसी मूल्य है:

hmacSize = 32;
binaryToDecrypt  = binaryDecode(encryptedKey, "base64");
expectedHMAC = binaryEncode( javacast("byte[]", arraySlice(binaryToDecrypt, 1, hmacSize))
                          , "hex" );

इसके बाद, शेष बाइट्स निकालें, और वास्तविक एचएमएसी की गणना करने के लिए उनका उपयोग करें। उम्मीद मूल्य के खिलाफ इसे सत्यापित करें यदि दोनों मेल नहीं खाते, तो कुछ गलत हो गया।

remainData = arraySlice(binaryToDecrypt, hmacSize + 1);
actualHMAC = hmac( javacast("byte[]", remainData ), sharedSecret, "HMACSHA256");

if (compare(actualHMAC, expectedHMAC) != 0) {
    throw("ERROR: Invalid HMAC ["& actualHMAC &"]. Expected ["& expectedHMAC &"]");
}
  1. अगले 16 बाइट्स को डिक्रिप्शन एल्गोरिथम के लिए हटाया जाना चाहिए और IV (प्रारंभिक वेक्टर) के रूप में उपयोग किया जाना चाहिए।

शेष बाइट्स में एक IV शामिल है, उसके बाद एन्क्रिप्टेड मान। इससे पहले कि आप उत्तरार्द्ध को डिक्रिप्ट कर सकें, आपको दो को निकालने और अलग करने की आवश्यकता है:

ivSize = 16;
ivValue = javacast("byte[]", arraySlice(remainData, 1, ivSize));
encryptedValue = javacast("byte[]", arraySlice(remainData, ivSize + 1));
  1. एईएस -256-सीबीसी, चरण 3 से चतुर्थ और अपने एपीआई साझा गुप्त के एसएचए -256 हैश का उपयोग करते हुए शेष डेटा को डिक्रिप्ट करें।

डिक्रिप्ट करने से पहले अंतिम चरण को साझा गुप्त बनाने के द्वारा डिक्रिप्शन कुंजी उत्पन्न करना है दुर्भाग्य से, सीएफ़ के हैश () फ़ंक्शन हमेशा एक हेक्स स्ट्रिंग देता है इसलिए यह बेस 64 प्रारूप में परिवर्तित किया जाना चाहिए ताकि डिक्रिप्शन फ़ंक्शन के साथ संगत हो।

keyHex = hash(sharedSecret, "SHA-256", "utf-8");
keyBase64 = binaryEncode(binaryDecode(keyHex, "hex"), "base64");

अंत में, डिक्रिप्ट के लिए सभी तीन मानों का उपयोग करें। लौटे बाइनरी में एन्क्रिप्शन कुंजी को भाग II में इस्तेमाल किया जाएगा।

decryptedKeyBinary = decryptBinary( encryptedValue
                           , keyBase64
                           , "AES/CBC/PKCS5Padding"
                           , ivValue);


भाग II - एन्कपएमेंटडेटा को डिक्रिप्ट करें

भाग I में सटीक समान प्रक्रिया का प्रयोग करें, बस चर को स्वैप करें:

  • encryptedKey बजाय encPaymentData उपयोग करें
  • sharedSecret बजाय decryptedKeyBinary उपयोग करें

अंतिम, डिक्रिप्टेड परिणाम बाइनरी होगा। इसे एक मानव पठनीय स्ट्रिंग में कनवर्ट करने के लिए वर्णसेट एन्कोड का उपयोग करें:

result = charsetEncode(decryptedResult, "utf-8");

एनबी: आपके द्वारा पोस्ट किए गए नमूना मूल्यों को तोड़ा जा रहा है, क्योंकि वे जावा उदाहरण के साथ भी काम नहीं करते हैं। वैध मूल्य (कुंजी, डेटा, वगैरह) का इस्तेमाल करते समय उपरोक्त कदम सही परिणाम उत्पन्न करते हैं।

मुझे एक एन्क्रिप्टेड प्रारूप में वीज़ा चेकआउट से जानकारी वापस मिल रही है I अपनी साइट पर मार्गदर्शिका इन निर्देशों को प्रदान करती है:

सबसे पहले, आपको गतिशील कुंजी (एन्ककी) को डिक्रिप्ट करना होगा, फिर भुगतान डेटा पेलोड (एंकपैमेंटडेटा) को डिक्रिप्ट करने के लिए डिक्रिप्टेड डायनामिक कुंजी का उपयोग करें।

एन्ककी को डिक्रूट करने के लिए इन चार चरणों का पालन करें:

  1. Base64- encKey को डीकोड करें
  2. डिकोड किए गए मान के पहले 32 बाइट्स निकालें। यह एचएमएसी (हैश मैसेज प्रमाणीकरण कोड) है एक SHA-256 एचएमएसी की गणना करें
    अपने एपीआई साझा गुप्त का उपयोग कर बाकी डीकोड डेटा और इसकी तुलना करें
    पहले 32 बाइट्स से एचएमएसी तक।
  3. अगले 16 बाइट्स को डिक्रिप्शन एल्गोरिथम के लिए हटाया जाना चाहिए और IV (प्रारंभिक वेक्टर) के रूप में उपयोग किया जाना चाहिए।
  4. एईएस -256-सीबीसी, चरण 3 से चतुर्थ और अपने एपीआई साझा गुप्त के एसएचए -256 हैश का उपयोग करते हुए शेष डेटा को डिक्रिप्ट करें।

डिक्रिप्टेड एन्केकी का उपयोग करके एन्कपएमेंटडेटा को डिक्रिप्ट करने के लिए इन चार चरणों का पालन करें:

  1. Base64-encPaymentData को डीकोड करें
  2. डिकोड किए गए मान के पहले 32 बाइट्स निकालें। यह एचएमएसी है डिक्रिप्टेड एन्केकी का उपयोग करते हुए बाकी डीकोड किए गए डेटा के SHA-256 एचएमएसी की गणना करें और इसे पहले 32 बाइट्स से एचएमएसी के साथ तुलना करें।
  3. अगले 16 बाइट्स को डिक्रिप्शन एल्गोरिथम के लिए निकाला जाना चाहिए और IV के रूप में उपयोग किया जाना चाहिए।
  4. एईएस -256-सीबीसी, चरण 3 से चतुर्थ और डिक्रिप्टेड एन्कई के एसएएच 256-हैश का उपयोग करके बाकी एन्कपएमेंटडेटा पेलोड को डिक्रिप्ट करें।

मैंने कोल्डफ्यूजन का उपयोग करने की कोशिश की लेकिन मुझे एन्क्रिप्शन के मुद्दों के साथ कुछ हद तक खो दिया गया और मैं कोड को ठीक करने में असमर्थ हूं। नीचे मैं क्या आवश्यक है मैं चरण 3 और 4 पर अटक गया हूं जहां वे इसे तुलना करते हैं और फिर इसे डिक्रिप्ट करते हैं। क्या कोई इसे ठीक करने के लिए क्या किया जा सकता है?

enckey:

2M2WWOD4wANsGwWTmPqQIQYdz9WPwgiR0ntJHGaxm23b5a1sWUtCBcUQUMMtc9hvcYavJ6yqPgETOGZgDOdd9qjDwIb2aV9DLZT1iIcB3zNN5Ddhxd9iiui6TAlJxU/O

encPaymentData:

X2TXp0ZmwHrtfzSP5TPjUOjdZb0rjsHeDSqr8TwIF/VR8sMQhWN5hP4IRhQxWT CZcQhxZoUHP 0g/E/ot sjREAJ8YQf7c7jSzKsXRH/wrew5rQit2wJBlVSSZ YoLeIHbLrTz CfIoFv09hixl7ff27u0YCyV0zjP5vNfCBEIwfqyriqwXK2J QEOxQiKzDUW4br3o1t31aymCQC9eBBpoVKjFfSKlNXM9QEdNZBcLMZ8Wlv8lF/ua bnwshbM9u7Uhudqvut94RZEW NzkRD8MfBo12e/XhnL35qxGpHeQNPClC4EQDK6U/HmegeOj BZLbIIYBs6t9E8Q3AKBwfiPOFgB gSVnhXKnd3nKvllaG BaGrQJtk 7QAtnHMHxQAO5rdiS9465HCdiHa8zlv7SkvWh8EwcKCiT4qiZSM6QuYAeRSzDpPS1gsZ54Q9LizUnueH7yyzSd47cLPd0VlOQxobKtNN2LrsRb3IwOfzuwGnSRf2cNp49hBmmGP1b0BC hhB6UpCqP2ixTPvui NwMYzqZUe336bF1mfnKzEbEZIvIrPyx3uMiLDAns2g7S80gMNnHb/09i49xbfY3V7oudeiHV99FCh67DuG3uHE3/HzIZbcnxJwVJoJj6/3DuzK/Kw1JqSorE0M1qxUqoNkJC4aNCBrqfTlR7/eErrvB554TUZwcyQXqKCwrKv4NJEw6S0n3W1VASkfA0atbJQX2aLgx9kqnhYdDbaU8UcFIoeA45 yEuQ9vXzo2ILQhvamsAAFQd3i4mEOZ KNtMu25dDFlORn5C/oTZ1t1dzJoYMvq44gejp6L3IK e7JCugGchr963a2kd8NFa3wctRDHF8ChHxawVlU0aY7nasrVireMFLiM 9XIb4abfDtct/j1Q8IGN0hRkgCHO6dlnOrAaaQDYYH3axaMDp5Onb04whULYqGbn/XSR8Sn8gnoFbYqVJbR5aCp5Pe9TpfwxlEvV3z8ZfsASqW2y So9gpwg2y16K/FX3Io6kqeqUlAxbTRDfN/ofDIJaO H PUu2teqjvwvCkjPciGOQdXT5JxqoCiHqRwD0zeZPcG3b9Nfrq3Caf6zjwhf /CMeGc3dNHhSkXox R50MP8BlLWk/bXZRScTE/HSrVxE n073utHAnbVOM3gVha0Hr8TmoV8z1vBg5fY253so6kQX61ZIfHneCAZo0qeKRgDgLUryVPmUNc5 yKP8DxtmHl/0YUztpgyEx5njsrn1L 3EHMMUhui8d LQdNZoEpZ9U1Xb7XVsV5gnwR/mOITNOKJQsine4zMMHBcomHclrM0CuI58YrKPqworCmK6CYfzSc8UmXxXUe5dzND/DS9XgqDttQic2/OqTSAK63ynnrNqzr3D56VpDBeDeQjk3mc/0zmuFAPEXoAQoQKfD6HEuajvWJebQ6QIPgA TshqsnPlktbpftr4lsuB1tHS/W8D7SYVFMC/Kxy9QuYWs0cmRTtzfWEKIRHeDElOTQCX5JB5PgzVhhi5kYTi488Ba8j4zvNUw55hEoMxONYO7eMjJosmNjULsT492LGw3EfAgmgx9h3yFLQRZgfylg0h4PfLlcPOAdsnVX9/yLElD xu7Atwc4S7pBWTHvwue7PpRvWpTeqkU5sqiX4KcV5x8rk mBtxm48a8fsmp GNf 4IjwXu9cQaU9WLipiEnkqFsYo7/aAsmmKWBETyQg9BFXYK 165vrzSX8WTsv6ZZDnVjcE1n4Ov8Jl2cnAigoQbB0ROPpIRzZ3zH2diUv1vzlSuh9gbEJf3uQRKlYRVUbpboC0RbQ/7jgznfJAWyLykyDQ0EB8fVEOtbP1l4JEz39QwAU18ph3btnWWuKEV4 ghYvNG4m1DYntSF57s2ajRS6rPtR oYvGjrJL9zbHBhKHlfkIPC0TKotOCi96mqpikbBEfIZSomHxYgDwYCSvt60zaDIjlBxZ1UBdK JL0554Wia9W3Wg91bmYS9Q4SXMT8r4xGYB7OutEV24n7p088rVm/w2SZSiqlLqai539k6WGkzEQf19ytPtIE81a N z7aijTjy 7FCuVPF90svI5/NoGpSINqv84HUcMU71BvXUIT53Ea6CCpiWvvOPpo/XZar44emlIG0UgeB kfP6C6sis=

गुप्त कोड:

zRf7WZ3nM7ON{U0E6J5S}[email protected]#1lG9go

सीएफ़ कोड:

<cfset str = "2M2WWOD4wANsGwWTmPqQIQYdz9WPwgiR0ntJHGaxm23b5a1sWUtCBcUQUMMtc9hvcYavJ6yqPgETOGZgDOdd9qjDwIb2aV9DLZT1iIcB3zNN5Ddhxd9iiui6TAlJxU/O">
<cfset tobas = tobase64(str)>
<cfset getFirst32bytes = Left(tobas,32)>
<cfset tobas2 = RemoveChars(tobas,1,32)>
<cfdump var="#tobas2#">
<cfset key = "zRf7WZ3nM7ON{U0E6J5S}[email protected]##1lG9go">
<cfset x = hmac("#tobas2#","#key#","HMACSHA256")>
<cfset y = hmac("#getFirst32bytes#","#key#","HMACSHA256")>
<cfset decalgo = Left(x,16)>
<cfset decremainingData = RemoveChars(x,1,16)>
<cfset getDec = Decrypt(decalgo,"#key#","AES")>
<cfdump var="#x#"><br>
<cfdump var="#y#"><br>
<cfdump var="#decalgo#">
<cfdump var="#decremainingData#">
<cfdump var="#getDec#">

यह उनकी साइट पर जावा उदाहरण है:

private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
private static final String HASH_ALGORITHM = "SHA-256";
private static final String HMAC_ALGORITHM = "HmacSHA256";
private static final int IV_LENGTH = 16, HMAC_LENGTH = 32;
private static final Charset utf8 = Charset.forName("UTF-8");
private static final Provider bcProvider;
static {
   bcProvider = new BouncyCastleProvider();
   if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
    Security.addProvider(bcProvider);
   }
}

private static byte[] decrypt(byte[] key, byte[] data) throws GeneralSecurityException {
   byte[] decodedData = Base64.decode(data);
   if (decodedData == null || decodedData.length <= IV_LENGTH) {
    throw new RuntimeException("Bad input data.");
   }
   byte[] hmac = new byte[HMAC_LENGTH];
   System.arraycopy(decodedData, 0, hmac, 0, HMAC_LENGTH);
   if (!Arrays.equals(hmac,
     hmac(key, decodedData, HMAC_LENGTH, decodedData.length HMAC_LENGTH))) {
    throw new RuntimeException("HMAC validation failed.");
   }
   byte[] iv = new byte[IV_LENGTH];
   System.arraycopy(decodedData, HMAC_LENGTH, iv, 0, IV_LENGTH);
   Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, bcProvider);
   cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(hash(key), "AES"),
    new IvParameterSpec(iv));
   return cipher.doFinal(decodedData, HMAC_LENGTH + IV_LENGTH,
    decodedData.length HMAC_LENGTH IV_LENGTH);
}

private static byte[] hash(byte[] key) throws NoSuchAlgorithmException {
   MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM);
   md.update(key);
   return md.digest();
}

private static byte[] hmac(byte[] key, byte[] data, int offset, int length)
throws GeneralSecurityException {
   Mac mac = Mac.getInstance(HMAC_ALGORITHM, bcProvider);
   mac.init(new SecretKeySpec(key, HMAC_ALGORITHM));
   mac.update(data, offset, length);
   return mac.doFinal();
}