2011-03-05 12 views
6

स्थिति:एंड्रॉइड में स्ट्रिंग आरएसए एन्क्रिप्शन

मुझे एक ऐसा एप्लिकेशन चाहिए जो आरएसए का उपयोग करके स्ट्रिंग को एन्क्रिप्ट करता है। मेरे पास आरएस/कच्चे में संग्रहीत सार्वजनिक कुंजी है, और क्योंकि कुंजी 1024 बिट्स है, परिणामी स्ट्रिंग 128 बाइट लंबी होनी चाहिए। हालांकि, एन्क्रिप्टिंग के बाद परिणामी स्ट्रिंग 124 लंबी है, और नतीजतन, डिक्रिप्शन दुर्घटनाग्रस्त हो जाता है।

समारोह मैं सार्वजनिक कुंजी ठीक करने के लिए उपयोग कर रहा हूँ है:

private PublicKey getPublicKey() throws Exception { 
    InputStream is = getResources().openRawResource(R.raw.publickey); 
    DataInputStream dis = new DataInputStream(is); 
    byte [] keyBytes = new byte [(int) is.available()]; 
    dis.readFully(keyBytes); 
    dis.close(); 

    X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    return kf.generatePublic(spec); 
} 

और समारोह है कि मैं एन्क्रिप्ट करने के लिए उपयोग कर रहा हूँ के कोड:

private String rsaEncrypt (String plain) { 

    byte [] encryptedBytes; 
    Cipher cipher = Cipher.getInstance("RSA"); 
    PublicKey publicKey = getPublicKey(); 
    cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
    encryptedBytes = cipher.doFinal(plain.getBytes()); 
    String encrypted = new String(encryptedBytes); 
    return encrypted; 

}

पीडी: कोड पूरी तरह से डेस्कटॉप एप्लिकेशन में काम करता है, यह सिर्फ एंड्रॉइड में दुर्घटनाग्रस्त हो जाता है।

मैं वास्तव में किसी भी मदद की सराहना करता हूं,

आपको बहुत धन्यवाद।

उत्तर

6

String encrypted = new String(encryptedBytes);

एक बग है। क्रिप्टो ट्रांसफॉर्म से आउटपुट बाइनरी बाइट्स हैं। आप उन्हें स्ट्रिंग्स के रूप में विश्वसनीय रूप से स्टोर नहीं कर सकते हैं।

is.available() का उपयोग करना शायद एक बग है, लेकिन मुझे इस मामले में निश्चित नहीं है।

अंत में, यह अपने पालतू peeves में से एक है जब लोगों new String(...) और String.getBytes() के डिफ़ॉल्ट चारसेट संस्करणों का उपयोग है। ऐसा करना बहुत ही मुश्किल बात है, खासकर उस जावा में "एक बार लिखना, हर जगह भागना" होने का दावा है। डिफ़ॉल्ट वर्णमाला अलग-अलग प्लेटफॉर्म पर अलग है, जो आपके कोड में एक बग ट्रिगर करेगा भले ही आप सबकुछ सही करते हैं। आपको हमेशा एक विशेष वर्णमाला निर्दिष्ट करना चाहिए। मैंने कभी भी देखा है, बस यूटीएफ -8 वर्णसेट (Charset.forName("UTF-8");) का उपयोग करके हमेशा काम करेगा और डेटा कुशलता से प्रदर्शित करेगा।

+0

धन्यवाद, बस इसे हल करें! – Ullfoll

+0

ग्रेट स्पष्टीकरण! – Roylee

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