openssl密码库_openssl库-程序员宅基地

技术标签: C++学习  c++  

一、什么是openssl

        OpenSSL 是一个开源的密码学工具包,提供了一组用于网络安全的加密和解密算法、协议、以及相关工具的库。它广泛用于构建安全的通信应用程序,如网站、VPN、电子邮件服务器等,以确保数据的机密性、完整性和身份验证。下面是一些与 OpenSSL 相关的概念和功能:

  1. 加密和解密:OpenSSL 提供了对称加密和非对称加密算法,用于保护数据的机密性。对称加密使用相同的密钥进行加密和解密,而非对称加密使用一对密钥(公钥和私钥)进行加密和解密。

  2. SSL/TLS 协议:OpenSSL 实现了 SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)协议,用于安全的数据传输。这些协议用于保护 Web 浏览、电子邮件通信、文件传输等的安全性。

  3. 数字证书:OpenSSL 支持数字证书的生成和验证。数字证书用于身份验证和建立安全通信连接。它们包含了公钥和其他标识信息,由受信任的证书颁发机构(CA)签名。

  4. 哈希函数:OpenSSL 包括多种哈希算法,如 MD5、SHA-1、SHA-256 等,用于验证数据的完整性和生成数据摘要。

  5. 随机数生成:安全随机数是加密操作的关键组成部分,OpenSSL 提供了随机数生成器来生成高质量的随机数。

  6. 密码学工具:OpenSSL 包括密码学工具,如加密解密命令行工具、证书管理工具、SSL/TLS 客户端和服务器实现等。

  7. 受信任的根证书:OpenSSL 包含一组受信任的根证书,用于验证其他实体的数字证书。这些根证书由证书颁发机构(CA)签署,是建立信任链的一部分。

  8. 跨平台:OpenSSL 可以在多种操作系统上使用,包括 Linux、Windows、macOS 等,因此可以轻松集成到不同平台的应用程序中。

  9. 开源性质:OpenSSL 是开源项目,可以自由使用、修改和分发,遵守 OpenSSL 许可证。

  10. 安全性:OpenSSL 努力提供高度安全的密码学算法和协议,以保护数据免受威胁,同时不断更新以应对新的安全挑战。

二、安装openssl

openssl下载链接/source/index.html (openssl.org)

三、常见的加密方式

        在 OpenSSL 中,有多种常见的加密方式可供选择,用于保护数据的机密性。以下是一些 OpenSSL 中常见的加密方式:

  1. 对称加密

    • AES (Advanced Encryption Standard):AES 是一种广泛使用的对称加密算法,支持不同的密钥长度(如 AES-128、AES-192 和 AES-256)。它提供了高级的数据保护和性能。
    • DES (Data Encryption Standard):DES 是一种较旧的对称加密算法,现已不再视为安全,但仍在某些环境中使用。
    • 3DES (Triple Data Encryption Standard):3DES 是 DES 的改进版本,使用三次加密操作来提高安全性。
    • RC4:RC4 是一种流密码算法,曾经广泛用于 SSL/TLS,但现已被弃用。
  2. 非对称加密

    • RSA (Rivest-Shamir-Adleman):RSA 是一种非对称加密算法,用于数据加密和数字签名。它使用一对密钥:公钥和私钥。
    • DSA (Digital Signature Algorithm):DSA 主要用于数字签名,用于验证数据的完整性和身份验证。
    • ECC (Elliptic Curve Cryptography):ECC 是一种非对称加密算法,提供相对较短的密钥长度,同时提供强大的安全性。在某些情况下,ECC 密钥可以提供与传统 RSA 密钥相等的安全性。
  3. 哈希函数

    • MD5 (Message Digest 5):MD5 是一种哈希函数,用于生成数据的摘要。然而,由于其弱点,不再被视为安全的哈希算法。
    • SHA-1 (Secure Hash Algorithm 1):SHA-1 也是一种哈希函数,现在也不再视为安全。
    • SHA-256 和 SHA-3:这些是更强大的哈希函数,用于生成更安全的数据摘要。SHA-256 和 SHA-3 是目前广泛使用的哈希算法。
  4. SSL/TLS 协议

    • OpenSSL 提供了 SSL/TLS 协议的实现,用于安全的数据传输和通信。它支持不同版本的 SSL/TLS,如 SSLv3、TLS 1.0、TLS 1.2 和 TLS 1.3。
  5. 密码学模式

    • OpenSSL 支持各种密码学模式,如 ECB(电子密码本模式)、CBC(密码分组链接模式)、GCM(伽罗华计数模式)等,用于在加密中选择适当的模式。

四、代码示例(部分)

对称加密的代码示例:

#include <iostream>
#include <cstring>
#include <openssl/evp.h>
#include <openssl/ssl.h>
#include <openssl/rand.h>
#include <openssl/err.h>

int main()
{
    OpenSSL_add_all_algorithms();

    // 选择对称密码算法
    const EVP_CIPHER *cipher = EVP_aes_256_cbc();

    // 设置密钥和初始化向量
    unsigned char key[EVP_MAX_KEY_LENGTH] = "zxcvbnm";
    unsigned char iv[EVP_MAX_IV_LENGTH] = "zxcvbnm";

    // if (RAND_bytes(key, EVP_CIPHER_key_length(cipher)) != 1 ||
    //     RAND_bytes(iv, EVP_CIPHER_iv_length(cipher)) != 1)
    // {
    //     std::cerr << "Error generating random bytes." << std::endl;
    //     return 1;
    // }
    // 明文
    const char *plaintext = "adou1234";
    std::cout << "我的密码: " << plaintext << std::endl;

    // 加密
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_EncryptInit_ex(ctx, cipher, nullptr, key, iv);

    int len;
    int ciphertext_len;
    unsigned char ciphertext[1024];         //加密后的密码缓存区

    EVP_EncryptUpdate(ctx, ciphertext, &len, (const unsigned char *)plaintext, strlen(plaintext));
    ciphertext_len = len;

    EVP_EncryptFinal_ex(ctx, ciphertext + ciphertext_len, &len);
    ciphertext_len += len;

    EVP_CIPHER_CTX_free(ctx);

    // 输出加密结果
    std::cout << "加密后的密码: " << std::endl;
    for (int i = 0; i < ciphertext_len; i++)
    {
        printf("%02x", ciphertext[i]);
    }
    std::cout << std::endl;

    // 解密
    ctx = EVP_CIPHER_CTX_new();
    EVP_DecryptInit_ex(ctx, cipher, nullptr, key, iv);

    unsigned char decrypted[1024];
    int decrypted_len;

    EVP_DecryptUpdate(ctx, decrypted, &len, ciphertext, ciphertext_len);
    decrypted_len = len;

    EVP_DecryptFinal_ex(ctx, decrypted + decrypted_len, &len);
    decrypted_len += len;

    EVP_CIPHER_CTX_free(ctx);

    // 输出解密结果
    decrypted[decrypted_len] = '\0';
    std::cout << "解密后的密码: " << decrypted << std::endl;

    EVP_cleanup();
    ERR_free_strings();

    return 0;
}

注意:


    // 设置密钥和初始化向量
    unsigned char key[EVP_MAX_KEY_LENGTH] = "zxcvbnm";
    unsigned char iv[EVP_MAX_IV_LENGTH] = "zxcvbnm";

    // if (RAND_bytes(key, EVP_CIPHER_key_length(cipher)) != 1 ||
    //     RAND_bytes(iv, EVP_CIPHER_iv_length(cipher)) != 1)
    // {
    //     std::cerr << "Error generating random bytes." << std::endl;
    //     return 1;
    // }

 加入不自己初始化密钥和向量,那么使用RAND_bytes将密钥和向量交给程序自己初始化,但是每次初始化的值也不同,加密后的密码也是不同的。

哈希加密中的MD5加密:

#include <iostream>
#include <openssl/md5.h>

int main() {
    // 输入字符串
    const char* input = "Hello, World!";
    
    // 分配存储 MD5 散列值的缓冲区
    unsigned char md5result[MD5_DIGEST_LENGTH];

    // 计算 MD5 散列值
    MD5((const unsigned char*)input, strlen(input), md5result);

    // 将 MD5 散列值以十六进制形式打印出来
    for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
        printf("%02x", md5result[i]);
    }
    printf("\n");

    return 0;
}

 MD5加密只能加密不能解密,它可以将任意长度的输入串经过计算得到固定长度的输出,而且只有在明文相同的情况下,才能等到相同的密文,并且这个算法是不可逆的,即便得到了加密以后的密文,也不可能通过解密算法反算出明文。这样就可以把用户的密码以MD5值(或类似的其它算法)的方式保存起来,用户注册的时候,系统是把用户输入的密码计算成 MD5 值,然后再去和系统中保存的 MD5 值进行比较,如果密文相同,就可以认定密码是正确的,否则密码错误。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_63790642/article/details/133969414

智能推荐

如何配置filezilla服务端和客户端_filezilla server for windows (32bit x86)-程序员宅基地

文章浏览阅读7.8k次,点赞3次,收藏9次。如何配置filezilla服务端和客户端百度‘filezilla server’下载最新版。注意点:下载的版本如果是32位的适用xp和win2003,百度首页的是适用于win7或更高的win系统。32和64内容无异。安装过程也是一样的。一、这里的filezilla包括服务端和客户端。我们先来用filezilla server 架设ftp服务端。看步骤。1选择标准版的就可以了。 _filezilla server for windows (32bit x86)

深度学习图像处理01:图像的本质-程序员宅基地

文章浏览阅读724次,点赞18次,收藏8次。深度学习作为一种强大的机器学习技术,已经成为图像处理领域的核心技术之一。通过模拟人脑处理信息的方式,深度学习能够从图像数据中学习到复杂的模式和特征,从而实现从简单的图像分类到复杂的场景理解等多种功能。要充分发挥深度学习在图像处理中的潜力,我们首先需要理解图像的本质。本文旨在深入探讨深度学习图像处理的基础概念,为初学者铺平通往高级理解的道路。我们将从最基础的问题开始:图像是什么?我们如何通过计算机来理解和处理图像?

数据探索阶段——对样本数据集的结构和规律进行分析_数据分析 规律集-程序员宅基地

文章浏览阅读62次。在收集到初步的样本数据之后,接下来该考虑的问题有:(1)样本数据集的数量和质量是否满足模型构建的要求。(2)是否出现从未设想过的数据状态。(3)是否有明显的规律和趋势。(4)各因素之间有什么样的关联性。解决方案:检验数据集的数据质量、绘制图表、计算某些特征量等,对样本数据集的结构和规律进行分析。从数据质量分析和数据特征分析两个角度出发。_数据分析 规律集

上传计算机桌面文件图标不见,关于桌面上图标都不见了这类问题的解决方法-程序员宅基地

文章浏览阅读8.9k次。关于桌面上图标都不见了这类问题的解决方法1、在桌面空白处右击鼠标-->排列图标-->勾选显示桌面图标。2、如果问题还没解决,那么打开任务管理器(同时按“Ctrl+Alt+Del”即可打开),点击“文件”→“新建任务”,在打开的“创建新任务”对话框中输入“explorer”,单击“确定”按钮后,稍等一下就可以见到桌面图标了。3、问题还没解决,按Windows键+R(或者点开始-->..._上传文件时候怎么找不到桌面图标

LINUX 虚拟网卡tun例子——修改_怎么设置tun的接收缓冲-程序员宅基地

文章浏览阅读1.5k次。参考:http://blog.csdn.net/zahuopuboss/article/details/9259283 #include #include #include #include #include #include #include #include #include #include #include #include _怎么设置tun的接收缓冲

UITextView 评论输入框 高度自适应-程序员宅基地

文章浏览阅读741次。创建一个inputView继承于UIView- (instancetype)initWithFrame:(CGRect)frame{ self = [superinitWithFrame:frame]; if (self) { self.backgroundColor = [UIColorcolorWithRed:0.13gre

随便推点

字符串基础面试题_java字符串相关面试题-程序员宅基地

文章浏览阅读594次。字符串面试题(2022)_java字符串相关面试题

VSCODE 实现远程GUI,显示plt.plot, 设置x11端口转发_vscode远程ssh连接服务器 python 显示plt-程序员宅基地

文章浏览阅读1.4w次,点赞12次,收藏21次。VSCODE 实现远程GUI,显示plt.plot, 设置x11端口转发问题服务器 linux ubuntu16.04本地 windows 10很多小伙伴发现VSCode不能显示figure,只有用自带的jupyter才能勉强个截图、或者转战远程桌面,这对数据分析极为不方便。在命令行键入xeyes(一个显示图像的命令)会failed,而桌面下会出现:但是Xshell能实现X11转发图像,有交互功能,但只能用Xshell输入命令plot,实在不方便。其实VScode有X11转发插件!!方法_vscode远程ssh连接服务器 python 显示plt

element-ui switch开关打开和关闭时的文字设置样式-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏2次。element switch开关文字显示element中switch开关把on-text 和 off-text 属性改为 active-text 和 inactive-text 属性.怎么把文字描述显示在开关上?下面就是实现方法: 1 <el-table-column label="状态"> 2 <template slot-scope="scope">..._el-switch 不同状态显示不同字

HttpRequestUtil方法get、post、JsonToPost_httprequestutil.httpget-程序员宅基地

文章浏览阅读785次。java后台发起请求使用的工具类package com.cennavi.utils;import org.apache.http.Header;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apach_httprequestutil.httpget

App-V轻量级应用程序虚拟化之三客户端测试-程序员宅基地

文章浏览阅读137次。在前两节我们部署了App-V Server并且序列化了相应的软件,现在可谓是万事俱备,只欠东风。在这篇博客里面主要介绍一下如何部署客户端并实现应用程序的虚拟化。在这里先简要的说一下应用虚拟化的工作原理吧!App-V Streaming 就是利用templateServer序列化出一个软件运行的虚拟环境,然后上传到app-v Server上,最后客户..._app-v 客户端