पर ऑपरेशन का एन्क्रिप्शन मोड ओपनएसएसएल में नया, क्या कोई मुझे सी फाइल से एईएस सीटीआर मोड को प्रारंभ करने के तरीके में संकेत दे सकता है। मुझे पता है कि यह विधि हस्ताक्षर है लेकिन मुझे पैरामीटर के साथ समस्याएं आ रही हैं, कई दस्तावेज नहीं हैं और न ही एक सरल उदाहरण है कि एक सरल एन्क्रिप्शन कैसे बनाया जाए। अगर कोई इस विधि को कॉल का उदाहरण दे सकता है तो मैं सराहना करता हूं। अग्रिम में धन्यवाद!ओईएस सीटीआर 256 ओपनएसएसएल
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
const unsigned long length, const AES_KEY *key,
unsigned char ivec[AES_BLOCK_SIZE],
unsigned char ecount_buf[AES_BLOCK_SIZE],
unsigned int *num);
हाय कैफ़े मैं वास्तव में यह वास्तव में उपयोगी साबित हुआ है अपने त्वरित जवाब की सराहना करते हैं, और defenetly सबसे अच्छा उदाहरण मैं वेब पर मिल गया है। मैं अनिश्चित लंबाई के साथ एक फ़ाइल खोलने की कोशिश कर रहा हूं, इसे एन्क्रिप्ट करें और सिफरटेक्स्ट जेनरेट के साथ एक और फाइल लिखें, फिर सिफर्ड फ़ाइल खोलें और सादे टेक्स्ट को पुनर्प्राप्त करें। मुझे काफी मात्रा में एमबी कारण की एक फ़ाइल का उपयोग करने की आवश्यकता है, मैं सीपीयू के प्रदर्शन को बेंचमार्क करना चाहता हूं। हालांकि मुझे अभी भी डिक्रिप्ट करते समय एक समस्या है। किसी भी तरह जब एक काफी txt फ़ाइलों (1504 केबी) को डिक्रिप्ट करते समय यह पूर्ण हो जाता है, और मुझे सादा पाठ में इसका आधा हिस्सा मिलता है और दूसरा आधा अभी भी सिफर किया जाता है। मुझे लगता है कि यह iv के आकार से संबंधित हो सकता है या जिस तरह से मैं काउंटर को बुला रहा हूं।
#include <openssl/aes.h>
#include <stdio.h>
#include <string.h>
struct ctr_state {
unsigned char ivec[16];
unsigned int num;
unsigned char ecount[16];
};
FILE *fp;
FILE *rp;
FILE *op;
size_t count;
char * buffer;
AES_KEY key;
int bytes_read, bytes_written;
unsigned char indata[AES_BLOCK_SIZE];
unsigned char outdata[AES_BLOCK_SIZE];
unsigned char ckey[] = "thiskeyisverybad"; // It is 128bits though..
unsigned char iv[8] = {0};//This should be generated by RAND_Bytes I will take into consideration your previous post
struct ctr_state state;
int init_ctr(struct ctr_state *state, const unsigned char iv[8]){
state->num = 0;
memset(state->ecount, 0, 16);
memset(state->ivec + 8, 0, 8);
memcpy(state->ivec, iv, 8);
}
void encrypt(){
//Opening files where text plain text is read and ciphertext stored
fp=fopen("input.txt","a+b");
op=fopen("output.txt","w");
if (fp==NULL) {fputs ("File error",stderr); exit (1);}
if (op==NULL) {fputs ("File error",stderr); exit (1);}
//Initializing the encryption KEY
AES_set_encrypt_key(ckey, 128, &key);
//Encrypting Blocks of 16 bytes and writing the output.txt with ciphertext
while (1) {
init_ctr(&state, iv); //Counter call
bytes_read = fread(indata, 1, AES_BLOCK_SIZE, fp);
AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);
bytes_written = fwrite(outdata, 1, bytes_read, op);
if (bytes_read < AES_BLOCK_SIZE)
break;
}
fclose (fp);
fclose (op);
free (buffer);
}
void decrypt(){
//Opening files where text cipher text is read and the plaintext recovered
rp=fopen("recovered.txt","w");
op=fopen("output.txt","a+b");
if (rp==NULL) {fputs ("File error",stderr); exit (1);}
if (op==NULL) {fputs ("File error",stderr); exit (1);}
//Initializing the encryption KEY
AES_set_encrypt_key(ckey, 128, &key);
//Encrypting Blocks of 16 bytes and writing the output.txt with ciphertext
while (1) {
init_ctr(&state, iv);//Counter call
bytes_read = fread(indata, 1, AES_BLOCK_SIZE, op);
AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);
bytes_written = fwrite(outdata, 1, bytes_read, rp);
if (bytes_read < AES_BLOCK_SIZE)
break;
}
fclose (rp);
fclose (op);
free (buffer);
}
int main(int argc, char *argv[]){
encrypt();
//decrypt();
system("PAUSE");
return 0;
}
प्रत्येक एन्क्रिप्ट और डिक्रिप्ट समारोह विभिन्न रन में कहा जाता है तो सब कुछ एक ही मूल्यों के साथ हमेशा आरंभ नहीं हो जाता: यहाँ क्या मैं अब तक है। संकेतों के लिए फिर से धन्यवाद, आप मुझे अग्रिम में & प्रदान कर सकते हैं !!!
आपकी समस्या यह है कि आप प्रत्येक ब्लॉक के बाद काउंटर को फिर से शुरू कर रहे हैं। यह गलत है - 'एन्क्रिप्शन और डिक्रिप्शन दोनों में' जबकि() 'loops के बाहर' init_ctr() 'कॉल को ले जाएं। 'indata' और 'outdata' को' AES_BLOCK_SIZE' लंबाई की भी आवश्यकता नहीं है - वे काफी बड़े हो सकते हैं। – caf
आपको * AES_encrypt' और दोस्तों का उपयोग नहीं करना चाहिए। यह एक सॉफ्टवेयर-केवल कार्यान्वयन है, इसलिए आप एईएस-एनआई जैसे हार्डवेयर समर्थन का आनंद नहीं लेंगे। आपको 'EVP_ *' फ़ंक्शंस का उपयोग करना चाहिए। ओपनएसएसएल विकी पर [ईवीपी सममित एन्क्रिप्शन और डिक्रिप्शन] देखें (http://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)। वास्तव में, आपको शायद प्रमाणित एन्क्रिप्शन का उपयोग करना चाहिए क्योंकि यह * दोनों * गोपनीयता और प्रामाणिकता प्रदान करता है। ओपनएसएसएल विकी पर [ईवीपी प्रमाणीकृत एन्क्रिप्शन और डिक्रिप्शन] देखें (http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption)। – jww
यदि आप 'EVP_ *' फ़ंक्शंस का उपयोग करते हैं, तो ब्याज के सिफर 'EVP_aes_128_ctr',' EVP_aes_192_ctr' और 'EVP_aes_256_ctr' हैं। – jww