Usando a biblioteca openssl, linguagem C para implementar criptografia AES

Vamos primeiro apresentar a criptografia AES

AES (Advanced Encryption Standard) é um algoritmo de criptografia de chave simétrica e um dos algoritmos de criptografia mais usados ​​atualmente. Pode ser usado para proteger a confidencialidade e integridade dos dados, geralmente para criptografar arquivos, pastas e discos inteiros, e também pode ser usado para criptografar e descriptografar dados em comunicações de rede. O algoritmo AES surgiu para substituir o algoritmo DES para melhorar a segurança e a eficiência.
O comprimento da chave do algoritmo AES pode ser de 128 bits, 192 bits ou 256 bits, por isso é chamado de "AES-128", "AES-192" ou "AES-256". Durante o processo de criptografia, o algoritmo AES divide o texto simples em um conjunto de blocos de tamanhos iguais, cada um com 128 bits de tamanho. Então, através de múltiplas rodadas de iteração, uma série de operações de substituição e permutação são realizadas nos blocos em cada rodada de iteração e, finalmente, o texto cifrado é gerado.
O processo de criptografia do algoritmo AES pode ser dividido nas seguintes etapas:
1. Expansão da chave: De acordo com o comprimento da chave do algoritmo AES, a chave é expandida para gerar a chave redonda necessária para cada iteração.
2. Inicialização: XOR do bloco de texto simples com a chave da primeira rodada.
3. Iteração de rodada: Várias rodadas de iteração são realizadas em cada bloco. Cada rodada de iteração inclui quatro etapas: substituição de bytes, mudança de linha, ofuscação de coluna e adição de chave de rodada.
4. Iteração final: Na última iteração, nenhuma ofuscação de coluna é realizada.
5. Saída: produz o resultado do último bloco, que é o texto cifrado.
O processo de descriptografia é semelhante ao processo de criptografia, mas requer o uso da mesma chave e a operação oposta para restaurar o texto simples. Como o algoritmo AES usa criptografia de chave simétrica, o remetente e o destinatário precisam negociar antecipadamente e compartilhar a mesma chave antes de usar esse algoritmo para criptografar e descriptografar.

A biblioteca openssl é usada principalmente aqui. Vamos apresentar brevemente a biblioteca openssl.

OpenSSL é uma biblioteca de software de código aberto que contém a implementação de vários algoritmos e protocolos de criptografia, como SSL/TLS, AES, RSA, DES, SHA, etc. Ele pode ser usado para obter segurança de comunicação de rede, incluindo criptografia, autenticação e verificação de integridade de dados e outras funções.
As principais funções da biblioteca OpenSSL incluem:
1. Criptografar e descriptografar dados: A biblioteca OpenSSL fornece a implementação de criptografia simétrica e algoritmos de criptografia assimétrica, como AES, RSA, DES, RC4, etc., que podem ser usados ​​para proteger o confidencialidade dos dados.
2. Assinar e verificar dados: A biblioteca OpenSSL oferece suporte a vários algoritmos de assinatura digital, como RSA, DSA e ECDSA, que podem ser usados ​​para verificar a integridade e a origem dos dados.
3. Implementação do protocolo SSL/TLS: A biblioteca OpenSSL implementa os protocolos SSL e TLS, que podem ser usados ​​para proteger a segurança das comunicações de rede.
4. Gerenciamento de certificados X.509: A biblioteca OpenSSL suporta a geração, gerenciamento e verificação de certificados digitais X.509.
5. Gerador de números aleatórios: A biblioteca OpenSSL fornece um gerador de números aleatórios de alta qualidade que pode ser usado para gerar chaves de criptografia e outros dados aleatórios necessários para criptografia.
6. Outras funções: A biblioteca OpenSSL também fornece algumas outras funções, como funções hash, funções hash criptográficas, codificação Base64, protocolo de handshake SSL, etc.
A biblioteca OpenSSL é amplamente utilizada em vários campos de aplicação, como comunicações de rede, comércio eletrônico, assinaturas digitais, etc.

Anexe o código diretamente:

#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

Execute da seguinte forma:

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

Acho que você gosta

Origin blog.csdn.net/buhuidage/article/details/129192727
Recomendado
Clasificación