फ़ाइलों को एन्क्रिप्ट / डिक्रिप्ट करने के लिए ओपनएसएसएल का उपयोग कैसे करें?


205

मैं एक पासवर्ड का उपयोग करके एक फ़ाइल को क्रिप्ट और डिक्रिप्ट करना चाहता हूं।

मैं ऐसा करने के लिए ओपनएसएसएल का उपयोग कैसे कर सकता हूं?


2
आपको पासवर्ड का उपयोग करके एक कुंजी और IV प्राप्त करना चाहिए PKCS5_PBKDF2_HMAC। आपको EVP_*फ़ंक्शन को एन्क्रिप्ट और डिक्रिप्ट करने के लिए उपयोग करना चाहिए । ओपनएसएसएल विकी पर ईवीपी सिमेट्रिक एन्क्रिप्शन और डिक्रिप्शन देखें । वास्तव में, आपको संभवतः प्रमाणित एन्क्रिप्शन का उपयोग करना चाहिए क्योंकि यह गोपनीयता और प्रामाणिकता दोनों प्रदान करता है। ओपनएसएसएल विकी पर ईवीपी प्रमाणित एन्क्रिप्शन और डिक्रिप्शन देखें ।
jww

3
अपने प्रश्न से यह न समझें कि आप ओपनएसएसएल क्यों चाहते हैं। नीचे एक टिप्पणी से पता चलता है कि GPG बेहतर है - सुरक्षा के कारण भी। stackoverflow.com/a/31552829/952234 मैं वोट देता हूँ।
यारोस्लाव निकितेंको

जवाबों:


261

सुरक्षा चेतावनी : एईएस -256-सीबीसी प्रमाणित एन्क्रिप्शन प्रदान नहीं करता है और पैडिंग ऑरेकल हमलों के लिए असुरक्षित है । आपको उम्र के बजाय कुछ का उपयोग करना चाहिए ।

एन्क्रिप्ट:

openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc

डिक्रिप्ट:

openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new

विभिन्न झंडों पर अधिक जानकारी


18
ओपी के उपयोग के मामले के आधार पर उत्तर संभवतः इष्टतम नहीं है (इस लेखन के रूप में)। विशेष रूप से पैरामीटर "-a" संभवतः इष्टतम नहीं है और उत्तर इसके उपयोग की व्याख्या नहीं करता है। "-a" का उपयोग आम तौर पर तब किया जाता है जब एन्क्रिप्टेड आउटपुट को ASCII / पाठ रूप में प्रेषित किया जाता है और इसमें बाइनरी फॉर्म की तुलना में आउटपुट आकार को बढ़ाने का प्रभाव होता है। मूल पोस्टर आउटपुट स्वरूप को निर्दिष्ट नहीं करता है और इसलिए मुझे लगता है कि बहुत कम से कम इसका उल्लेख किया जाना चाहिए। उत्तर देखें: stackoverflow.com/a/31552829/952234 जिसमें इस पर एक नोट भी शामिल है कि क्यों आपको इस कार्य के लिए ओपनस्प्ल के बजाय gpg का उपयोग करना चाहिए।
मू

7
उपरोक्त कमांड का उपयोग न करें क्योंकि कोई महत्वपूर्ण व्युत्पत्ति नहीं है। यहाँ और पढ़ें:
खुलता है

एक कुंजी भी निर्दिष्ट करनी चाहिए, या यह उल्लेख करना चाहिए कि यह कहां से आता है। क्या यह मजबूत है?
टेंटेबल

2
@jonasl, नवीनतम मैन पेज के अनुसार, यह बताता है: "डिफ़ॉल्ट डाइजेस्ट को MD5 से बदलकर Openssl 1.1.0 में SHA256 कर दिया गया।" स्रोत: github.com/openssl/openssl/blob/master/doc/man1/enc.pod
Kebman

2
@Kebman से टिप्पणी को जोड़ते हुए, -md sha256यदि आप किसी अन्य मशीन पर इस फ़ाइल का उपयोग करने की योजना बनाते हैं, तो आप अपने एनकोड और डीकोड कमांड में जोड़ सकते हैं । आपको ओपनएसएसएल संस्करण की
असंगतियों

162

संक्षिप्त जवाब:

आप इस उत्तर के अंत में "अतिरिक्त नोट्स" को देखने के gpgबजाय उपयोग करना चाहते हैं । लेकिन इस सवाल का जवाब देने के लिए :opensslopenssl

एन्क्रिप्ट करने के लिए:

openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data

डिक्रिप्ट करने के लिए:

openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data

नोट: एन्क्रिप्ट या डिक्रिप्ट होने पर आपको पासवर्ड के लिए कहा जाएगा।


लंबा जवाब:

आपके लिए जानकारी का सबसे अच्छा स्रोत openssl encशायद होगा: https://www.openssl.org/docs/man1.1.1/man1/enc.html

कमांड लाइन: openssl enc निम्न रूप लेता है:

openssl enc -ciphername [-in filename] [-out filename] [-pass arg]
[-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] 
[-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] 
[-bufsize number] [-nopad] [-debug] [-none] [-engine id]

आपके प्रश्न के संबंध में सबसे उपयोगी मापदंडों की व्याख्या:

-e
    Encrypt the input data: this is the default.

-d    
    Decrypt the input data.

-k <password>
    Only use this if you want to pass the password as an argument. 
    Usually you can leave this out and you will be prompted for a 
    password. The password is used to derive the actual key which 
    is used to encrypt your data. Using this parameter is typically
    not considered secure because your password appears in 
    plain-text on the command line and will likely be recorded in 
    bash history.

-kfile <filename>
    Read the password from the first line of <filename> instead of
    from the command line as above.

-a
    base64 process the data. This means that if encryption is taking 
    place the data is base64 encoded after encryption. If decryption 
    is set then the input data is base64 decoded before being 
    decrypted.
    You likely DON'T need to use this. This will likely increase the
    file size for non-text data. Only use this if you need to send 
    data in the form of text format via email etc.

-salt
    To use a salt (randomly generated) when encrypting. You always
    want to use a salt while encrypting. This parameter is actually
    redundant because a salt is used whether you use this or not 
    which is why it was not used in the "Short Answer" above!

-K key    
    The actual key to use: this must be represented as a string
    comprised only of hex digits. If only the key is specified, the
    IV must additionally be specified using the -iv option. When 
    both a key and a password are specified, the key given with the
    -K option will be used and the IV generated from the password 
    will be taken. It probably does not make much sense to specify 
    both key and password.

-iv IV
    The actual IV to use: this must be represented as a string 
    comprised only of hex digits. When only the key is specified 
    using the -K option, the IV must explicitly be defined. When a
    password is being specified using one of the other options, the 
    IV is generated from this password.

-md digest
    Use the specified digest to create the key from the passphrase.
    The default algorithm as of this writing is sha-256. But this 
    has changed over time. It was md5 in the past. So you might want
    to specify this parameter every time to alleviate problems when
    moving your encrypted data from one system to another or when
    updating openssl to a newer version.

अतिरिक्त नोट्स:

यद्यपि आपने विशेष रूप से OpenSSL के बारे में पूछा है कि आप इस लेख के आधार पर एन्क्रिप्शन के उद्देश्य से GPG का उपयोग करने पर विचार कर सकते हैं OpenSSL बनाम GPG को ऑफ-साइट बैकअप एन्क्रिप्ट करने के लिए?

निम्न आदेशों का उपयोग करने के लिए GPG का उपयोग करने के लिए:

एन्क्रिप्ट करने के लिए:

gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data

डिक्रिप्ट करने के लिए:

gpg --output un_encrypted.data --decrypt encrypted.data

नोट: एन्क्रिप्ट या डिक्रिप्ट होने पर आपको पासवर्ड के लिए कहा जाएगा।


8
OpenSSL पर GPG को प्राथमिकता देने के बारे में शानदार टिप्पणी। मुझे यह अविश्वसनीय लगता है कि ओपनएसएसएल कुंजी के लिए ऐसे कमजोर पासवर्ड व्युत्पन्न हैश का उपयोग करता है!
मार्क

2
उन फ़ाइलों के साथ संगतता के लिए "-md md5" विकल्प का उपयोग करना सुनिश्चित करें जो पुराने एमओडीएसएल पर एन्क्रिप्ट किए गए थे -एमडी विकल्प के बिना निर्दिष्ट करें, अन्यथा आप पाएंगे कि फाइलें नए सिस्टम पर डिक्रिप्ट नहीं करेंगी: github.com/libressl-portable/ पोर्टेबल / मुद्दों / 378
सैम Liddicott

1
खुलने वाले संस्करणों के बीच डिफ़ॉल्ट मान बदलते हैं। 1.0.x -md विकल्प के लिए md5 के डिफ़ॉल्ट का उपयोग करता है। संस्करण 1.1.x sha256 का उपयोग करता है। यदि आप डिक्रिप्ट और ": डिजिटल लिफाफा दिनचर्या: EVP_DecryptFinal_ex: खराब डिक्रिप्ट" त्रुटि प्राप्त करते हैं। "-md md5" या "-md sha256" निर्दिष्ट करने का प्रयास करें।
txyoji

1
"एन्क्रिप्ट या डिक्रिप्ट होने पर आपको पासवर्ड के लिए कहा जाएगा।" gpgपासवर्ड के लिए संकेत दिए बिना मुझे एक फ़ाइल को डिक्रिप्ट करने दे रहा है। ऐसा लगता है कि पासवर्ड कुछ समय के लिए संग्रहीत है, जो मुझे नहीं चाहिए।
user76284

1
@ एमयू यह भी लगता है कि विकल्प --no-symkey-cacheजीपीजी का उपयोग करते समय कैशिंग को निष्क्रिय कर देता है --symmetric, भले ही एजेंट चल रहा हो।
user76284

32

एन्क्रिप्ट:

openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey

डिक्रिप्ट:

openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey

विवरण के लिए, openssl(1)डॉक्स देखें ।


11
एक प्लेन टेक्स्ट पासवर्ड का उपयोग करने के लिए, की जगह -k symmetrickeyके साथ -pass stdinया-pass 'pass:PASSWORD'
Zenexer

3
उपरोक्त कमांड का उपयोग न करें क्योंकि कोई महत्वपूर्ण व्युत्पत्ति नहीं है। यहाँ और पढ़ें:
खुलता है

4
@ Jonasl की टिप्पणी से संबंधित, ध्यान दें कि -k symmetrickeyभ्रामक है। -kविकल्प के लिए एक पासवर्ड, जिसमें से OpenSSL सममित कुंजी निकला है निर्दिष्ट करने के लिए प्रयोग किया जाता है। यदि आप सममित कुंजी निर्दिष्ट करना चाहते हैं, तो आपको -Kविकल्प का उपयोग करना होगा ।
user1071847

13

OPENSSL प्रमुख कुंजी वितरण का उपयोग न करें।

वर्तमान में स्वीकृत उत्तर इसका उपयोग करता है और यह अब अनुशंसित और सुरक्षित नहीं है।

यह एक हमलावर के लिए बहुत ही महत्वपूर्ण है कि वह केवल बल को दबाए रखे।

https://www.ietf.org/rfc/rfc2898.txt

PBKDF1 एक हैश फ़ंक्शन लागू करता है, जो MD2 [6], MD5 [19] या SHA-1 [18] होगा, जो कुंजी प्राप्त करने के लिए होगा। व्युत्पन्न कुंजी की लंबाई हैश फ़ंक्शन आउटपुट की लंबाई से बंधी हुई है, जो एमडी 2 और एमडी 5 के लिए 16 ऑक्टेट और एसएचए -1 के लिए 20 ओकटेट है। PBKDF1 PKCS # 5 v1.5 में प्रमुख व्युत्पत्ति प्रक्रिया के साथ संगत है। PBKDF1 को केवल मौजूदा अनुप्रयोगों के साथ संगतता के लिए अनुशंसित किया जाता है क्योंकि यह जिन कुंजियों का उत्पादन करता है वे कुछ अनुप्रयोगों के लिए पर्याप्त बड़े नहीं हो सकते हैं।

PBKDF2 चाबियाँ प्राप्त करने के लिए एक छद्म आयामी फ़ंक्शन (उदाहरण के लिए परिशिष्ट B.1 देखें) पर लागू होता है। व्युत्पन्न कुंजी की लंबाई अनिवार्य रूप से अबाधित है। (हालांकि, व्युत्पन्न कुंजी के लिए अधिकतम प्रभावी खोज स्थान अंतर्निहित छद्म-आयामी सूची की संरचना द्वारा सीमित हो सकता है। आगे की चर्चा के लिए परिशिष्ट B.1 देखें।) नए अनुप्रयोगों के लिए PBKDF2 की सिफारिश की गई है।

यह करो:

openssl enc -aes-256-cbc -pbkdf2 -iter 20000 -in hello -out hello.enc -k meow

openssl enc -d -aes-256-cbc -pbkdf2 -iter 20000 -in hello.enc -out hello.out

नोट : डिक्रिप्शन में बदलाव के लिए एन्क्रिप्शन में पुनरावृत्तियों के समान होना चाहिए।

Iterations का न्यूनतम 10000 होना है। यहाँ पुनरावृत्तियों की संख्या पर एक अच्छा उत्तर दिया गया है: https://security.stackexchange.com/a/3993

इसके अलावा ... हम यहाँ पर्याप्त लोगों को GPG की सिफारिश कर रहे हैं। लानत सवाल पढ़ें।


4

एन्क्रिप्ट करने के लिए:

$ openssl bf < arquivo.txt > arquivo.txt.bf

डिक्रिप्ट करने के लिए:

$ openssl bf -d < arquivo.txt.bf > arquivo.txt

सीबीसी मोड में bf === ब्लोफिश


3

यादृच्छिक जनित सार्वजनिक कुंजी का उपयोग करके अपडेट करें।

Encypt:

openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}

डिक्रिप्ट:

openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}

मेरा इस पर एक पूरा ट्यूटोरियल है http://bigthinkingapplied.com/key-based-enc एन्क्रिप्शन-using-openssl/


3

ध्यान दें कि ओपनएसएसएल सीएलआई पासफ़्रेज़ को कुंजी में बदलने के लिए एक कमजोर गैर-मानक एल्गोरिथ्म का उपयोग करता है, और आपके घर निर्देशिका में जोड़े गए विभिन्न फाइलों में जीपीजी परिणामों को स्थापित करने और एक जीएसपी-एजेंट पृष्ठभूमि प्रक्रिया चल रही है। यदि आप मौजूदा उपकरणों के साथ अधिकतम पोर्टेबिलिटी और नियंत्रण चाहते हैं, तो आप निचले स्तर के एपीआई तक पहुंचने के लिए PHP और पायथन का उपयोग कर सकते हैं और सीधे पूर्ण एईएस कुंजी और IV में पास कर सकते हैं।

उदाहरण Bash के माध्यम से PHP मंगलाचरण:

IV='c2FtcGxlLWFlcy1pdjEyMw=='
KEY='Twsn8eh2w2HbVCF5zKArlY+Mv5ZwVyaGlk5QkeoSlmc='
INPUT=123456789023456

ENCRYPTED=$(php -r "print(openssl_encrypt('$INPUT','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$ENCRYPTED='$ENCRYPTED
DECRYPTED=$(php -r "print(openssl_decrypt('$ENCRYPTED','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$DECRYPTED='$DECRYPTED

यह आउटपुट:

$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456

आप openssl_pbkdf2पासफ़्रेज़ को कुंजी में सुरक्षित रूप से परिवर्तित करने के लिए PHP के फ़ंक्शन का भी उपयोग कर सकते हैं ।


Openssl CLI अब उपयोगकर्ताओं को लागू करता है और चेतावनी देता है कि उन्हें पासवर्ड हैशिंग के लिए PBKDF2 का उपयोग करना चाहिए। हालाँकि इसकी डिफ़ॉल्ट पुनरावृत्ति गणना बहुत कम है, और इसे बहुत बड़ा बनाने की आवश्यकता है।
एंथनी

2

एक खुला स्रोत कार्यक्रम है जो मुझे लगता है कि यह ऑनलाइन एन्क्रिप्ट और डिक्रिप्ट फ़ाइलों का उपयोग करता है। यह एक ही पासवर्ड के साथ ऐसा करता है। इस ओपन सोर्स स्क्रिप्ट के बारे में महान बात यह है कि यह मूल अनएन्क्रिप्टेड फ़ाइल को फ़ाइल से हटाकर हटा देती है। लेकिन मूल रूप से अनएन्क्रिप्टेड फ़ाइल के चले जाने के बारे में खतरनाक बात यह है कि आपको यह सुनिश्चित करना होगा कि आप अपना पासवर्ड याद रखें अन्यथा वे आपकी फ़ाइल को डिक्रिप्ट करने का कोई अन्य तरीका नहीं है।

यहाँ लिंक यह github पर है

https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py


फ़ाइल एन्क्रिप्शन के लिए Opensl का उपयोग करते समय चीजें बदल गई हैं, उनके बहुत अधिक विकल्प हैं, जिन्हें याद रखने की आवश्यकता है ताकि आप एन्क्रिप्टेड फ़ाइलों को सफलतापूर्वक डिक्रिप्ट कर सकें। इसका एक समाधान है "कीपआउट" एंटोफिटी.गिटलाब .io
एंथनी

2

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, पासवर्ड से AES एन्क्रिप्शन कुंजी प्राप्त करने के लिए खुलने के पिछले संस्करणों ने एक कमजोर कुंजी व्युत्पत्ति फ़ंक्शन का उपयोग किया। हालाँकि, Opensl v1.1.1 एक मजबूत कुंजी व्युत्पत्ति फ़ंक्शन का समर्थन करता है, जहां कुंजी pbkdf2एक बेतरतीब ढंग से उत्पन्न नमक के साथ पासवर्ड से ली गई है , और sha256 हैशिंग (डिफ़ॉल्ट रूप से 10,000) के कई पुनरावृत्तियों।

किसी फ़ाइल को एन्क्रिप्ट करने के लिए:

 openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename

फ़ाइल को डिक्रिप्ट करने के लिए:

  openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename

जिस तरह ये विकल्प बदलते रहते हैं, इसका मतलब है कि आपको यह भी जानने की जरूरत है कि प्रत्येक ओपनस्प्ल एन्क्रिप्टेड फ़ाइल बनाते समय किन विकल्पों का उपयोग किया गया था। विशेष रूप से समय के साथ पुनरावृत्ति गिनती बढ़नी चाहिए! एक समाधान के लिए अपेक्षाकृत सरल रैपर के रूप में ओपनसेल एनएल के आसपास देखें ... "कीपआउट" एंटोफिटी.गिटलैब.io/ software/# keepout अधिक खुलने का समय शामिल करने के लिए इसका विस्तार हो सकता है।
एंथनी

@anthony एक उपयोगी परियोजना की तरह लगती है। इसके अलावा github.com/meixler/web-browser-based-file-enc
एन्क्रिप्शन-dec एन्क्रिप्शन

0

अतिरिक्त टिप्पणियाँ mti2935 अच्छे उत्तर के लिए।

ऐसा लगता है कि उच्च बल ब्रूट बल के खिलाफ बेहतर सुरक्षा है, और आपको एक उच्च पुनरावृत्ति का उपयोग करना चाहिए क्योंकि आप प्रदर्शन / संसाधन को समझ सकते हैं।

मेरे पुराने Intel i3-7100 पर कोई बड़ी फ़ाइल 1.5GB एन्क्रिप्ट करना:

 time openssl enc -aes256 -e -pbkdf2 -iter 10000 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
 Seconds: 2,564s

 time openssl enc -aes256 -e -pbkdf2 -iter 262144 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
 Seconds:  2,775s

वास्तव में कोई अंतर नहीं है, हालांकि स्मृति उपयोग की जांच नहीं की (?)

आज के GPU के साथ, और इससे भी तेज़ कल, मुझे लगता है कि हर सेकंड में बिलियन ब्रूट-फ़ोर्स पुनरावृत्ति संभव है।

12 साल पहले NVIDIA GeForce 8800 Ultra200.000 मिलियन / सेकंड पुनरावृत्तियों पर पुनरावृति हो सकती थी (MD5 हैशिंग हालांकि)

स्रोत: आइने-बैरेट-जॉनसन-विवर-ओपनएसएसएल.पीएफडी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.