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

智能推荐

海康威视网络摄像头开发流程(五)------- 直播页面测试_ezuikit 测试的url-程序员宅基地

文章浏览阅读3.8k次。1、将下载好的萤石js插件,添加到SoringBoot项目中。位置可参考下图所示。(容易出错的地方,在将js插件在html页面引入时,发生路径错误的问题)所以如果对页面中引入js的路径不清楚,可参考下图所示存放路径。2、将ezuikit.js引入到demo-live.html中。(可直接将如下代码复制到你创建的html页面中)<!DOCTYPE html><html lan..._ezuikit 测试的url

如何确定组态王与多动能RTU的通信方式_组态王ua-程序员宅基地

文章浏览阅读322次。第二步,在弹出的对话框选择,设备驱动—>PLC—>莫迪康—>ModbusRTU—>COM,根据配置软件选择的协议选期期,这里以此为例,然后点击“下一步”。第四步,把使用虚拟串口打勾(GPRS设备),根据需要选择要生成虚拟口,这里以选择KVCOM1为例,然后点击“下一步”设备ID即Modbus地址(1-255) 使用DTU时,为下485接口上的设备地址。第六步,Modbus的从机地址,与配置软件相同,这里以1为例,点击“下一步“第五步,Modbus的从机地址,与配置软件相同,这里以1为例,点击“下一步“_组态王ua

npm超详细安装(包括配置环境变量)!!!npm安装教程(node.js安装教程)_npm安装配置-程序员宅基地

文章浏览阅读9.4k次,点赞22次,收藏19次。安装npm相当于安装node.js,Node.js已自带npm,安装Node.js时会一起安装,npm的作用就是对Node.js依赖的包进行管理,也可以理解为用来安装/卸载Node.js需要装的东西_npm安装配置

火车头采集器AI伪原创【php源码】-程序员宅基地

文章浏览阅读748次,点赞21次,收藏26次。大家好,小编来为大家解答以下问题,python基础训练100题,python入门100例题,现在让我们一起来看看吧!宝子们还在新手村练级的时候,不单要吸入基础知识,夯实自己的理论基础,还要去实际操作练练手啊!由于文章篇幅限制,不可能将100道题全部呈现在此除了这些,下面还有我整理好的基础入门学习资料,视频和讲解文案都很齐全,用来入门绝对靠谱,需要的自提。保证100%免费这不,贴心的我爆肝给大家整理了这份今天给大家分享100道Python练习题。大家一定要给我三连啊~

Linux Ubuntu 安装 Sublime Text (无法使用 wget 命令,使用安装包下载)_ubuntu 安装sumlime text打不开-程序员宅基地

文章浏览阅读1k次。 为了在 Linux ( Ubuntu) 上安装sublime,一般大家都会选择常见的教程或是 sublime 官网教程,然而在国内这种方法可能失效。为此,需要用安装包安装。以下就是使用官网安装包安装的教程。打开 sublime 官网后,点击右上角 download, 或是直接访问点击打开链接,即可看到各个平台上的安装包。选择 Linux 64 位版并下载。下载后,打开终端,进入安装..._ubuntu 安装sumlime text打不开

CrossOver for Mac 2024无需安装 Windows 即可以在 Mac 上运行游戏 Mac运行exe程序和游戏 CrossOver虚拟机 crossover运行免安装游戏包-程序员宅基地

文章浏览阅读563次,点赞13次,收藏6次。CrossOver24是一款类虚拟机软件,专为macOS和Linux用户设计。它的核心技术是Wine,这是一种在Linux和macOS等非Windows操作系统上运行Windows应用程序的开源软件。通过CrossOver24,用户可以在不购买Windows授权或使用传统虚拟机的情况下,直接在Mac或Linux系统上运行Windows软件和游戏。该软件还提供了丰富的功能,如自动配置、无缝集成和实时传输等,以实现高效的跨平台操作体验。

随便推点

一个用聊天的方式让ChatGPT写的线程安全的环形List_为什么gpt一写list就卡-程序员宅基地

文章浏览阅读1.7k次。一个用聊天的方式让ChatGPT帮我写的线程安全的环形List_为什么gpt一写list就卡

Tomcat自带的设置编码Filter-程序员宅基地

文章浏览阅读336次。我们在前面的文章里曾写过Web应用中乱码产生的原因和处理方式,旧文回顾:深度揭秘乱码问题背后的原因及解决方式其中我们提到可以通过Filter的方式来设置请求和响应的encoding,来解..._filterconfig selectencoding

javascript中encodeURI和decodeURI方法使用介绍_js encodeur decodeurl-程序员宅基地

文章浏览阅读651次。转自:http://www.jb51.net/article/36480.htmencodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误,所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字符还原回来_js encodeur decodeurl

Android开发——打包apk遇到The destination folder does not exist or is not writeable-程序员宅基地

文章浏览阅读1.9w次,点赞6次,收藏3次。前言在日常的Android开发当中,我们肯定要打包apk。但是今天我打包的时候遇到一个很奇怪的问题Android The destination folder does not exist or is not writeable,大意是目标文件夹不存在或不可写。出现问题的原因以及解决办法上面有说报错的中文大意是:目标文件夹不存在或不可写。其实问题就在我们的打包界面当中图中标红的Desti..._the destination folder does not exist or is not writeable

Eclipse配置高大上环境-程序员宅基地

文章浏览阅读94次。一、配置代码编辑区的样式 <1>打开Eclipse,Help —> Install NewSoftware,界面如下: <2>点击add...,按下图所示操作: name:随意填写,Location:http://eclipse-color-th..._ecplise高大上设置

Linux安装MySQL-5.6.24-1.linux_glibc2.5.x86_64.rpm-bundle.tar_linux mysql 安装 mysql-5.6.24-1.linux_glibc2.5.x86_6-程序员宅基地

文章浏览阅读2.8k次。一,下载mysql:http://dev.mysql.com/downloads/mysql/; 打开页面之后,在Select Platform:下选择linux Generic,如果没有出现Linux的选项,请换一个浏览器试试。我用的谷歌版本不可以,换一个别的浏览器就行了,如果还是不行,需要换一个翻墙的浏览器。 二,下载完后解压缩并放到安装文件夹下: 1、MySQL-client-5.6.2_linux mysql 安装 mysql-5.6.24-1.linux_glibc2.5.x86_64.rpm-bundle