2011-04-07 14 views
6

एक संदर्भ के रूप में साथ और पोस्ट करने के लिए निरंतरता के रूप में एईएस एन्क्रिप्शन -कुंजी पीढ़ी: how to use OpenSSL to decrypt Java AES-encrypted data?OpenSSL

मैं निम्नलिखित प्रश्न हैं।

मैं एएस-सीबीसी-128 में डेटा एन्क्रिप्ट करने के लिए ओपनएसएसएल libs और प्रोग्रामिंग सी का उपयोग कर रहा हूं। मुझे कोई इनपुट बाइनरी डेटा दिया गया है और मुझे इसे एन्क्रिप्ट करना है।

मुझे पता है कि जावा में चतुर्थ और कीपरमीटर सेट करने के लिए एक सिफर पैरामीटर इंटरफ़ेस भी है।

क्या ओपनएसएसएल का उपयोग करके IV और एक कुंजी उत्पन्न करने का कोई तरीका है? संक्षेप में इन उद्देश्यों के लिए ओपनएसएसएल के यादृच्छिक जनरेटर को कॉल करने के लिए सी प्रोग्राम में कोई कैसे उपयोग कर सकता है। क्या आप में से कोई भी इस पर कुछ दस्तावेज़/उदाहरण/लिंक प्रदान कर सकता है?

धन्यवाद

उत्तर

2

मान लिया जाये कि एईएस 128:

unsigned char key[16]; 
RAND_bytes(key, sizeof(key)); 

unsigned char iv[16]; 
RAND_bytes(iv, sizeof(iv)); 

यादृच्छिक जनरेटर की जरूरत है those से एक का उपयोग करने से पहले वरीयता प्राप्त किया जाना है।

+0

"यादृच्छिक बीज" के बारे में विकी पर एक त्वरित पढ़ने का कहना है कि यह एक प्रारंभिक मान है जिसे आप यादृच्छिक जनरेटर शुरू करने के लिए प्रदान करते हैं। थॉमस पोर्निन के संदेश से, मैं देखता हूं कि ओपनएसएसएल इस बीज को/dev/urandom से चुनता है? लिनक्स पर फिर मैं इसे RAND_seed (कॉन्स्ट शून्य * buf, int num) के साथ कैसे सेट करूं ??? – pimmling

+0

# शामिल हस्ताक्षर किए गए char rnd_seed = (हस्ताक्षरित चार) समय (NULL)); RAND_seed (rnd_seed, sizeof rnd_seed); इस बारे में कैसे? – pimmling

+3

@pimmling: नहीं, नहीं, एक हजार बार नहीं। 'समय (एनयूएलएल) में लगभग पर्याप्त एन्ट्रॉपी नहीं है - यदि आप ऐसा करते हैं, तो आपका सिस्टम * असुरक्षित रूप से असुरक्षित होगा। – caf

12

एक एईएस कुंजी, और सममित एन्क्रिप्शन के लिए एक चतुर्थ, केवल यादृच्छिक बाइट्स के गुच्छा हैं। तो कोई भी क्रिप्टोग्राफिक रूप से मजबूत यादृच्छिक संख्या जेनरेटर चाल करेगा। ओपनएसएसएल ऐसे यादृच्छिक संख्या जनरेटर प्रदान करता है (जो स्वयं ऑपरेटिंग सिस्टम जो कुछ भी प्रदान करता है, उदाहरण के लिए विंडोज़ पर CryptGenRandom() या लिनक्स पर /dev/random और /dev/urandom)। समारोह RAND_bytes() है। तो कोड इस तरह दिखेगा:

#include <openssl/rand.h> 

/* ... */ 
unsigned char key[16], iv[16]; 

if (!RAND_bytes(key, sizeof key)) { 
    /* OpenSSL reports a failure, act accordingly */ 
} 
if (!RAND_bytes(iv, sizeof iv)) { 
    /* OpenSSL reports a failure, act accordingly */ 
} 
+0

बहुत बहुत धन्यवाद। मैं एक लिनक्स सिस्टम का उपयोग कर रहा हूं, मुझे कोड में dev/urandom को कैसे कॉल करना चाहिए? – pimmling

+0

@pimmling: आप '/ dev/urandom' का उपयोग नहीं करते हैं,' RAND_bytes() 'के कार्यान्वयन के लिए यह आपके लिए करता है। यदि आप सीधे '/ dev/urandom' का उपयोग करते हैं (विंडोज़ दुनिया में पोर्टेबिलिटी जब्त कर रहे हैं), तो यह सिर्फ एक फ़ाइल है (एक विशेष फ़ाइल है, लेकिन फिर भी फाइल के रूप में देखी जाती है) जिसे आप खोलते और पढ़ते हैं (इसलिए' fopen() ', 'फ्रेड() 'और' fclose() ')। 'RAND_bytes() 'को कॉल करना आसान है (तीन की बजाय एक फ़ंक्शन कॉल) और अधिक पोर्टेबल (ओपनएसएसएल उचित ओएस-प्रदत्त आरएनजी का उपयोग करेगा, चाहे वह लिनक्स पर/dev/urandom' हो, या अन्य सिस्टम पर कुछ और हो)। –

+0

ओह ठीक है। लेकिन मैं बीज मूल्य कैसे निर्धारित करूं? जब मैंने ओपनएसएसएल कोड देखा, तो मैंने देखा कि उन्होंने एक कॉन्स स्ट्रिंग सेट की है और बस एक RAND_seed (स्ट्रिंग, आकार स्ट्रिंग) करें। क्या मुझे ऐसा कुछ करना चाहिए? और ये RAND_bytes एक सच्चे यादृच्छिक संख्या उत्पन्न करते हैं और छद्म यादृच्छिक नहीं? – pimmling