Linux中使用OpenSSL的lssl库进行加密解密操作 (linux openssl -lssl)

在日常工作中,安全性越来越重要,特别是在数据交换和存储方面。为了保护敏感信息,加密和解密是必不可少的操作。Linux中有许多加密解密工具,其中OpenSSL是最为广泛使用的加密库之一。本文将介绍如何在Linux系统中使用OpenSSL的lssl库进行加密解密操作。

1. 安装OpenSSL库

在Linux系统中,默认情况下是没有安装OpenSSL库的。因此,我们需要首先在系统中安装OpenSSL库。具体的安装步骤会根据不同的Linux发行版而有所不同。以Ubuntu为例,我们可以通过以下的命令来安装OpenSSL库:

“`

sudo apt-get install libssl-dev

“`

安装成功后,我们就可以开始使用OpenSSL库的lssl库进行加密解密操作。

2. 使用lssl库进行加密解密操作

lssl是OpenSSL库的一个子集,它包含了加密、解密、签名和验证等功能。下面我们将逐步介绍如何使用lssl库进行加密解密操作。

在使用lssl库之前,我们首先需要引入lssl库的头文件和定义一些变量和宏。具体的代码如下:

“`c

#include

#include

#include

#define AES_BLOCK_SIZE 16

“`

以上代码中,我们引入了AES加密相关的头文件及相关的宏定义。下面我们将逐步介绍如何使用lssl库进行加密解密操作。

2.1 AES加密

AES加密是常见的加密算法之一。下面我们将介绍如何使用lssl库进行AES加密操作。

“`c

void aes_encrypt(unsigned char *plntext, int plntext_len, unsigned char *key,

unsigned char *iv, unsigned char *ciphertext)

{

EVP_CIPHER_CTX *ctx;

int len;

int ciphertext_len;

/* 创建并初始化EVP_CIPHER_CTX */

if (!(ctx = EVP_CIPHER_CTX_new()))

handleErrors();

/* 初始化加密操作 */

if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))

handleErrors();

/* 执行加密操作 */

if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plntext, plntext_len))

handleErrors();

ciphertext_len = len;

/* 结束加密操作 */

if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))

handleErrors();

ciphertext_len += len;

/* 释放EVP_CIPHER_CTX */

EVP_CIPHER_CTX_free(ctx);

}

“`

以上代码中,我们使用了EVP_CIPHER_CTX来管理加密上下文,并初始化了加密操作。接着,我们调用EVP_EncryptUpdate函数从明文中读取数据,并调用EVP_EncryptFinal_ex函数完成加密操作。我们释放了EVP_CIPHER_CTX。

2.2 AES解密

解密操作与加密操作类似,只是调用的函数稍有不同。下面我们将介绍如何使用lssl库进行AES解密操作。

“`c

void aes_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,

unsigned char *iv, unsigned char *plntext)

{

EVP_CIPHER_CTX *ctx;

int len;

int plntext_len;

/* 创建并初始化EVP_CIPHER_CTX */

if (!(ctx = EVP_CIPHER_CTX_new()))

handleErrors();

/* 初始化解密操作 */

if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))

handleErrors();

/* 执行解密操作 */

if (1 != EVP_DecryptUpdate(ctx, plntext, &len, ciphertext, ciphertext_len))

handleErrors();

plntext_len = len;

/* 结束解密操作 */

if (1 != EVP_DecryptFinal_ex(ctx, plntext + len, &len))

handleErrors();

plntext_len += len;

/* 释放EVP_CIPHER_CTX */

EVP_CIPHER_CTX_free(ctx);

}

“`

以上代码中,我们首先创建并初始化了EVP_CIPHER_CTX。接着,我们初始化了解密操作并调用EVP_DecryptUpdate函数从密文中读取数据。我们释放EVP_CIPHER_CTX。

3. 示例程序

为了演示lssl库的加密解密操作,我们编写了以下示例程序:

“`c

#include

#include

#include

#include

#include

#include

#define AES_BLOCK_SIZE 16

void handleErrors(void)

{

fprintf(stderr, “Error\n”);

abort();

}

void aes_encrypt(unsigned char *plntext, int plntext_len, unsigned char *key,

unsigned char *iv, unsigned char *ciphertext)

{

EVP_CIPHER_CTX *ctx;

int len;

int ciphertext_len;

/* 创建并初始化EVP_CIPHER_CTX */

if (!(ctx = EVP_CIPHER_CTX_new()))

handleErrors();

/* 初始化加密操作 */

if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))

handleErrors();

/* 执行加密操作 */

if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plntext, plntext_len))

handleErrors();

ciphertext_len = len;

/* 结束加密操作 */

if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))

handleErrors();

ciphertext_len += len;

/* 释放EVP_CIPHER_CTX */

EVP_CIPHER_CTX_free(ctx);

}

void aes_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,

unsigned char *iv, unsigned char *plntext)

{

EVP_CIPHER_CTX *ctx;

int len;

int plntext_len;

/* 创建并初始化EVP_CIPHER_CTX */

if (!(ctx = EVP_CIPHER_CTX_new()))

handleErrors();

/* 初始化解密操作 */

if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))

handleErrors();

/* 执行解密操作 */

if (1 != EVP_DecryptUpdate(ctx, plntext, &len, ciphertext, ciphertext_len))

handleErrors();

plntext_len = len;

/* 结束解密操作 */

if (1 != EVP_DecryptFinal_ex(ctx, plntext + len, &len))

handleErrors();

plntext_len += len;

/* 释放EVP_CIPHER_CTX */

EVP_CIPHER_CTX_free(ctx);

}

void print_hex(unsigned char *data, int len)

{

for (int i = 0; i

printf(“%02x”, data[i]);

}

printf(“\n”);

}

int mn()

{

unsigned char plntext[] = “OpenSSL-lssl-example”;

unsigned char key[AES_BLOCK_SIZE], iv[AES_BLOCK_SIZE];

unsigned char ciphertext[sizeof(plntext)];

unsigned char decryptedtext[sizeof(plntext)];

int decryptedtext_len, ciphertext_len;

/* 生成随机KEY和IV */

RAND_bytes(key, AES_BLOCK_SIZE);

RAND_bytes(iv, AES_BLOCK_SIZE);

printf(“Plntext: %s\n”, plntext);

/* 加密 */

aes_encrypt(plntext, strlen((char *) plntext), key, iv, ciphertext);

printf(“Ciphertext: “);

print_hex(ciphertext, sizeof(ciphertext));

/* 解密 */

aes_decrypt(ciphertext, sizeof(ciphertext), key, iv, decryptedtext);

/* 取出解密后的字符串,需要末尾加上’\0’才能打印出来 */

decryptedtext_len = sizeof(decryptedtext);

decryptedtext[decryptedtext_len] = ‘\0’;

printf(“Decrypted text: %s\n”, decryptedtext);

return 0;

}

“`

以上程序生成了随机的KEY和IV,然后使用KEY和IV对明文加密,最后对密文进行解密,并输出解密后的明文。


数据运维技术 » Linux中使用OpenSSL的lssl库进行加密解密操作 (linux openssl -lssl)