利用openssl库,C语言实现AES加密

先介绍一下AES加密

AES(Advanced Encryption Standard)是一种对称密钥加密算法,也是目前应用最广泛的加密算法之一。它可以用于保护数据的机密性和完整性,通常用于文件、文件夹和整个磁盘的加密,还可以用于网络通信中数据的加密和解密。AES算法的出现是为了替代DES算法,以提高安全性和效率。
AES算法的密钥长度可以是128位、192位或256位,因此它被称为“AES-128”、“AES-192”或“AES-256”。在加密过程中,AES算法将明文分成一组大小相等的块,每个块的大小为128位。然后,通过多轮迭代,每轮迭代中都会对块进行一系列的代换和置换操作,最终生成密文。
AES算法的加密过程可以分为以下几个步骤:
1. 密钥扩展:根据AES算法的密钥长度,将密钥进行扩展,生成每轮迭代所需的轮密钥。
2. 初始化:将明文块与第一轮轮密钥进行异或操作。
3. 轮迭代:对每个块进行多轮迭代,每轮迭代包括四个步骤:字节代换、行移位、列混淆和轮密钥加。
4. 最终迭代:在最后一轮迭代中,不进行列混淆操作。
5. 输出:将最后一个块的结果输出,即密文。
解密过程与加密过程类似,但是需要使用相同的密钥和相反的操作来还原明文。由于AES算法使用的是对称密钥加密,因此在使用该算法加密和解密之前,发送方和接收方需要提前协商并共享相同的密钥。

这里主要是用到了openssl库,简单介绍一下openssl库

OpenSSL是一个开源的软件库,包含了各种加密算法和协议的实现,如SSL/TLS、AES、RSA、DES、SHA等。它可以用来实现网络通信的安全,包括加密、认证和数据完整性验证等功能。
OpenSSL库的主要功能包括:
1. 加密和解密数据:OpenSSL库提供了对称加密和非对称加密算法的实现,例如AES、RSA、DES、RC4等,可以用于保护数据的机密性。
2. 签名和验证数据:OpenSSL库支持各种数字签名算法,如RSA、DSA和ECDSA等,可以用于验证数据的完整性和来源。
3. SSL/TLS协议实现:OpenSSL库实现了SSL和TLS协议,可以用于保护网络通信的安全。
4. X.509证书管理:OpenSSL库支持X.509数字证书的生成、管理和验证。
5. 随机数生成器:OpenSSL库提供了高质量的随机数生成器,可以用于生成加密密钥和其他加密所需的随机数据。
6. 其他功能:OpenSSL库还提供了一些其他功能,如哈希函数、密码学哈希函数、Base64编码、SSL握手协议等。
OpenSSL库广泛应用于各种应用领域,例如网络通信、电子商务、数字签名等。

直接附上代码:

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

#define AES_KEY_SIZE 128 // AES密钥长度
#define AES_BLOCK_SIZE 16 // AES分块大小

// 加密函数
void aes_encrypt(const unsigned char *plaintext, unsigned char *ciphertext, const unsigned char *key) {
    AES_KEY aes_key;
    AES_set_encrypt_key(key, AES_KEY_SIZE, &aes_key);
    AES_encrypt(plaintext, ciphertext, &aes_key);
}

// 解密函数
void aes_decrypt(const unsigned char *ciphertext, unsigned char *plaintext, const unsigned char *key) {
    AES_KEY aes_key;
    AES_set_decrypt_key(key, AES_KEY_SIZE, &aes_key);
    AES_decrypt(ciphertext, plaintext, &aes_key);
}

int main() {
    // 明文密码
    const char *plaintext_password = "my_password";
    size_t plaintext_password_len = strlen(plaintext_password);

    // AES密钥
    const unsigned char aes_key[] = { 0x7b, 0xf3, 0x5c, 0xd6, 0x9c, 0x47, 0x5d, 0x5e, 0x6f, 0x1d, 0x7a, 0x23, 0x18, 0x7b, 0xf9, 0x34 };

    // 分配加密后的密文空间
    size_t ciphertext_password_len = ((plaintext_password_len + AES_BLOCK_SIZE - 1) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;
    unsigned char *ciphertext_password = malloc(ciphertext_password_len);

    // 对明文密码进行AES加密
    aes_encrypt((const unsigned char *)plaintext_password, ciphertext_password, aes_key);

    // 输出加密后的密码
    printf("加密后的密码:\n");
    for (size_t i = 0; i < ciphertext_password_len; i++) {
        printf("%02x", ciphertext_password[i]);
    }
    printf("\n");

    // 分配解密后的明文空间
    unsigned char *decrypted_password = malloc(plaintext_password_len);

    // 对密文密码进行AES解密
    aes_decrypt(ciphertext_password, decrypted_password, aes_key);

    // 输出解密后的密码
    printf("解密后的密码:%s\n", decrypted_password);

    // 释放空间
    free(ciphertext_password);
    free(decrypted_password);

    return 0;
}








#define   SIZE  32

void get_rand(char *p,  int length) 
{	
        char value[10] = "0123456789";
        srand(time(NULL));
        for (int i = 0; i < length; ++i) {
            *(p + i) = value[rand() % 10];
        }
        *(p + SIZE) = '\0';

	return 0;
}

int getAESKey(int eid, request* wp, int argc, char **argv)
{         
        unsigned  char AESKey[SIZE] = {0}; 
        get_rand(AESKey, SIZE);
        boaWrite(wp, AESKey);
   
        return 0;
} 















gcc test.c -lssl -lcrypto -o test

运行如下:

加密后的密码:
ef5c7db847d0383b0680c52f1f452c0a
解密后的密码:my_password

猜你喜欢

转载自blog.csdn.net/buhuidage/article/details/129192727
今日推荐