2011-11-10 9 views
5

कुछ कारणों से मुझे एईएस की बजाय 256 बिट्स के अवरोध के साथ रिजेंडेल डी/संपीड़न को लागू करने की आवश्यकता है जो 128 बिट्स के ब्लॉक आकार का उपयोग करता है (कारण: डेटा रिजेंडेल का उपयोग करके PHP में एन्क्रिप्ट किया गया है ...)।रिजेंडेल के साथ एन्क्रिप्ट या डिक्रिप्ट कैसे करें और 256 बिट्स के ब्लॉक-आकार को कैसे करें?

मैं एक साइफर के लिए ब्लॉक आकार कैसे बदल सकता हूं?

अगर मुझे "RIJNDAEL/CFB/PKCS5Padding" के साथ एक सिफर मिलता है और 256 बिट्स के साथ IV को प्रारंभ करने का प्रयास करता है तो मुझे अपवाद मिलता है, क्योंकि ब्लॉक आकार केवल 128 बिट्स होता है।

+0

शायद आपने अपना जावा JCE असीमित एन्क्रिप्शन कक्षाएं स्थापित किया है सुनिश्चित करने के लिए होगा । वे विशिष्ट मानक जावा वितरण का हिस्सा नहीं हैं क्योंकि वे कुछ देशों में अवैध हैं। – Romain

+0

पहले से ही उन्हें है। अभी भी पता नहीं लगा सकता कि आवश्यक अवरोध – Laures

+0

के साथ एक सिफर ऑब्जेक्ट कैसे प्राप्त करें, फिर मुझे विश्वास है कि @ ग्रेग्स का उत्तर है। मेरा मानना ​​था कि रिजेंडेल -256 जेसीई असीमित प्रदाता का हिस्सा था, लेकिन मुझे अपनी कंपनी के कुछ हद तक अनुकूलित जावा का उपयोग करने के लिए उपयोग किया जाता है - जिसमें इसके लिए एक जेसीई प्रदाता है, लेकिन यह निजी कार्यान्वयन भी हो सकता है। – Romain

उत्तर

13

128-बिट अवरोध के साथ रिजेंडेल के अलावा किसी अन्य चीज़ के लिए सूर्य जेसीई प्रदाताओं में से कोई भी समर्थन नहीं है: यह एईएस एल्गोरिदम है। 256-बिट ब्लॉजिज के साथ रिजेंडेल प्राप्त करने के लिए आपको कहीं और जाना होगा। मैं Bouncycastle java पुस्तकालय का सुझाव देता हूं। RijndaelEngine कक्षा में एक निर्माता है जो बिट्स में ब्लॉक आकार को स्वीकार करता है। उपयुक्त पैडिंग के साथ उपयोग किए जाने पर अधिकांश लोगों को PaddedBufferedBlockCipher कक्षा अधिक सुविधाजनक होने के लिए मिलती है, उदा।

PaddedBufferedBlockCipher c = new PaddedBufferedBlockCipher(new RijndaelEngine(256), new PKCS7Padding()); 
0

ध्यान दें कि पीएचपी mcrypt शून्य बाइट गद्दी तो new ZeroBytePadding()new PKCS7Padding() के बजाय इस्तेमाल किया जाना चाहिए उपयोग करता है।

CBC और RIJNDAEL 256 का उपयोग करके पूर्ण कार्यान्वयन को पूरा करें।

import org.bouncycastle.crypto.CipherParameters; 
import org.bouncycastle.crypto.InvalidCipherTextException; 
import org.bouncycastle.crypto.engines.RijndaelEngine; 
import org.bouncycastle.crypto.modes.CBCBlockCipher; 
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher; 
import org.bouncycastle.crypto.paddings.ZeroBytePadding; 
import org.bouncycastle.crypto.params.KeyParameter; 
import org.bouncycastle.crypto.params.ParametersWithIV; 
import org.bouncycastle.util.encoders.Base64; 

public static String encryptWithAesCBC(String plaintext, String key, String iv) 
{ 
    try { 
     PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new RijndaelEngine(256)), new ZeroBytePadding()); 
     CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key.getBytes()), iv.getBytes()); 
     cipher.init(true, ivAndKey); 
     return new String(Base64.encode(cipherData(cipher, plaintext.getBytes()))); 
    } catch (InvalidCipherTextException e) { 
     throw new RuntimeException(e); 
    } 
} 

public static String decryptWithAesCBC(String encrypted, String key, String iv) 
{ 
    try { 
     byte[] ciphertext = Base64.decode(encrypted); 
     PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(new RijndaelEngine(256)), new ZeroBytePadding()); 

     CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key.getBytes()), iv.getBytes()); 
     aes.init(false, ivAndKey); 
     return new String(cipherData(aes, ciphertext)); 
    } catch (InvalidCipherTextException e) { 
     throw new RuntimeException(e); 
    } 
} 

private static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data) throws InvalidCipherTextException 
{ 
    int minSize = cipher.getOutputSize(data.length); 
    byte[] outBuf = new byte[minSize]; 
    int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0); 
    int length2 = cipher.doFinal(outBuf, length1); 
    int actualLength = length1 + length2; 
    byte[] cipherArray = new byte[actualLength]; 
    for (int x = 0; x < actualLength; x++) { 
     cipherArray[x] = outBuf[x]; 
    } 
    return cipherArray; 
} 

private String md5(String string) 
{ 
    try { 
     java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); 
     byte[] array = md.digest(string.getBytes()); 
     StringBuffer sb = new StringBuffer(); 
     for (int i = 0; i < array.length; ++i) { 
      sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3)); 
     } 
     return sb.toString(); 
    } catch (java.security.NoSuchAlgorithmException e) { 
     throw new RuntimeException(e); 
    } 
} 

CFB उपयोग करते समय, PaddedBufferedBlockCipher द्वारा की जगह होना चाहिए निम्नलिखित:

PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CFBBlockCipher(new RijndaelEngine(256),8), new ZeroBytePadding()); 
// PHP mcrypt uses a blocksize of 8 bit for CFB 

उपयोग:

String salt = "fbhweui3497"; 
String key = md5(salt); 
String iv = md5(md5(salt)); 

String encrypted = encryptWithAesCBC("text to encript", key, iv); 

String decrypted = decryptWithAesCBC(encrypted, key, iv); 
+1

क्या आप कृपया md5() प्रदान कर सकते हैं? स्ट्रिंग एमडी 5 (स्ट्रिंग इनपुट) { \t \t स्ट्रिंग परिणाम = इनपुट; \t \t संदेशडिजिस्ट एमडी; \t \t कोशिश करें { \t \t md = MessageDigest.getInstance ("MD5"); \t \t \t md.update (input.getBytes()); \t \t \t बिगइंटर हैश = नया बिगइंटर (1, md.digest()); \t \t \t परिणाम = हैश.तोस्ट्रिंग (16); \t \t \t जबकि परिणाम (परिणाम।लंबाई() <32) {// 40 SHA-1 \t \t \t परिणाम = "0" + परिणाम; \t \t \t} \t \t} पकड़ (NoSuchAlgorithmException ई) { \t \t \t e.printStackTrace(); \t \t} \t \t वापसी परिणाम; \t} उपरोक्त विधि देने, "java.lang.IllegalArgumentException: मुख्य लंबाई 128/160/192/224/256 बिट्स नहीं है।" – Krish

+0

@ कृष्ण मैंने अभी एमडी 5 कार्यान्वयन के जवाब में जोड़ा है। –

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

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