2013-02-18 59 views
6

मुझे यह कोड http://www.ravenblast.com/index.php/blog/android-password-text-encryption/ से मिला है और, हालांकि यह काम करता है, मेरे पास बढ़ती संदेह है कि यह पर्याप्त सुरक्षित नहीं है। कोई प्रारंभिक वेक्टर नहीं है जो अन्य स्रोतों के अनुसार जरूरी प्रतीत होता है।क्या यह एईएस एन्क्रिप्शन पर्याप्त सुरक्षित है?

public static String encrypt(String toEncrypt, byte[ ] key) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
    byte[ ] encryptedBytes = cipher.doFinal(toEncrypt.getBytes()); 
    String encrypted = Base64.encodeBytes(encryptedBytes); 
    return encrypted; 
} 

public static String decrypt(String encryptedText, byte[ ] key) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
    byte[] toDecrypt = Base64.decode(encryptedText); 
    byte[] encrypted = cipher.doFinal(toDecrypt); 
    return new String(encrypted); 
} 
+2

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

+2

'getBytes()' का उपयोग करना एक बुरा विचार भी है, क्योंकि यह एक मंच/संस्कृति निर्भर एन्कोडिंग का उपयोग करता है। इसके बजाय यूटीएफ -8 का प्रयोग करें। – CodesInChaos

उत्तर

9

हाँ, यह बहुत सुरक्षित नहीं है। कोई चतुर्थ नहीं है क्योंकि ब्लॉक चेनिंग नहीं है।

एईएस एल्गोरिदम केवल 128 बाइट्स के ब्लॉक को एन्क्रिप्ट कर सकता है, चाहे कुंजी का आकार चाहे (यह असंबंधित नहीं है)। कैसे वे ब्लॉक एक साथ बंधे हैं एक और समस्या है। सबसे आसान तरीका प्रत्येक ब्लॉक को अलग से अन्य (ECB mode) एन्क्रिप्ट करना है, जैसे कि वे अलग संदेश थे। विकिपीडिया आलेख जो मैंने लिंक किया है, आपको बताता है कि यह कब और क्यों सुरक्षित नहीं है, और अन्य विधियां (अर्थात् CBC mode) को प्राथमिकता दी जाती है।

जब आप Cipher cipher = Cipher.getInstance("AES"); करते हैं तो आपको ECB mode में एईएस साइफर दिया जाता है। कोई तात्कालिक खतरा है, लेकिन अपने संदेश आवर्ती पैटर्न है, तो इस तरह की स्थितियों निम्नलिखित करने के लिए नेतृत्व कर सकते हैं:

मूल: enter image description here एनक्रिप्टेड: encrypted