2011-12-16 18 views
6

के लिए PHP समतुल्य PHP मैक्रिप्ट फ़ंक्शन का उपयोग करके जावा ट्रिपल डीईएस फ़ंक्शन द्वारा एन्क्रिप्ट की गई कुंजी को डिक्रिप्ट करने का प्रयास कर रहा है लेकिन बिना किसी किस्मत के। जावा कोडजावा ट्रिपल डीईएस एन्क्रिप्शन/डिक्रिप्शन

import javax.crypto.Cipher; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 


public class Encrypt3DES { 

    private byte[] key; 
    private byte[] initializationVector; 

    public Encrypt3DES(){ 

    } 

    public String encryptText(String plainText, String key) throws Exception{ 

     //---- Use specified 3DES key and IV from other source -------------- 
     byte[] plaintext = plainText.getBytes(); 
     byte[] myIV = key.getBytes(); 
     byte[] tdesKeyData = {(byte)0xA2, (byte)0x15, (byte)0x37, (byte)0x08, (byte)0xCA, (byte)0x62, 
     (byte)0xC1, (byte)0xD2, (byte)0xF7, (byte)0xF1, (byte)0x93, (byte)0xDF, 
     (byte)0xD2, (byte)0x15, (byte)0x4F, (byte)0x79, (byte)0x06, (byte)0x67, 
     (byte)0x7A, (byte)0x82, (byte)0x94, (byte)0x16, (byte)0x32, (byte)0x95}; 

     Cipher c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding"); 
     SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede"); 
     IvParameterSpec ivspec = new IvParameterSpec(myIV); 
      c3des.init(Cipher.ENCRYPT_MODE, myKey, ivspec); 
     byte[] cipherText = c3des.doFinal(plaintext); 
     sun.misc.BASE64Encoder obj64=new sun.misc.BASE64Encoder(); 
     return obj64.encode(cipherText); 

    } 

    public String decryptText(String encryptText, String key) throws Exception{ 


     byte[] initializationVector = key.getBytes(); 
     byte[] tdesKeyData = {(byte)0xA2, (byte)0x15, (byte)0x37, (byte)0x08, (byte)0xCA, (byte)0x62, 
     (byte)0xC1, (byte)0xD2, (byte)0xF7, (byte)0xF1, (byte)0x93, (byte)0xDF, 
     (byte)0xD2, (byte)0x15, (byte)0x4F, (byte)0x79, (byte)0x06, (byte)0x67, 
     (byte)0x7A, (byte)0x82, (byte)0x94, (byte)0x16, (byte)0x32, (byte)0x95}; 


      byte[] encData = new sun.misc.BASE64Decoder().decodeBuffer(encryptText); 
      Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); 
      SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede"); 
      IvParameterSpec ivspec = new IvParameterSpec(initializationVector); 
      decipher.init(Cipher.DECRYPT_MODE, myKey, ivspec); 
      byte[] plainText = decipher.doFinal(encData); 
      return new String(plainText); 

    } 
} 

मैं एक PHP समारोह बराबर ऊपर decryptText जावा कार्य करने के लिए लिखना चाहते हैं नीचे का पता लगाएं। एन्क्रिप्शन के लिए जावा कोड द्वारा उत्पन्न सटीक IV मान उत्पन्न करने में कठिनाई पा रही है, जो डिक्रिप्शन के लिए आवश्यक है।

+0

संबंधित धागा - http://stackoverflow.com/questions/20227/how-do-i-use-3des-encryption-decryption-in-java – adatapost

उत्तर

9

यह आपके जावा कोड का पीएचपी बराबर है

function encryptText($plainText, $key) { 
    $keyData = "\xA2\x15\x37\x08\xCA\x62\xC1\xD2" 
     . "\xF7\xF1\x93\xDF\xD2\x15\x4F\x79\x06" 
     . "\x67\x7A\x82\x94\x16\x32\x95"; 

    $padded = pkcs5_pad($plainText, 
     mcrypt_get_block_size("tripledes", "cbc")); 

    $encText = mcrypt_encrypt("tripledes", $keyData, $padded, "cbc", $key); 

    return base64_encode($encText); 
} 

function decryptText($encryptText, $key) { 
    $keyData = "\xA2\x15\x37\x08\xCA\x62\xC1\xD2" 
     . "\xF7\xF1\x93\xDF\xD2\x15\x4F\x79\x06" 
     . "\x67\x7A\x82\x94\x16\x32\x95"; 

    $cipherText = base64_decode($encryptText); 

    $res = mcrypt_decrypt("tripledes", $keyData, $cipherText, "cbc", $key); 

    $resUnpadded = pkcs5_unpad($res); 

    return $resUnpadded; 
} 


function pkcs5_pad ($text, $blocksize) 
{ 
    $pad = $blocksize - (strlen($text) % $blocksize); 
    return $text . str_repeat(chr($pad), $pad); 
} 

function pkcs5_unpad($text) 
{ 
    $pad = ord($text{strlen($text)-1}); 
    if ($pad > strlen($text)) return false; 
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; 
    return substr($text, 0, -1 * $pad); 
} 

(मैं टिप्पणी The mcrypt reference की 20-Sep-2006 07:56 से PKCS # 5-गद्दी की नकल की है) लेकिन वहाँ कुछ समस्याओं को आप के बारे में पता होना चाहिए:

  • अपने जावा कोड में आप String.getBytes() पर एन्कोडिंग का संकेत दिए बिना कॉल करते हैं। यह आपके कोड को पोर्टेबल बनाता है यदि आपके स्पष्ट टेक्स्ट में गैर ASCII- वर्ण जैसे कि umlauts हैं, क्योंकि जावा सिस्टम-डिफ़ॉल्ट वर्ण सेट का उपयोग करता है। यदि आप इसे बदल सकते हैं तो मैं निश्चित रूप से ऐसा करूँगा। मैं आपको दोनों तरफ (जावा और PHP) पर utf-8 का उपयोग करने की सलाह देता हूं।
  • आपने सिफर-कुंजी को कड़ी मेहनत की है और IV को "कुंजी" के रूप में उपयोग किया है। मैं किसी भी तरह से एक क्रिप्टो-विशेषज्ञ नहीं हूं लेकिन मेरे लिए यह गलत लगता है और एक बड़ी सुरक्षा रिसाव खोल सकता है।
  • यादृच्छिक चतुर्थ बनाएं और शुरुआत में या अपने संदेश के अंत में इसे संयोजित करें। चतुर्थ के आकार के बाद से आपके साइफर के ब्लॉक-आकार के बराबर AFAIK है, आप केवल शुरुआत या अंत से उस बाइट को हटा दें और आसानी से संदेश से चतुर्थ को अलग कर दें।
  • कुंजी के लिए, "मानव उत्पन्न" पासवर्ड से सही आकार के साथ कुंजी उत्पन्न करने के लिए किसी प्रकार की key derivation विधि का उपयोग करना सबसे अच्छा है।
बेशक

, आप अपने विधि नहीं बदल सकते हैं अगर आप कुछ दिया आवश्यकताओं को पूरा करने के लिए है।

+0

thnks बहुत vstm। मैं जांच और वापस आऊंगा। – Ranju

+0

यह बहुत अच्छा काम कर रहा है !! आपकी मदद के लिए एक टन thnks !! – Ranju

+0

मैं एक परिवर्तनीय $ keyData के मान को बदल सकता हूं? –

0

उत्तर लगभग अच्छा है! बस $keyData और $key रिवर्स

$encText = mcrypt_encrypt("tripledes", $keyData, $padded, "cbc", $key); 

और

$res = mcrypt_decrypt("tripledes", $keyData, $cipherText, "cbc", $key); 

में अन्यथा आप हमेशा एक ही 3DES कुंजी का उपयोग करेगा। और $keyData को $iv का नाम बदलना बेहतर है।

वैसे भी, जावा नमूना और PHP-Java अनुवाद के लिए बहुत बहुत धन्यवाद।

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