OpenSSL的一些使用案例

news/2024/7/17 8:53:06 标签: linux, openssl, 加解密, 通讯加密, C

目录

一、介绍

C%E3%80%81%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8-toc" style="margin-left:0px;">二、基本使用

1、Shell

C%881%EF%BC%89%E6%96%87%E4%BB%B6%E5%8A%A0%E8%A7%A3%E5%AF%86-toc" style="margin-left:80px;">(1)文件加解密

C%882%EF%BC%89%E7%94%9F%E6%88%90%E5%AF%86%E9%92%A5%E6%96%87%E4%BB%B6-toc" style="margin-left:80px;">(2)生成密钥文件

2、API

C%881%EF%BC%89md5sum-toc" style="margin-left:80px;">(1)md5sum

C%882%EF%BC%89AES256%E5%8A%A0%E8%A7%A3%E5%AF%86-toc" style="margin-left:80px;">(2)AES256加解密


一、介绍

        本篇博客重点不是详细描述 OpenSSL 的用法,只是作为日常使用中的一个备忘,方便下次使用时快速索引。后续还会继续补充。

C%E3%80%81%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8">二、基本使用

1、Shell

C%881%EF%BC%89%E6%96%87%E4%BB%B6%E5%8A%A0%E8%A7%A3%E5%AF%86">(1)文件加解密

        需要自定义 key 和 iv

#加密
openssl enc -aes-256-cbc  -K 1234567890 -iv 123456 -in 明文文件 -out 加密文件
#解密
openssl enc -aes-256-cbc -d -K 1234567890 -iv 123456 -in 加密文件 -out 明文文件

C%882%EF%BC%89%E7%94%9F%E6%88%90%E5%AF%86%E9%92%A5%E6%96%87%E4%BB%B6">(2)生成密钥文件

        生成密钥文件 “ key_chatgpt ”,用户名为 “ user01”,两次输入密码。

[root@iZ2ze3k49h290jqnxmziclZ ssl_key]# echo -n 'user01:' >> key_chatgpt
[root@iZ2ze3k49h290jqnxmziclZ ssl_key]# openssl passwd >> key_chatgpt
Password:
Verifying - Password:
[root@iZ2ze3k49h290jqnxmziclZ ssl_key]# cat key_chatgpt
tpffy:4sx1qNlx9bbTM

        这个密钥文件主要配合 nginx 服务器使用,可以在用户访问网页时输入登录密码。

        nginx 配置文件如下所示。

location /chat.html{
    auth_basic "Restricted site";
    auth_basic_user_file /usr/local/nginx/html/ssl_key/key_chatgpt;
    root html;
}

        界面如下所示,进入 Web 界面后自动弹出。 

2、API

C%881%EF%BC%89md5sum">(1)md5sum

        计算文件的 md5 值,用于校验文件是否发生改变。

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

//MD5输出的结果为16字节,两个16进制字符表示一个字节,因此结果应为32位
#define MD5_LEN 32 

int cal_md5sum(char *filename, char *md5sum, int res_len)
{
    FILE *file = fopen(filename, "rb");
    if ( !file ) 
    {
        printf("File not found\n");
        return -1;
    }
    
    unsigned char md5_buf[MD5_DIGEST_LENGTH];

    MD5_CTX ctx;
    MD5_Init(&ctx);
    const size_t bufSize = 4096;
    unsigned char *buffer = (unsigned char *)malloc(bufSize);
    int bytesRead = 0;
    
    while ( ( bytesRead = fread(buffer, 1, bufSize, file) ) ) 
    {
        MD5_Update(&ctx, buffer, bytesRead);
    }
    
    free(buffer);
    fclose(file);
    
    MD5_Final(md5_buf, &ctx);
    
    char hex[MD5_LEN+1] = {0};
    memset(md5sum, 0, res_len);
    if ( res_len >= MD5_LEN + 1 )
    {
        for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) 
        {
            sprintf(md5sum + 2 * i, "%02x", md5_buf[i]);
        }
    }
    else
    {
        printf("res len is invalid\n");
        return -1;
    }
}

int main(int argc, char *argv[]) 
{
    
    char *md5sum = (char *)malloc(sizeof(char) * (MD5_LEN + 1));

    if ( cal_md5sum(argv[1], md5sum, MD5_LEN + 1) < 0 )
    {
        printf("calculate failed\n");
        exit(-1);
    }

    printf("%s  %s\n", md5sum, argv[1]);

    free(md5sum);

    return 0;
}

        运行截图如下所示。 

C%882%EF%BC%89AES256%E5%8A%A0%E8%A7%A3%E5%AF%86" style="background-color:transparent;">(2)AES256加解密

        可用于对 socket 通讯过程中的数据进行加解密。通讯两端需要自行协商 key 和 iv。

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

#define AESKEY "df98b715d5c6ed2b25817b6f255411a1"	//HEX密钥
#define AESIV "2841ae97419c2973296a0d4bdfe19a4f"	//HEX初始向量

unsigned char* str2hex(char *str)	
 {
    unsigned char *ret = NULL;
    int str_len = strlen(str);
    int i = 0;
    assert((str_len % 2) == 0);
    ret = (char *)malloc(str_len / 2);
    for (i = 0;i < str_len; i = i + 2 ) 
    {
        sscanf(str+i, "%2hhx", &ret[i / 2]);
    }
    return ret;
}

int main()
{
    AES_KEY encryptkey;
    AES_KEY decryptkey;

    unsigned char *key;
    unsigned char *stdiv;

    key = str2hex(AESKEY);
    stdiv = str2hex(AESIV);

    AES_set_encrypt_key(key, 256, &encryptkey);
    AES_set_decrypt_key(key, 256, &decryptkey);

    unsigned char plain_text [32];

    memcpy(plain_text, "AES encrypt in openssl demo", 27);
    memset(plain_text + 27, 0, 5);
    printf("plain_text: ");

    for(int i = 0; i < 32; i++)
    {
        printf("%02X ", plain_text[i]);
    }
    printf("\n");
    printf("plain_text : %s\n", plain_text);

    unsigned char encrypted_text [32];

    memset(encrypted_text, 0, 32);
    unsigned char tmpiv[16];
    memcpy(tmpiv, stdiv, 16);
    AES_cbc_encrypt(plain_text, encrypted_text, 32, &encryptkey, tmpiv, AES_ENCRYPT);

    printf("encrypted_text: ");
    for(int i = 0; i < 32; i++)
    {
        printf("%02X ", encrypted_text[i]);
    }
    printf("\n");


    unsigned char decrypted_text [32];

    memset(decrypted_text, 0, 32);
    memcpy(tmpiv, stdiv, 16);
    AES_cbc_encrypt(encrypted_text, decrypted_text, 32, &decryptkey, tmpiv, AES_DECRYPT);

    printf("decrypted_text: ");
    for(int i = 0; i < 32; i++)
    {
        printf("%02X ", decrypted_text[i]);
    }
    printf("\n");
    printf("decrypted_text: %s\n", decrypted_text);

    return 0;
}

        运行截图如下所示。

--------------------------------------- 废话分界线 ----------------------------------------------

--------------------------------------- 废话分界线 ----------------------------------------------

--------------------------------------- 废话分界线 ----------------------------------------------

OpenSSL是一种开放源代码的软件库包,它为应用程序提供安全通信功能,以避免窃听并确认通信双方的身份

OpenSSL的全称是Open Secure Sockets Layer,广泛被应用在互联网的网页服务器上。它是在上世纪90年代中期由Eric A. Young和Tim J. Hudson编写的,旨在提供一个没有太多限制的开放源代码的安全套接层协议实现。作为一个强大的密码库,OpenSSL不仅在网络传输层上保护数据安全,还提供了丰富的加密、解密、证书管理等功能。下面将具体介绍OpenSSL:

  1. 主要组成:OpenSSL包含三个主要的功能部分:SSL协议库、应用程序以及密码算法库。其中,SSL(Secure Sockets Layer)协议是互联网上保密通讯的工业标准,由Netscape公司提出,目标是保证两个应用间通信的保密性和可靠性。
  2. 加密算法:OpenSSL支持多种对称加密和非对称加密算法。对称加密算法包括AES、DES、Blowfish等,而非对称加密算法则有DH算法、RSA算法、DSA算法和椭圆曲线算法等。这些加密算法确保数据在传输过程中的安全性和完整性。
  3. 密钥管理:OpenSSL提供了密钥和证书管理功能,支持ASN.1的证书和密钥相关标准,包括对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64编解码功能。它还实现了私钥的PKCS#12和PKCS#8的编解码功能,并提供了对私钥的加密保护。
  4. 协议实现:OpenSSL实现了SSL协议的多个版本,包括SSLv2、SSLv3以及TLSv1.0。这些协议的版本在细节上略有不同,但总体目标是通过加密和认证机制保障互联网通信的安全。
  5. 应用场景:OpenSSL广泛应用于各种网络安全协议中,例如HTTPS就是将HTTP协议通过SSL加密实现安全的网页浏览。除此之外,VPN、加密的电子邮件协议等也常用到OpenSSL。

总结来说,OpenSSL不仅是一个功能强大的密码学库,还是一个多用途的、跨平台的安全工具。其开源特性和广泛的适用性使其成为技术人员在进行安全开发时的重要选择。

 


http://www.niftyadmin.cn/n/5543465.html

相关文章

数据库系统原理练习 | 作业1-第1章绪论(附答案)

整理自博主本科《数据库系统原理》专业课完成的课后作业&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方&#xff0c;欢迎各位斧正。 专业课本&#xff1a; 目录 一、选择题 二&#xff1a;简答题 三&#xff1a;综合题 一、选择…

MySQL右连接详解

在 MySQL 中&#xff0c;右连接&#xff08;RIGHT JOIN&#xff09;用于从两个或多个表中获取数据&#xff0c;返回右表中的所有行&#xff0c;即使在左表中没有匹配的行。 右连接的语法如下&#xff1a; SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.col…

2024年生成式人工智能(AIGC)进化速度太快了,如何帮助我们提升效率呢

在软件工程领域里&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正悄然重塑着程序员的日常作业模式。从源码的自动编写&#xff0c;到瑕疵的敏锐捕捉&#xff0c;再到测试流程的自主执行&#xff0c;AI驱动的工具已然晋升为编程人员不可或缺的智囊团。尽管如此&#…

C++学习/复习21--多态定义/虚函数与重写/虚函数表/单继承多继承的多态/抽象类/面试题

一、多态的定义及条件 二、虚函数与重写 2.1virtual 注意事项&#xff1a;只有成员函数可以是虚函数 2.2三同与重写 2.3用基类的指针或引用 注意事项&#xff1a;指针指向什么对象就调用其相应的函数 2.4重写条件的例外 协变与重写 析构函数的重写 为什么析构函数需重写 2.5o…

汽车报价资讯app小程序模板源码

蓝色实用的汽车报价&#xff0c;汽车新闻资讯&#xff0c;最新上市汽车资讯类小程序前端模板。包含&#xff1a;选车、资讯列表、榜单、我的主页、报价详情、资讯详情、询底价、登录、注册、车贷&#xff0c;油耗、意见反馈、关于我们等等。这是一款非常全的汽车报价小程序模板…

哈希表——C语言

哈希表&#xff08;Hash Table&#xff09;是一种高效的数据结构&#xff0c;能够在平均情况下实现常数时间的查找、插入和删除操作。 哈希表的核心是哈希函数&#xff0c;哈希函数是一个将输入数据&#xff08;通常称为“键”或“key”&#xff09;转换为固定长度的整数的函数…

Bert入门-使用BERT(transformers库)对推特灾难文本二分类

Kaggle入门竞赛-对推特灾难文本二分类 这个是二月份学习的&#xff0c;最近整理资料所以上传到博客备份一下 数据在这里&#xff1a;https://www.kaggle.com/competitions/nlp-getting-started/data github&#xff08;jupyter notebook&#xff09;&#xff1a;https://gith…

最近看English the American way一点小结

这个书还行吧&#xff0c;就是没很多时间去学。最后就是总结一些觉得还有用的短语和单词。 hang out drop by/in 来访 what are you up to? Thanks a bunch. tied up Stay tuned 敬请期待 hop on/into the bus/car. hail a cab off track 偏题了 in the same boat f…