ubuntu环境下openssl库的简单使用

news/2024/4/16 2:55:30

安装

sudo apt-get install libssl-dev

aes算法demo

编译:gcc aes.c -lssl -lcrypto -o aes
运行:./aes

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/aes.h>#define AES_KEY_SIZE 128 // AES密钥长度
#define AES_BLOCK_SIZE 16 // AES分块大小// 加密函数
void aes_encrypt(const unsigned char *plaintext, unsigned char *ciphertext, const unsigned char *key) 
{AES_KEY aes_key;AES_set_encrypt_key(key, AES_KEY_SIZE, &aes_key);AES_encrypt(plaintext, ciphertext, &aes_key);
}// 解密函数
void aes_decrypt(const unsigned char *ciphertext, unsigned char *plaintext, const unsigned char *key)
{AES_KEY aes_key;AES_set_decrypt_key(key, AES_KEY_SIZE, &aes_key);AES_decrypt(ciphertext, plaintext, &aes_key);
}int main(int argc, char **argv) 
{// 明文密码const char *plaintext_password = "my_password";size_t plaintext_password_len = strlen(plaintext_password);// AES密钥const unsigned char aes_key[] = { 0x7b, 0xf3, 0x5c, 0xd6, 0x9c, 0x47, 0x5d, 0x5e, 0x6f, 0x1d, 0x7a, 0x23, 0x18, 0x7b, 0xf9, 0x34 };// 分配加密后的密文空间size_t ciphertext_password_len = ((plaintext_password_len + AES_BLOCK_SIZE - 1) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;unsigned char *ciphertext_password = malloc(ciphertext_password_len);// 对明文密码进行AES加密aes_encrypt((const unsigned char *)plaintext_password, ciphertext_password, aes_key);// 输出加密后的密码printf("加密后的密码:");for (size_t i = 0; i < ciphertext_password_len; i++) {printf("%02x", ciphertext_password[i]);}printf("\n");// 分配解密后的明文空间unsigned char *decrypted_password = malloc(plaintext_password_len);// 对密文密码进行AES解密aes_decrypt(ciphertext_password, decrypted_password, aes_key);// 输出解密后的密码printf("解密后的密码:%s\n", decrypted_password);// 释放空间free(ciphertext_password);free(decrypted_password); return 0;
}

des算法demo

编译:gcc des.c -lssl -lcrypto des
运行:./des

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/des.h>int main(int argc,char **argv)
{DES_cblock key;//随机密钥DES_random_key(&key);DES_key_schedule schedule;//转换成scheduleDES_set_key_checked(&key, &schedule);const_DES_cblock input = "hehehe";DES_cblock output;printf("cleartext: %s\n", input);//加密DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT);printf("Encrypted!\n");printf("ciphertext: ");int i;for (i = 0; i < sizeof(input); i++)printf("%02x", output[i]);printf("\n");//解密DES_ecb_encrypt(&output, &input, &schedule, DES_DECRYPT);printf("Decrypted!\n");printf("cleartext:%s\n", input);return 0;
}

sm1算法demo


ssf33算法demo


sm4算法demo

编译:gcc sm4.c -lssl -lcrypto -o sm4
运行:./sm4

#include <openssl/evp.h>
#include <openssl/rand.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 加密函数
void encryptSM4(const unsigned char *plaintext, int plaintextLength, const unsigned char *key, unsigned char *ciphertext, int *ciphertextLength) {EVP_CIPHER_CTX *ctx;int len;// 创建并初始化上下文ctx = EVP_CIPHER_CTX_new();EVP_EncryptInit_ex(ctx, EVP_sm4_ecb(), NULL, key, NULL);// 加密数据EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintextLength);*ciphertextLength = len;// 结束加密过程EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);*ciphertextLength += len;// 释放上下文EVP_CIPHER_CTX_free(ctx);
}// 解密函数
void decryptSM4(const unsigned char *ciphertext, int ciphertextLength, const unsigned char *key, unsigned char *plaintext, int *plaintextLength) {EVP_CIPHER_CTX *ctx;int len;// 创建并初始化上下文ctx = EVP_CIPHER_CTX_new();EVP_DecryptInit_ex(ctx, EVP_sm4_ecb(), NULL, key, NULL);// 解密数据EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertextLength);*plaintextLength = len;// 结束解密过程EVP_DecryptFinal_ex(ctx, plaintext + len, &len);*plaintextLength += len;// 释放上下文EVP_CIPHER_CTX_free(ctx);
}int main(int argc, char **argv)
{const unsigned char plaintext[] = "Hello, SM4!"; // 明文const unsigned char key[] = "0123456789abcdef"; // 128位密钥unsigned char ciphertext[256];unsigned char decryptedText[256];int ciphertextLength = 0;int decryptedLength = 0;// 加密encryptSM4(plaintext, sizeof(plaintext) - 1, key, ciphertext, &ciphertextLength);// 打印密文printf("%s", "Ciphertext:");for (int i = 0; i < ciphertextLength; ++i) {printf("%02x", ciphertext[i]);}printf("\n");// 解密decryptSM4(ciphertext, ciphertextLength, key, decryptedText, &decryptedLength);// 打印解密后的明文printf("%s\n", decryptedText);return 0;
}

sm6算法demo



http://www.ppmy.cn/news/1364155.html

相关文章

[云原生] 二进制安装K8S(中)部署网络插件和DNS

书接上文&#xff0c;我们继续部署剩余的插件 一、K8s的CNI网络插件模式 2.1 k8s的三种网络模式 K8S 中 Pod 网络通信&#xff1a; &#xff08;1&#xff09;Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享…

【Node.js】自动生成 API 文档

目录 1、直接使用swagger-ui-express 2、配合swagger-jsdoc 如何在Node.js项目中使用 Swagger 来自动生成 API接口文档&#xff0c;使用生成方式有很多种。本文基于swagger-jsdocswagger-ui-express快速实现 1、直接使用swagger-ui-express // 方便来浏览和测试api npm i sw…

Linux 文件权限详细教程

目录 前言 查看文件权限 修改文件权限 符号方式 数字方式 前言 Linux 文件权限是系统中非常重要的概念之一&#xff0c;用于控制对文件和目录的访问。权限分为读&#xff08;Read&#xff09;、写&#xff08;Write&#xff09;、执行&#xff08;Execute&#xff09;三个…

【Spring连载】使用Spring Data访问 MongoDB----Aggregation Framework支持

【Spring连载】使用Spring Data访问 MongoDB----聚合框架支持 一、基础槪念二、投影表达式Projection Expressions三、分面分类法Faceted Classification3.1 桶Buckets3.2 多方面的聚合Multi-faceted Aggregation3.3 按计数排序Sort By Count3.4 投影表达式中的Spring表达式支持…

笔记本hp6930p安装Android-x86避坑日记

一、序言 农历癸卯年前大扫除&#xff0c;翻出老机hp6930p&#xff0c;闲来无事&#xff0c;便安装Android-x86玩玩&#xff0c;期间多次入坑&#xff0c;随手记之以避坑。 笔记本配置&#xff1a;T9600,4G内存&#xff0c;120G固态160G机械硬盘 二、Android-x86系统简介 官…

18 SpringMVC实战

18 SpringMVC实战 1. 课程介绍2. Spring Task定时任务1. 课程介绍 2. Spring Task定时任务 package com.imooc.reader.task

java反射高级用列(脱敏+aop)

ClassUtils 、FieldUtils、MethodUtils、ReflectionUtils高级 List<String> list = new ArrayList<>(); Class<?> userClass = ClassUtils.getUserClass(list.getClass()); System.out.println(Collection.class.isAssignableFrom(userClass)); Class<?…

Visual Studio Code(VSCode)软件相关(安装、用法、工具等)

1. MacOS使用code .命令行快速打开VScode https://blog.csdn.net/weixin_45345234/article/details/135072918 2. vscode 提示编写代码导入 使用TAB键导入

element-ui中el-scrollbar 滚动到底部

控制el-scrollbar内滚动条的方法与控制页面的滚动条的方法基本一样&#xff0c;只是获取el-scrollbar节点的滚动条时&#xff0c;需使用 refs.scrollMenuRef.wrap /*el-scrollbar 必须指定高度*/ <el-scrollbar refscrollMenuRes stylewidth:100%;height:200px; wrap-style&…

数据仓库和数据湖的区别

数据仓库和数据湖是两种不同的数据存储和管理架构&#xff0c;它们有以下区别&#xff1a; 1.数据结构&#xff1a;数据仓库采用结构化的数据模型&#xff0c;通常是规范化的关系型数据库&#xff0c;其中数据以表格形式组织&#xff0c;使用预定义的模式和架构。而数据湖则是…

kubectl 命令行管理K8S(上)

目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 应用发布策略 金丝雀发布 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源…

Kafka集群详解

Kafka集群的目标 1、高并发 2、高可用&#xff08;防数据丢失&#xff09; 3、动态伸缩 Kafka集群规模如何预估 吞吐量&#xff1a; 集群可以提高处理请求的能力。单个Broker的性能不足&#xff0c;可以通过扩展broker来解决。 磁盘空间&#xff1a; 比如&#xff0c;如…

SQL Server添加用户登录

我们可以模拟一下让这个数据库可以给其它人使用 1、在计算机中添加一个新用户TeacherWang 2、在Sql Server中添加该计算机用户的登录权限 exec sp_grantlogin LAPTOP-61GDB2Q7\TeacherWang -- 之后这个计算机用户也可以登录数据库了 3、添加数据库的登录用户和密码&#xff0…

2024.2.26

今天又复习了一下熟悉的C语言 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<windows.h>int main() {//数组初始化int n;scanf("%d", &n);int array[500];int i 0;for (i 0; i < n; i){scanf("%…

Android 9.0 recovery页面旋转180度问题的解决方案

1.前言 在9.0的系统rom定制化开发工作中,在系统中recovery的页面也是相关重要的一部分,在系统recovery ota升级等功能,都是需要recovery功能的,在某些产品定制化中 在recovery的时候,发现居然旋转了180度,接下来分析下recovery关于屏幕显示方向的相关源码,来修改这个功…

【Unity自制手册】Unity—Camera相机跟随的方法大全

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

為什麼使用海外動態代理IP進行網路爬蟲?

網路爬蟲作為獲取網路數據的重要工具&#xff0c;其重要性不言而喻。但隨著網站反爬策略的日益嚴格&#xff0c;爬蟲任務變得愈發困難&#xff0c;不過海外動態代理IP可以很好地解決這一問題。本文將詳細闡釋動態代理IP在爬蟲中的應用&#xff0c;以及如何使用動態代理IP提升爬…

嵌入式系统在物联网中的应用与发展趋势

嵌入式系统在物联网中的应用与发展趋势 嵌入式系统在物联网中扮演着至关重要的角色&#xff0c;它们是连接物理世界和数字世界的桥梁&#xff0c;实现了物体之间的互联互通。以下是嵌入式系统在物联网中的应用与发展趋势的几个方面&#xff1a; 1. 应用领域 智能家居&#x…

Linux系统部署前后端分离项目

一、Nginx简介 1.1 什么是nginx? Nginx&#xff08;发音同"engine x"&#xff09;是一个高性能的反向代理和 Web 服务器软件&#xff0c;最初是由俄罗斯人 Igor Sysoev 开发的。Nginx 的第一个版本发布于 2004 年&#xff0c;其源代码基于双条款 BSD 许可证发布&am…

【UnityShader入门精要学习笔记】第六章(1)Unity中的基础光照

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 光照的原理光源吸收和散射着…
最新文章