2016-05-21 11 views
5

के साथ काम करता है सबसे पहले, मुझे यह बताकर शुरू करना है कि मैं किसी भी माध्यम से क्रिप्टोग्राफर नहीं हूं, और मैं सी कोड लिखने में बहुत अच्छा नहीं हूं, इसलिए कृपया इस सवाल का जवाब दें तो कृपया क्षमा करें स्पष्ट या उत्तर दिया गया है। मैं एक मैसेजिंग प्रोग्राम विकसित कर रहा हूं और लक्ष्य मंच पर टीएलएस का उपयोग नहीं कर सकता। नतीजतन, मुझे एईएस की तरह एक सममित पूर्व साझा कुंजी सिफर का उपयोग करके प्रत्येक संदेश को एन्क्रिप्ट करने का तरीका ढूंढना होगा।एन्क्रिप्शन प्रोग्राम जो नोडजे और एमबीटीटीएल

मैं एक अंत में एक mbedtls प्रोग्राम (जैसे एस्क्रिप्ट 2) के बीच डेटा एन्क्रिप्ट और डिक्रिप्ट करने की विधि ढूंढ रहा हूं, और दूसरे पर एक नोडज प्रोग्राम। Mbedtls, पूर्व में polarssl, एक पुस्तकालय है जो एम्बेडेड उपकरणों के लिए एन्क्रिप्शन प्रदान करता है। स्रोत कोड के साथ शामिल कुछ नमूना कार्यक्रम हैं, जैसे एस्क्रीप्ट 2, आरएसएएनक्रिप्ट, ecdsa और crypt_and_hash।

Aescrypt2 ठीक काम करता है जब जिसके परिणामस्वरूप एन्क्रिप्टेड डाटा भी aescrypt2 का उपयोग कर decrypted है, लेकिन मैं NodeJS क्रिप्टो या openssl सहित उस बात के, के लिए किसी अन्य प्रोग्राम का उपयोग डिक्रिप्ट करने के लिए aescrypt के साथ एन्क्रिप्टेड डेटा प्राप्त नहीं कर पा रहे।

echo 'this is a test message' >test.txt 
aescrypt 0 test.txt test.out hex:E76B2413958B00E193 
aescrypt 1 test.out test.denc hex:E76B2413958B00E193 
cat test.denc 
this is a test message 
openssl साथ

:

openssl enc -in out.test -out outfile.txt -d -aes256 -k E76B2413958B00E193 
bad magic number 

कुछ नमूना नोड कोड है कि वर्तमान में

var crypto = require('crypto'); 
    var AESCrypt = {}; 

AESCrypt.decrypt = function(cryptkey, iv, encryptdata) { 
    encryptdata = new Buffer(encryptdata, 'base64').toString('binary'); 

    var decipher = crypto.createDecipheriv('aes-256-cbc', cryptkey, iv), 
     decoded = decipher.update(encryptdata, 'binary', 'utf8'); 

    decoded += decipher.final('utf8'); 
    return decoded; 
} 

AESCrypt.encrypt = function(cryptkey, iv, cleardata) { 
    var encipher = crypto.createCipheriv('aes-256-cbc', cryptkey, iv), 
     encryptdata = encipher.update(cleardata, 'utf8', 'binary'); 

    encryptdata += encipher.final('binary'); 
    encode_encryptdata = new Buffer(encryptdata, 'binary').toString('base64'); 
    return encode_encryptdata; 
} 

var cryptkey = crypto.createHash('sha256').update('Nixnogen').digest(), 
    iv   = 'a2xhcgAAAAAAAAAA', 
    buf  = "Here is some data for the encrypt", // 32 chars 
    enc  = AESCrypt.encrypt(cryptkey, iv, buf); 
    var dec  = AESCrypt.decrypt(cryptkey, iv, enc); 

console.warn("encrypt length: ", enc.length); 
console.warn("encrypt in Base64:", enc); 
console.warn("decrypt all: " + dec); 

यह या तो त्रुटियों या कचरा पाठ हर बार में परिणाम है काम नहीं करता है उदाहरण के लिए। मैंने विभिन्न चीजों को भी बदलने की कोशिश की है।

मैंने -pass pass:password तर्क का उपयोग करने के लिए इस सौ अलग-अलग तरीकों का प्रयास किया है। नोडज का उपयोग करके, मुझे या तो खराब डिक्रिप्ट त्रुटियां मिल गई हैं, या डिक्रिप्शन पर वापस बकवास बकवास हो गया है। मैंने नेट पर कई ट्यूटोरियल का पालन करने की कोशिश की है, जैसे कि this एक, और this thread से सुझाव, और बाकी सब कुछ मैं पा सकता हूं। मैंने पढ़ा है कि अलग-अलग एन्क्रिप्शन प्रोग्राम विभिन्न मानकों का उपयोग करते हैं, इसलिए प्लेटफार्मों/कार्यक्रमों/भाषाओं में संगतता हमेशा गारंटी नहीं दी जाती है, लेकिन मुझे लगता है कि कोई इस समाधान में पहले और समाधान जानता है?

मैं nodejs का उपयोग करके, aescrypt2 (या इस तरह का एक प्रोग्राम) द्वारा एन्क्रिप्ट किए गए डेटा को डिक्रिप्ट कैसे करूं? मैं केवल सिस्टम निष्पादन कॉल का उपयोग करके इसे काम करने में सक्षम हूं और डेटा को डीक्रिप्ट/एन्क्रिप्ट करने के लिए नोड निष्पादित करने के लिए नोडक्रिप्ट 2 निष्पादित कर रहा हूं, जो आदर्श नहीं है, क्योंकि यह चीजों को काफी धीमा कर देता है। मैं aescrypt2 की तुलना में एक अलग प्रोग्राम का उपयोग करने के लिए खुला हूँ। केवल आवश्यकताएं हैं कि इसे लिनक्स पर चलाना चाहिए, openssl libs (क्योंकि वे लक्ष्य प्रणाली पर समर्थित नहीं हैं) का उपयोग नहीं कर सकते हैं, अंतरिक्ष सीमाओं के कारण कार्यक्रम छोटा और सरल होना चाहिए, और सबसे महत्वपूर्ण, एन्क्रिप्शन/डिक्रिप्शन होना आवश्यक है नोडज के साथ संगत। कोई भी सहायताकाफी प्रशंसनीय होगी।

+1

यह सी कोड कैसा है? –

+0

मैं वर्तमान में mbedlts एस्क्रिप्ट नमूना प्रोग्राम का उपयोग करने की कोशिश कर रहा हूं: https://github.com/ARMmbed/mbedtls/blob/development/programs/aes/aescrypt2.c, और यह किसी भी नोड क्रिस्टो पुस्तकालयों के साथ काम नहीं करता है। मैं उस स्रोत की तलाश में हूं जो इसे करता है, या इसे काम करने का एक तरीका है। –

+0

धीमा, और कोड लिखने के तरीके पर कुछ शोध करें। –

उत्तर

2

मैं nodejs का उपयोग करके, एस्क्रीप्ट 2 (या इस तरह का एक प्रोग्राम) द्वारा एन्क्रिप्ट किए गए डेटा को डिक्रिप्ट कैसे करूं?

कहने के लिए खेद है, लेकिन इससे कोई बेहतर जवाब नहीं है: फ़ाइल को डिक्रिप्ट करते समय एस्क्रिप्ट 2 करता है। आपने स्रोत से अपने आप से लिंक किया है, इसलिए डिक्रिप्ट शाखा में सी में करते हुए बस node.js में वही कदम करें।

सबसे पहले, layout of the file containing the encrypted data से परिचित हो:

/* 
    * The encrypted file must be structured as follows: 
    * 
    *  00 .. 15    Initialization Vector 
    *  16 .. 31    AES Encrypted Block #1 
    *   .. 
    *  N*16 .. (N+1)*16 - 1 AES Encrypted Block #N 
    * (N+1)*16 .. (N+1)*16 + 32 HMAC-SHA-256(ciphertext) 
    */ 

तो तुम चतुर्थ, एन्क्रिप्टेड ब्लॉक और फ़ाइल से HMAC को निकालने के लिए, जैसा कि आप के साथ की कोशिश पूरी बात को डिक्रिप्ट करने की कोशिश नहीं की जरूरत है openssl (आपका openssl उदाहरण भी सही चौथाई का उपयोग नहीं करता है बल्कि इसे प्रदान की गई कुंजी से प्राप्त करने का प्रयास करता है - man page पढ़ें)।

अगला, मुख्य अधिकार प्राप्त करें। एन्क्रिप्ट/डिक्रिप्ट करने के लिए कमांड लाइन पर प्रदान नहीं किया गया है, बल्कि SHA256 का उपयोग करते हुए कमांड लाइन पर पारित कुंजी के साथ चौथाई हैशिंग के 8192 पुनरावृत्तियों।

अंत में, वे डिक्रिप्ट, एईएस 256-ईसीबी (आपके openssl और Node.js उदाहरण सीबीसी का उपयोग करें!), हर 16 बाइट्स और प्रवेशक 16 बाइट्स के साथ XOR the result (चतुर्थ पहले 16 बाइट्स के लिए प्रयोग किया जाता है)।

इसके लिए और भी कुछ है, मैंने बस एस्क्रिप्ट 2.c कोड के माध्यम से पढ़ने के दौरान देखी गई सबसे स्पष्ट चीजों को सूचीबद्ध किया है।

तो मेरी सलाह है: node.js में एक ही तर्क लिखने का प्रयास करें और संबंधित mbedtls समकक्षों के लिए node.js क्रिप्टो कॉल को खोजने का प्रयास करें।

मैं क्रिप्टो विशेषज्ञ नहीं हूं, लेकिन मैं शर्त लगाता हूं कि एस्क्रिप्ट कार्यान्वयन में इतने सारे कदम हैं जो जटिल महसूस करते हैं (जैसे वास्तविक कुंजी का उपयोग करना), क्योंकि वे जानते हैं कि क्रिप्टो कैसे करें और इसे सही तरीके से कर रहे हैं ।

+0

धन्यवाद, ईमानदारी से मुझे यह भी यकीन नहीं था कि कौन सी सिफर एस्क्रिप्ट 2 डिफ़ॉल्ट रूप से उपयोग कर रहा था, इसलिए यह निश्चित रूप से मदद करता है। मैं इस जवाब को स्वीकार करने की संभावना समाप्त कर दूंगा, बशर्ते कि अगले दो दिनों में कोई आसान समाधान न आए। मैं आपकी सलाह का प्रयास करूंगा और कल वापस रिपोर्ट करूंगा। एक बार फिर धन्यवाद। –

+0

खुश मैं मदद कर सकता था। जैसा कि बताया गया है, एस्क्रिप्ट 2 तरीके आसान नहीं दिखने का कारण सबसे अधिक संभावना है क्योंकि पूरी एन्क्रिप्शन प्रक्रिया सुरक्षित होने के लिए इसे इस तरह से करने की आवश्यकता है ... – grasbueschel

+0

मैनुअल कहता है - 'उपयोग करने के लिए वास्तविक चतुर्थ : यह केवल एक हेक्स अंकों के एक स्ट्रिंग के रूप में प्रतिनिधित्व किया जाना चाहिए। जब केवल कुंजी को -के विकल्प का उपयोग करके निर्दिष्ट किया जाता है, तो IV को स्पष्ट रूप से परिभाषित किया जाना चाहिए।जब किसी अन्य विकल्प का उपयोग करके पासवर्ड निर्दिष्ट किया जा रहा है, तो IV को इस पासवर्ड से जेनरेट किया जाता है। ' - क्या इसका मतलब यह है कि यदि मैं कुंजी से नहीं लिया गया है, तो प्रत्येक संदेश के लिए उपयोग करने के लिए मैं IV IV को हार्डकोड कर दूंगा? अगर मैं एक अलग चतुर्थ प्रति संदेश का उपयोग कर रहा था, तो वह एक पूर्व निर्धारित कुंजी के बिंदु को हरा देगा, है ना? –

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