Mahoaa
hacker98
plain_text
5 months ago
3.4 kB
3
Indexable
#include <stdio.h> #include <string.h> #include <openssl/evp.h> #include <openssl/rand.h> // Độ dài khóa và IV cho AES-256-CBC #define AES_KEY_LENGTH 32 // 256 bit #define AES_IV_LENGTH 16 // 128 bit // Hàm để tạo khóa và IV ngẫu nhiên int generate_key_iv(unsigned char *key, unsigned char *iv) { // Tạo khóa ngẫu nhiên if (!RAND_bytes(key, AES_KEY_LENGTH)) { fprintf(stderr, "Không thể tạo khóa ngẫu nhiên.\n"); return 0; } // Tạo IV ngẫu nhiên if (!RAND_bytes(iv, AES_IV_LENGTH)) { fprintf(stderr, "Không thể tạo IV ngẫu nhiên.\n"); return 0; } return 1; } // Hàm để mã hóa dữ liệu sử dụng AES-256-CBC int aes_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) { EVP_CIPHER_CTX *ctx; int len; int ciphertext_len; // Tạo ngữ cảnh cipher if(!(ctx = EVP_CIPHER_CTX_new())) { fprintf(stderr, "EVP_CIPHER_CTX_new failed.\n"); return -1; } // Khởi động quá trình mã hóa với AES-256-CBC if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) { fprintf(stderr, "EVP_EncryptInit_ex failed.\n"); EVP_CIPHER_CTX_free(ctx); return -1; } // Mã hóa plaintext if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len)) { fprintf(stderr, "EVP_EncryptUpdate failed.\n"); EVP_CIPHER_CTX_free(ctx); return -1; } ciphertext_len = len; // Kết thúc quá trình mã hóa if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) { fprintf(stderr, "EVP_EncryptFinal_ex failed.\n"); EVP_CIPHER_CTX_free(ctx); return -1; } ciphertext_len += len; // Giải phóng ngữ cảnh cipher EVP_CIPHER_CTX_free(ctx); return ciphertext_len; } // Hàm để giải mã dữ liệu sử dụng AES-256-CBC int aes_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext) { EVP_CIPHER_CTX *ctx; int len; int plaintext_len; // Tạo ngữ cảnh cipher if(!(ctx = EVP_CIPHER_CTX_new())) { fprintf(stderr, "EVP_CIPHER_CTX_new failed.\n"); return -1; } // Khởi động quá trình giải mã với AES-256-CBC if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) { fprintf(stderr, "EVP_DecryptInit_ex failed.\n"); EVP_CIPHER_CTX_free(ctx); return -1; } // Giải mã ciphertext if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len)) { fprintf(stderr, "EVP_DecryptUpdate failed.\n"); EVP_CIPHER_CTX_free(ctx); return -1; } plaintext_len = len; // Kết thúc quá trình giải mã if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) { fprintf(stderr, "EVP_DecryptFinal_ex failed. Có thể do khóa hoặc IV không đúng.\n"); EVP_CIPHER_CTX_free(ctx); return -1; } plaintext_len += len; // Giải phóng ngữ cảnh cipher EVP_CIPHER_CTX_free(ctx); return plaintext_len; } // Hàm để in dữ liệu dưới dạng hexadecimal void print_hex(const char
Editor is loading...
Leave a Comment