मैं और अधिक या कम एक तरह से कार्यक्रम संबंधी एन्क्रिप्शन आधार का अधिक जानने के लिए के रूप में फाइल, स्थानांतरित करने के लिए एक छोटे से आवेदन लिख रहा हूँ। विचार एक आरएसए कीपैयर उत्पन्न करना, सार्वजनिक कुंजी का आदान-प्रदान करना और आगे के डिक्रिप्शन के लिए एईएस iv और कुंजी ओवर भेजना है। मैं, रिसीवर RSA सार्वजनिक कुंजी के साथ एईएस कुंजी एन्क्रिप्ट करने इतना की तरह हैं:आरएसए के साथ एनक्रिप्टिंग एईएस कुंजी सार्वजनिक कुंजी
// encode the SecretKeySpec
private byte[] EncryptSecretKey()
{
Cipher cipher = null;
byte[] key = null;
try
{
cipher = Cipher.getInstance("RSA/ECB/NOPADDING");
// contact.getPublicKey returns a public key of type Key
cipher.init(Cipher.ENCRYPT_MODE, contact.getPublicKey());
// skey is the SecretKey used to encrypt the AES data
key = cipher.doFinal(skey.getEncoded());
}
catch(Exception e)
{
System.out.println ("exception encoding key: " + e.getMessage());
e.printStackTrace();
}
return key;
}
मैं तो रिसीवर के लिए महत्वपूर्ण मूल्य को लिखने, और इतना है कि यह डिक्रिप्ट:
private SecretKey decryptAESKey(byte[] data)
{
SecretKey key = null;
PrivateKey privKey = null;
Cipher cipher = null;
System.out.println ("Data as hex: " + utility.asHex(data));
System.out.println ("data length: " + data.length);
try
{
// assume this loads our private key
privKey = (PrivateKey)utility.loadLocalKey("private.key", false);
cipher = Cipher.getInstance("RSA/ECB/NOPADDING");
cipher.init(Cipher.DECRYPT_MODE, privKey);
key = new SecretKeySpec(cipher.doFinal(data), "AES");
System.out.println ("Key decrypted, length is " + key.getEncoded().length);
System.out.println ("data: " + utility.asHex(key.getEncoded()));
}
catch(Exception e)
{
System.out.println ("exception decrypting the aes key: " + e.getMessage());
e.printStackTrace();
return null;
}
return key;
}
कंसोल में , दूसरी तरफ, मैं इस आउटपुट के रूप में मिलती है: इसके अलावा
read_bytes for key: 16
data length: 16
Data as hex: <hex string>
Key decrypted, length is 256
java.security.InvalidKeyException: Invalid AES key length: 256 bytes
, अगर मैं आकार 16 वर्ष की एक बाइट सरणी बना सकते हैं और इसे में cipher.doFinal (डेटा) उत्पादन में कहें, सरणी प्रतीत होता है 256 का आकार बदलकर बाइट्स (.leng वें कहते हैं, कम से कम)। यह क्यों होगा, और आगे, मैं गलत तरीके से क्या कर रहा हूं?
संपादित
मैं इस हल, और मैं इस मुद्दे के मामले में किसी को इस में चलाता पोस्ट था सोचा। समस्या, यह पता चला, आरएसए/ईसीबी/एनओपीएडीडीडी था। कुछ अजीब कारणों से जब मैंने इसे क्लाइंट में स्थानांतरित कर दिया तो यह गुप्तकी के निर्माण को खराब कर रहा था। यह हो सकता है कैसे मैं keypairs पैदा कर रहा हूँ (मैं getInstance (उस के लिए "आरएसए") का उपयोग कर रहा हूँ) के साथ कुछ है, लेकिन मैं पूरी तरह यकीन नहीं है।
हाय टोपी, पोस्ट कृपया अपने ** पूरा ** बजाय अपने प्रश्न में यह संपादन के एक जवाब के रूप जवाब (आप हमें बताएं कि क्या समस्या थी, उत्तर नहीं)। फिर आप थोड़ी देर बाद अपना जवाब स्वीकार कर सकते हैं। या मेरा स्वीकार करें, जो बताता है कि आपको आरएसए/ईसीबी/नोपैडिंग के बजाय '" आरएसए/ईसीबी/पीकेसीएस 1 पैडिंग "का उपयोग क्यों करना चाहिए ... –
ध्यान दें कि जब आप एक बनाते हैं तो आपको अखंडता संरक्षण (उदाहरण के लिए एक हस्ताक्षर) का उपयोग करना चाहिए ऑनलाइन प्रोटोकॉल जो एन्क्रिप्शन करता है। यहां तक कि आरएसए एन्क्रिप्टीम भी उदाहरण के लिए स्वीकार्य हो सकता है पैडिंग ओरेकल हमले। अखंडता सुरक्षा नहीं है एक आम गलती है, हालांकि यदि आप पीकेसीएस # 1 v1.5 ("आरएसए/ईसीबी/पीकेसीएस 1 पैडिंग" ') द्वारा निहित हैं तो यह समस्या सीमित है। –
एक साइडेनोट के रूप में, ईसीबी शायद ही कभी एक अवरोधक के लिए एक अच्छा तरीका है। – CodesInChaos