ubuntu环境下openssl库的简单使用

news/2024/10/11 16:41:08/

安装

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键导入