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对明文加密,最后对密文进行解密,并输出解密后的明文。