AES和ECC混合加密

求一个C语言写AES和ECC混合加密的代码 有偿

下载OpenSSL。
这只是一个简化的示例,用于演示基本原理,实际的加密过程可能更为复杂和详细,需要考虑更多的安全性和实现细节。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/ec.h>
#include <openssl/obj_mac.h>
#include <openssl/rand.h>

// AES加密函数
void aes_encrypt(const unsigned char *in, unsigned char *out, const unsigned char *key) {
    AES_KEY aes_key;
    AES_set_encrypt_key(key, 128, &aes_key);
    AES_encrypt(in, out, &aes_key);
}

// AES解密函数
void aes_decrypt(const unsigned char *in, unsigned char *out, const unsigned char *key) {
    AES_KEY aes_key;
    AES_set_decrypt_key(key, 128, &aes_key);
    AES_decrypt(in, out, &aes_key);
}

// ECC加密函数
int ecc_encrypt(const unsigned char *in, int in_len, unsigned char *out) {
    EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);
    if (!ec_key) {
        return -1;
    }

    if (!EC_KEY_generate_key(ec_key)) {
        EC_KEY_free(ec_key);
        return -1;
    }

    EC_POINT *ec_public_key = EC_KEY_get0_public_key(ec_key);

    size_t enc_len = EC_POINT_point2oct(EC_KEY_get0_group(ec_key), ec_public_key, POINT_CONVERSION_COMPRESSED, out, 33, NULL);
    if (enc_len != 33) {
        EC_KEY_free(ec_key);
        return -1;
    }

    EC_KEY_free(ec_key);
    return enc_len;
}

// ECC解密函数
int ecc_decrypt(const unsigned char *in, unsigned char *out) {
    EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);
    if (!ec_key) {
        return -1;
    }

    if (!EC_KEY_generate_key(ec_key)) {
        EC_KEY_free(ec_key);
        return -1;
    }

    EC_POINT *ec_point = EC_POINT_new(EC_KEY_get0_group(ec_key));
    if (!ec_point) {
        EC_KEY_free(ec_key);
        return -1;
    }

    if (EC_POINT_oct2point(EC_KEY_get0_group(ec_key), ec_point, in, 33, NULL) != 1) {
        EC_POINT_free(ec_point);
        EC_KEY_free(ec_key);
        return -1;
    }

    if (!EC_KEY_set_public_key(ec_key, ec_point)) {
        EC_POINT_free(ec_point);
        EC_KEY_free(ec_key);
        return -1;
    }

    size_t dec_len = EC_KEY_priv2oct(ec_key, out, 33, NULL);
    if (dec_len != 33) {
        EC_POINT_free(ec_point);
        EC_KEY_free(ec_key);
        return -1;
    }

    EC_POINT_free(ec_point);
    EC_KEY_free(ec_key);
    return dec_len;
}

int main() {
    const unsigned char plain_text[] = "This is a sample message for encryption.";
    unsigned char encrypted[AES_BLOCK_SIZE];
    unsigned char decrypted[AES_BLOCK_SIZE];
    unsigned char ecc_key[33] = {0};
    unsigned char decrypted_ecc_key[33] = {0};

    // 生成 AES 密钥
    unsigned char aes_key[AES_BLOCK_SIZE];
    RAND_bytes(aes_key, AES_BLOCK_SIZE);

    // AES 加密
    aes_encrypt(plain_text, encrypted, aes_key);

    // ECC 加密
    ecc_encrypt(aes_key, AES_BLOCK_SIZE, ecc_key);

    // ECC 解密
    ecc_decrypt(ecc_key, decrypted_ecc_key);

    // AES 解密
    aes_decrypt(encrypted, decrypted, decrypted_ecc_key);

    printf("Plain Text: %s\n", plain_text);
    
    printf("AES Encrypted Text: ");
    for (int i = 0; i < AES_BLOCK_SIZE; i++) {
        printf("%02x", encrypted[i]);
    }
    printf("\nECC Encrypted AES Key: ");
    for (int i = 0; i < 33; i++) {
        printf("%02x", ecc_key[i]);
    }
    printf("\nDecrypted ECC Key: ");
    for (int i = 0; i < 33; i++) {
        printf("%02x", decrypted_ecc_key[i]);
    }
    printf("\nAES Dncrypted Text: ");
    for (int i = 0; i < AES_BLOCK_SIZE; i++) {
        printf("%02x", decrypted[i]);
    }