当前位置: 首页 > 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() 方法的区别…...

自动驾驶---“火热的”时空联合规划

1 背景 早期的不少规划算法都是横纵分离的(比如Apollo),先求解path之后,依赖path的结果再进行speed的求解。这种横纵解耦的规划方式具有以下特点: 相对较为简单,计算量通常较小,容易实现实时性要求。但是由于分别规划横向和纵向运动,可能会忽略两者之间的耦合关系,导致…...

命令行工具进阶指南

&#x1f680; 命令行工具进阶指南&#xff1a;Git、Shell与效率工具的进阶之路 掌握命令行工具&#xff0c;让你的开发效率突飞猛进。本文将深入探讨 Git 高级技巧、Shell 脚本自动化以及各种效率倍增的 CLI 工具。 &#x1f4d1; 目录 Git 高级技巧与工作流Shell 脚本自动化…...

扫雷游戏代码分享(c基础)

hi , I am 36. 代码来之不易&#x1f44d;&#x1f44d;&#x1f44d; 创建两个.c 一个.h 1&#xff1a;test.c #include"game.h"void game() {//创建数组char mine[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };char temp[ROWS][COLS] { 0 };//初始化数…...

基于vue框架的的社区居民服务管理系统8w86o(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;居民,楼房信息,报修信息,缴费信息,维修进度 开题报告内容 基于Vue框架的社区居民服务管理系统开题报告 一、研究背景与意义 随着城市化进程的加速&#xff0c;社区居民数量激增&#xff0c;社区管理面临着前所未有的挑战。传统的社区…...

一分钟快速熟悉makedown

Markdown 是一种轻量级标记语言&#xff0c;广泛用于编写文档、撰写博客、创建 README 文件等。它的语法简单易学&#xff0c;能够快速生成格式化的文本。以下是 Markdown 的一些常用语法和示例&#xff1a; 1. 标题 Markdown 支持六级标题&#xff0c;使用 # 符号表示。 # …...

P8649 [蓝桥杯 2017 省 B] k 倍区间:同余,前缀和,组合数,区间个数

题目描述 给定一个长度为 NN 的数列&#xff0c;A1,A2,⋯ANA1​,A2​,⋯AN​&#xff0c;如果其中一段连续的子序列 Ai,Ai1,⋯Aj(i≤j)Ai​,Ai1​,⋯Aj​(i≤j) 之和是 KK 的倍数&#xff0c;我们就称这个区间 [i,j][i,j] 是 KK 倍区间。 你能求出数列中总共有多少个 KK 倍区…...

产业与学术相互促进,2024年OEG海上能源博览会助力全球能源可持续发展

10月30日至31日&#xff0c;2024年OEG海上能源全产业链博览会在上海跨国采购会展中心成功举办。本次大会系全球海洋工程与高端装备领域的年度国际交流盛会——第十一届全球FPSO&FLNG&FSRU大会&#xff0c;同期举办第七届亚洲海洋风能大会。本次大会暨博览会由上海船舶工…...

【GDB调试】智慧中控项目的调试

一.在执行的智慧中控项目的时候&#xff0c;喊语音模块唤醒(小欣小欣)的时候遇到了&#xff1a;Segmentation fault 段错误 二.遇到段错误&#xff0c;一般是以下情况&#xff1a; “Segmentation fault”&#xff08;段错误&#xff09;是Linux系统中常见的程序异常终止信号。…...

《一本书讲透 Elasticsearch》京东评论采集+存储+可视化全 AI 实现

经常和出版社编辑老师交流读者的反馈。毕竟是小众书籍&#xff0c;豆瓣评分的人并不多。 而京东作为主要读书销售渠道&#xff0c;非常有必要整合一下京东读者评论&#xff0c;看看读者们都说了什么&#xff0c;以便后续的改进&#xff01; 一条条的翻看非常不方便&#xff0c;…...

uniapp中webview全屏不显示导航栏解决方案

uniapp官网文档地址&#xff1a;https://uniapp.dcloud.net.cn/api/window/window.html#getappwebview <template><view class"index"><u-navbar :is-back"true" title"标题"" :title-width"650"></u-navb…...

做视频上传多少个网站/360营销平台

Context context EditUserInfoTabActivity.this; /** R.style.edit_AlertDialog_style 是我们重新定义的系统自带Dialog的样式*/ Dialog dia new Dialog(context,R.style.edit_AlertDialog_style); /** R.layout.manage_username_dialog是一个XML布局文件*/ dia.setContentVi…...

雍鑫建设集团官方网站/中国最大网站排名

题意及分析 给你一个日期&#xff0c;请你设计一个算法来判断它是对应一周中的哪一天 方法一 蔡勒公式 蔡勒公式我想有不少同学都了解过&#xff0c;一般刚学编程时候会介绍这个公式&#xff0c;但应该没有人专门背下来。这里做个记录&#xff1b; 其中&#xff1a; c 是世…...

2014个人网站备案/百度下载app下载安装

万拓单控存储DS1200是万拓推出的新一代基于Intel高性能服务器平台推出的12盘位存储产品&#xff0c;凭借面向云架构的存储操作系统、强大的新一代硬件平台和丰富的智能管理软件,采用WEB GUI管理界面&#xff0c;应用大容量写入缓存、掉电零数据丢失的缓存保护技术和优化的高可靠…...

同城做推广哪个网站好/谷歌seo网络公司

平时我们如果要用到委托一般都是先声明一个委托类型&#xff0c;比如&#xff1a; private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型&#xff0c;委托名Say后面没有参数&#xff0c;说明对应的方法也就没有传入参数。 写一个适用于该委托…...

网站二次开发费用/中国seo公司

闲话不说&#xff0c;上问题&#xff1a;一个很大的php数组(1w)&#xff0c;使用array_shfit跟array_pop取数组元素时&#xff0c;性能差距特别大&#xff0c;array_shift慢的无法忍受&#xff0c;而array_pop就很快了。先不说答案&#xff0c;看段代码&#xff1a;$arr array…...

龙岗网站建设/百度搜索资源平台

为什么80%的码农都做不了架构师&#xff1f;>>> 本文为大家讲解的是如何在centos下使用yum 安装percona xtrabackup 的方法&#xff0c;感兴趣的同学参考下。 Xtrabackup简介 Xtrabackup是一个对InnoDB做数据备份的工具&#xff0c;支持在线热备份&#xff08;…...