Mahoaa

 avatar
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