2013-02-13 82 views
5

त्वरित एक जो अब तक मुझे (लंबी रात) से बच रहा है। मैं PHP बनाम जावा में एईएस 256 की तुलना कर रहा हूं और विसंगतियों को देख रहा हूं। कृपया सादगी के लिए एसीआई कुंजी और शून्य चतुर्थ को अनदेखा करें, उनको उत्पादन में बदल दिया जाएगा। लेकिन मैं और अतीत यह पहली प्राप्त करने की आवश्यकता को समझ नहीं सकता मैं कहाँ स्खलित कर रहा हूँ:एईएस 256 जावा बनाम PHP

पीएचपी:

echo base64_encode(
    mcrypt_encrypt(
     MCRYPT_RIJNDAEL_128, 
     "1234567890ABCDEF1234567890ABCDEF", 
     "This is a test", 
     MCRYPT_MODE_CBC, 
     "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 
    ) 
); 

जावा

byte[] key = "1234567890ABCDEF1234567890ABCDEF".getBytes("UTF-8"); 
byte[] iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 
AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv); 
SecretKeySpec newKey = new SecretKeySpec(key, "AES"); 
Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec); 
byte[] results = cipher.doFinal("This is a test".getBytes("UTF-8")); 

return Base64.encodeToString(results,Base64.DEFAULT); 

पीएचपी उत्पादन: 0KwK+eubMErzDaPU1+mwTQ==

जावा उत्पादन : DEKGJDo3JPtk48tPgCVN3Q==

मैं ओ_ओ की अपेक्षा नहीं कर रहा था!

मैंने MCRYPT_MODE_CBC, MCRYPT_MODE_CFB, MCRYPT_MODE_ECB, MCRYPT_MODE_NOFB, आदि का भी प्रयास किया है .. उनमें से कोई भी जावा स्ट्रिंग का उत्पादन नहीं करता है।

+1

आप ("एईएस") को बदलने 'Cipher.getInstance की कोशिश की है' –

+0

Yezzir, "एईएस/सीबीसी/NoPadding" IllegalBlockSizeException पैदा करता है: डेटा ब्लॉक नहीं आकार गठबंधन। "एईएस/सीबीसी/पीकेसीएस 5 पैडिंग" "DEKGJDo3JPtk48tPgCVN3Q ==" उत्पन्न करता है, जैसा कि "एईएस/सीबीसी/पीकेसीएस 7 पैडिंग" है। –

+0

वह बेवकूफ था, बिना पैडिंग के आपको यह सुनिश्चित करना होगा कि आप ब्लॉक आकार का एक बहु प्रदान कर रहे हैं। मैं जो जवाब मानता हूं उसके साथ मैं एक उत्तर पोस्ट करूंगा। –

उत्तर

1

PHP ब्लॉक आकार के एकाधिक बनाने के लिए \0 के साथ इनपुट बाइट्स पैड करता है। - शून्य आधारित गद्दी भी आवश्यक न हो

Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
int blockSize = cipher.getBlockSize(); 

byte[] inputBytes = data.getBytes(); 
int byteLength = inputBytes.length; 
if (byteLength % blockSize != 0) { 
    byteLength = byteLength + (blockSize - (byteLength % blockSize)); 
} 

byte[] paddedBytes = new byte[byteLength]; 

System.arraycopy(inputBytes, 0, paddedBytes, 0, inputBytes.length); 

cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec); 
byte[] results = cipher.doFinal(paddedBytes); 
इस के लिए

एक चेतावनी के रूप में: जावा में बराबर यह (यह मानते हुए स्ट्रिंग आप एन्क्रिप्ट करना चाहते हैं data में है) होगा। आपकी स्ट्रिंग के अंत में \0 वर्णों और वास्तविक पैडिंग के बीच अंतर निर्धारित करने का कोई तरीका नहीं है। इसके बजाए पीकेसीएस 5 पैडिंग का उपयोग करना बेहतर है, लेकिन आपको PHP में अलग-अलग परिणाम मिलेंगे। खुद से पूछें कि क्या आपको इस तरह एन्क्रिप्शन क्रॉस-प्लेटफार्म की आवश्यकता है। `Cipher.getInstance (" एईएस/सीबीसी/NoPadding ") को`;

+0

उपर्युक्त कोड 0KWK + eubMErzDaPU1 + mwTQ == –

+0

उत्पन्न करता है जो आप खोज रहे हैं? स्क्रैच करें - स्वीकृत उत्तर –

+0

नहीं देखा यह निश्चित रूप से है =) –

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

  • कोई संबंधित समस्या नहीं^_^