当前位置: 首页 > news >正文

openssl对称加密代码讲解实战

文章目录

  • 一、openssl对称加密和非对称加密算法对比
      • 1. 加密原理
      • 2. 常用算法
      • 3. 加密速度
      • 4. 安全性
      • 5. 应用场景
      • 6. 优缺点对比
      • 综合分析
  • 二、代码实战
      • 代码说明:
      • 运行输出示例
      • 代码说明:
      • 注意事项


一、openssl对称加密和非对称加密算法对比

OpenSSL 是一个广泛使用的加密库,提供了丰富的对称加密和非对称加密算法。这两类加密方式各有不同的特点和适用场景。以下是两者的对比:

1. 加密原理

  • 对称加密

    • 使用相同的密钥进行加密和解密。
    • 密钥在加密和解密双方之间共享,因此需要一个安全的密钥传输方式。
    • 加密速度较快,适合加密大量数据。
  • 非对称加密

    • 使用一对密钥:公钥和私钥。公钥用于加密,私钥用于解密。
    • 公钥可以公开,私钥则需要保护,只有拥有私钥的人才能解密公钥加密的数据。
    • 适合小数据量加密和签名,但处理大数据效率较低。

2. 常用算法

  • 对称加密算法(在 OpenSSL 中支持的常见算法):

    • AES(高级加密标准):流行且安全的对称加密算法,支持 128、192 和 256 位密钥长度。
    • SM4:主要用于中国的商用密码标准,采用 128 位密钥。
    • DES 和 3DES(数据加密标准及三重数据加密标准):早期的加密算法,但已不再安全,较少使用。
  • 非对称加密算法(在 OpenSSL 中支持的常见算法):

    • RSA:广泛使用的非对称算法,密钥长度通常为 2048 或 4096 位。
    • ECC(椭圆曲线加密):基于椭圆曲线的加密,密钥较短但安全性高,用于资源受限的环境。
    • DSA(数字签名算法):主要用于签名,常见于数字证书。

3. 加密速度

  • 对称加密

    • 对称加密算法如 AES 在处理速度上显著优于非对称加密,非常适合大文件或大量数据的加密。
    • 常用于文件加密、数据存储、网络数据传输加密等场景。
  • 非对称加密

    • 非对称加密算法处理速度慢,因为其运算更为复杂,适合小数据量的加密,如数字签名和密钥交换。
    • 在实际应用中,通常将其与对称加密结合使用,通过非对称加密传输对称密钥来实现安全的密钥交换,后续的数据传输则使用对称加密。

4. 安全性

  • 对称加密

    • 安全性依赖于密钥长度和算法设计;例如,AES-256 被认为是非常安全的对称加密算法。
    • 密钥必须在传输中保持安全,一旦密钥泄露,数据的机密性将受到威胁。
  • 非对称加密

    • 安全性依赖于密钥长度和密钥保护。比如 RSA-2048 被认为是安全的,而 ECC 则以较短密钥提供更高安全性。
    • 私钥的安全性至关重要,如果私钥泄露,任何持有公钥的人都可以解密数据。

5. 应用场景

  • 对称加密的应用场景

    • 用于 HTTPS 中的数据加密(结合非对称加密交换密钥后)。
    • 云存储、数据库等大文件的加密保护。
    • VPN、WiFi 等网络传输中对数据的加密。
  • 非对称加密的应用场景

    • 数字签名,用于认证数据的来源和完整性。
    • SSL/TLS 协议中,用于加密对称加密密钥并验证通信双方身份。
    • 数据加密用于保护敏感信息的小文件,例如加密密码、密钥或数字证书。

6. 优缺点对比

对比项目对称加密非对称加密
密钥数量1 个密钥,共享密钥1 对密钥(公钥和私钥)
加密速度快,适合大数据慢,适合小数据
安全性密钥泄露会导致数据泄密公钥泄露不会影响数据的私密性
密钥分配需要安全的密钥传输私钥无需传输,安全性更高
典型应用大数据文件的加密、VPN、存储加密SSL/TLS、数字签名、密钥交换

综合分析

OpenSSL 中通常结合对称加密和非对称加密,以实现性能与安全性兼备的加密方案。例如,在 SSL/TLS 协议中,服务器会先使用非对称加密交换密钥,然后使用对称加密传输数据。

二、代码实战

下面是使用 OpenSSL 实现对称加密的示例代码,采用 AES-256-CBC 算法对数据进行加密。此代码会生成一个随机的初始向量(IV),并且使用固定的密钥对数据加密。

#include <openssl/evp.h>
#include <openssl/rand.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>#define AES_KEY_LENGTH 32  // AES-256, so 256 bits = 32 bytes
#define AES_BLOCK_SIZE 16void handleErrors() {ERR_print_errors_fp(stderr);abort();
}// 对称加密函数
int aes_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,unsigned char *iv, unsigned char *ciphertext) {EVP_CIPHER_CTX *ctx;int len;int ciphertext_len;// 创建并初始化上下文if (!(ctx = EVP_CIPHER_CTX_new())) handleErrors();// 初始化加密操作,指定 AES-256-CBC 算法if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) handleErrors();// 加密数据if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))handleErrors();ciphertext_len = len;// 完成加密if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) handleErrors();ciphertext_len += len;// 释放上下文EVP_CIPHER_CTX_free(ctx);return ciphertext_len;
}int main() {// 32 字节的密钥 (256 位)unsigned char key[AES_KEY_LENGTH] = "0123456789abcdef0123456789abcdef";// 生成 16 字节的初始向量 (128 位)unsigned char iv[AES_BLOCK_SIZE];if (!RAND_bytes(iv, AES_BLOCK_SIZE)) {fprintf(stderr, "随机生成初始向量失败\n");return 1;}unsigned char plaintext[] = "This is the data to encrypt";  // 要加密的数据unsigned char ciphertext[128];  // 存储密文的缓冲区// 执行加密操作int ciphertext_len = aes_encrypt(plaintext, strlen((char *)plaintext), key, iv, ciphertext);// 打印初始向量printf("Initial Vector (IV): ");for (int i = 0; i < AES_BLOCK_SIZE; i++) {printf("%02x ", iv[i]);}printf("\n");// 打印加密后的数据(密文)printf("Ciphertext (hex): ");for (int i = 0; i < ciphertext_len; i++) {printf("%02x ", ciphertext[i]);}printf("\n");return 0;
}

代码说明:

  • 初始化加密上下文:使用 EVP_CIPHER_CTX_new() 创建加密上下文。
  • 设置加密算法和密钥:通过 EVP_EncryptInit_ex() 指定 AES-256-CBC 算法。
  • 加密数据EVP_EncryptUpdate() 用于加密数据块。
  • 完成加密EVP_EncryptFinal_ex() 处理最后的数据块。
  • 生成随机初始向量(IV)RAND_bytes() 生成随机 IV,确保加密的安全性。

运行输出示例

Initial Vector (IV): 1a 2b 3c 4d ... (随机生成)
Ciphertext (hex): ae f5 67 89 ... (加密后的密文)

注意:密钥和初始向量(IV)应安全存储,并且应仅与需要解密的接收方共享。

这是对应解密代码,解密前需要与加密代码相同的密钥和初始向量(IV),用相同的算法参数对密文进行解密:

#include <openssl/evp.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>#define AES_KEY_LENGTH 32  // 256 位密钥
#define AES_BLOCK_SIZE 16  // AES 块大小 128 位(16 字节)void handleErrors() {ERR_print_errors_fp(stderr);abort();
}// 对称解密函数
int aes_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,unsigned char *iv, unsigned char *plaintext) {EVP_CIPHER_CTX *ctx;int len;int plaintext_len;// 创建并初始化上下文if (!(ctx = EVP_CIPHER_CTX_new())) handleErrors();// 初始化解密操作,使用 AES-256-CBC 算法if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) handleErrors();// 提供待解密的数据if (1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))handleErrors();plaintext_len = len;// 完成解密操作if (1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleErrors();plaintext_len += len;// 清理上下文EVP_CIPHER_CTX_free(ctx);return plaintext_len;
}int main() {// 密钥和 IV 与加密时保持一致unsigned char key[AES_KEY_LENGTH] = "0123456789abcdef0123456789abcdef";unsigned char iv[AES_BLOCK_SIZE] = {0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f, 0x7a, 0x8b,0x9c, 0xad, 0xbe, 0xcf, 0xde, 0xef, 0xfa, 0x1b};unsigned char ciphertext[] = {0xae, 0xf5, 0x67, 0x89, /* ... 加密数据的字节数组 */};unsigned char decryptedtext[128];  // 缓冲区用于存储解密后的明文// 执行解密操作int decryptedtext_len = aes_decrypt(ciphertext, sizeof(ciphertext), key, iv, decryptedtext);// 添加字符串终止符decryptedtext[decryptedtext_len] = '\0';// 输出解密后的明文printf("Decrypted text: %s\n", decryptedtext);return 0;
}

代码说明:

  • 初始化解密上下文:使用 EVP_CIPHER_CTX_new() 创建解密上下文。
  • 设置解密算法和密钥:通过 EVP_DecryptInit_ex() 指定 AES-256-CBC 算法。
  • 解密数据EVP_DecryptUpdate() 用于处理密文的主要部分。
  • 完成解密EVP_DecryptFinal_ex() 处理最后的数据块,并将明文长度加到总长度中。
  • 输出解密结果:解密后的数据存储在 decryptedtext 中,作为原始的明文数据输出。

注意事项

  • 密钥和初始向量(IV)必须与加密时一致。
  • 输出的解密文本会和加密前的原始文本一致。

相关文章:

openssl对称加密代码讲解实战

文章目录 一、openssl对称加密和非对称加密算法对比1. 加密原理2. 常用算法3. 加密速度4. 安全性5. 应用场景6. 优缺点对比综合分析 二、代码实战代码说明&#xff1a;运行输出示例代码说明&#xff1a;注意事项 一、openssl对称加密和非对称加密算法对比 OpenSSL 是一个广泛使…...

web前端动画按钮(附源代码)

效果图 源代码 HTML部分 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> …...

go函数传值是值传递?还是引用传递?slice案例加图解

先说下结论 Go语言中所有的传参都是值传递&#xff08;传值&#xff09;&#xff0c;都是一个副本&#xff0c;一个拷贝。 值语义类型&#xff1a;参数传递的时候&#xff0c;就是值拷贝&#xff0c;这样就在函数中就无法修改原内容数据。 基本类型&#xff1a;byte、int、bool…...

PostgreSQL数据库笔记

PostgreSQL 是什么 PostgreSQL&#xff08;简称Postgres或PG&#xff09;是一个功能强大、可靠性高、可扩展性好的开源对象-关系数据库服务器&#xff08;ORDBMS&#xff09;&#xff0c;它以加州大学伯克利分校计算机系开发的POSTGRES版本4.2为基础。 发展历程 起源与发展&a…...

财务软件源码SaaS云财务

在如今的商业环境中&#xff0c;准确的财务管理是一家企业取得成功的关键。然而&#xff0c;传统的财务管理方法已经无法满足现代企业的需求&#xff0c;需要一个全新的解决方案。推出了全新的财务软件为您提供完美的解决方案。 选择财务软件源码&#xff0c;您将享受到以下优…...

Elasticsearch集群和Kibana部署流程

搭建Elasticsearch集群 1. 进入Elasticsearch官网下载页面&#xff0c;下载Elasticsearch 在如下页面选择Elasticsearch版本&#xff0c;点击download按钮&#xff0c;进入下载页面 右键选择自己操作系统对应的版本&#xff0c;复制下载链接 然后通过wget命令下载Elastics…...

丹摩征文活动 | 丹摩智算:大数据治理的智慧引擎与实践探索

丹摩DAMODEL&#xff5c;让AI开发更简单&#xff01;算力租赁上丹摩&#xff01; 目录 一、引言 二、大数据治理的挑战与重要性 &#xff08;一&#xff09;数据质量问题 &#xff08;二&#xff09;数据安全威胁 &#xff08;三&#xff09;数据管理复杂性 三、丹摩智算…...

【Django】Clickjacking点击劫持攻击实现和防御措施

Clickjacking点击劫持 1、clickjacking攻击2、clickjacking攻击场景 1、clickjacking攻击 clickjacking攻击又称为点击劫持攻击&#xff0c;是一种在网页中将恶意代码等隐藏在看似无害的内容&#xff08;如按钮&#xff09;之下&#xff0c;并诱使用户点击的手段。 2、clickj…...

Ansys Zemax | 手机镜头设计 - 第 4 部分:用LS-DYNA进行冲击性能分析

该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念和设计到制造和结构变形分析。本文是四部分系列中的第四部分&#xff0c;它涵盖了相机镜头的显式动态模拟&#xff0c;以及对光学性能的影响。使用Ansys Mechanical和LS-DYNA对相机在地板上的一系列冲击和弹跳过程…...

工具收集 - java-decompiler / jd-gui

工具收集 - java-decompiler / jd-gui 参考资料 用法&#xff1a;拖进来就行了 参考资料 https://github.com/java-decompiler/jd-gui 脚本之家&#xff1a;java反编译工具jd-gui使用详解...

《无线重构世界》射频模组演进

射频前端四大金刚 射频前端由PA、LNA、滤波器、开关“四大金刚” 不同的模块有自己的工艺和性能特点 分层设计 射频前端虽然只由PA、LNA、开关、混频器4个模块构成&#xff0c;但不同模块之间相互连接且相互影响。如果将射频系统当成一个整体来理解&#xff0c;其中的细节和…...

渗透测试---docker容器

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人一律不承担一切后果 目录 一、Docker的作用与优势 二、docker的核心…...

【go从零单排】Atomic Counters原子计数

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;原子计数器&#xff08;Atomic Counters&#xff09;是…...

VSCode中python插件安装后无法调试

问题 VSCode中python插件安装后无法调试&#xff0c;如下&#xff0c;点击调试&#xff0c;VScode中不报错&#xff0c;也没有调试 解决方法 1、查看配置 打开所在路径 2、拷贝 将整个文件夹拷贝到vscode默认路径下 3、问题解决 再次调试&#xff0c;可以正常使用了…...

用react实现radio同时关联proform组件

实现&#xff1a; <ProFormRadio.GroupradioType{button}name{[bodyConfig, format]}label"请求体格式"initialValue{json}options{createTabs}fieldProps{{buttonStyle: solid,wrapperMarginInlineEnd: 20,onChange: e > {let v e.target.value;databaseMod…...

Objective-C 1.0和2.0有什么区别?

Objective-C ObjC比较小众&#xff0c;在1980年左右由Stepstone公司的Brad Cox和Tom Love发明。后来NeXT公司获得ObjC语言使用权&#xff0c;再后来到1996年NeXT被苹果公司收购也变成苹果公司使用&#xff0c;Mac市场占有率本身就不高&#xff0c;ObjC没有太多程序员。在移动互…...

TCP连接如何保障数据传输安全

TCP连接保障数据传输安全主要通过以下几个机制实现&#xff1a; 1、建立连接&#xff1a;TCP通过三次握手过程建立连接&#xff0c;确保通信双方实体真实存在&#xff0c;为后续的可靠数据传输打下基础。 2、序号机制&#xff1a;TCP为每个传输的数据包分配一个序号&#xff…...

【论文复现】ChatGPT多模态命名实体识别

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ChatGPT ChatGPT辅助细化知识增强&#xff01;1. 研究背景2. 模型结构和代码3. 任务流程第一阶段&#xff1a;辅助精炼知识启发式生成第二阶段…...

管理 Elasticsearch 变得更容易了,非常容易!

作者&#xff1a;来自 Elastic Ken Exner Elasticsearch 用户&#xff0c;我们听到了你的心声。管理 Elasticsearch 有时会变得很复杂&#xff0c;面临的挑战包括性能调整、问题检测和资源优化。我们一直致力于简化你的体验。今天&#xff0c;我们宣布了自收购 Opster 以来的一…...

SynchronousQueueworkQueue.offer() 和 poll() 方法的超时控制及线程池的讨论

2024.11.12 11:26 问&#xff1a;workQueue.offer(command) 这里 workQueue.poll(keepAlive, TimeUnit.NANOSECONDS) : 这里的 workQueue.offer(command) 没有超时时间控制&#xff1f; Claude 3.5 Haiku 非常好的问题&#xff01;我来详细解释 offer() 和 poll() 方法的区别…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...