C语言openssl aes-128-ecb加解密
openssl aes-128-ecb方式对密码进行md5后的加解密
openssl版本:1.0.2g 其他的自行验证
编译:gcc aes_128_ecb.c -o aes_128_ecb -lssl -lcrypto
执行结果:
./aes_128_ecb
passwd: 12345
strMd516: A46B755EA8F1B4DD
strBase64Encrypt: cFeeVowosk4cR5gIg7i6ZQ==
aes_128_ecb_decrypt OK
strAESDecrypt passwd is: 12345
/*********************************************
** aes_128_ecb.c
** encrypte decrypt the password
*********************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/md5.h>int aes_128_ecb_encrypt(char *in, char *key, char *out) {int ret = 0, len = 0, len1 = 0, len2 = 0;unsigned char *result = NULL;EVP_CIPHER_CTX *ctx;ctx = EVP_CIPHER_CTX_new();ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, (const unsigned char*)key, NULL);if (ret != 1) {printf("EVP_EncryptInit_ex error\n");EVP_CIPHER_CTX_free(ctx);return 0;}result = (unsigned char *)malloc(AES_BLOCK_SIZE*64);ret = EVP_EncryptUpdate(ctx, result, &len1, (const unsigned char*)in, strlen(in));if (ret != 1) {printf("EVP_EncryptUpdate error\n");EVP_CIPHER_CTX_free(ctx);free(result);return 0;}ret = EVP_EncryptFinal_ex(ctx, result + len1, &len2);if (ret != 1) {printf("EVP_EncryptFinal_ex error\n");EVP_CIPHER_CTX_free(ctx);free(result);return 0;}while (len < (len1+len2)) {out[len] = result[len];len++;}EVP_CIPHER_CTX_free(ctx);free(result);return (len1+len2);
}
int aes_128_ecb_decrypt(char *in, char *key, char *out) {int ret = 0, len = 0, len1 = 0, len2 = 0;unsigned char *result = NULL;EVP_CIPHER_CTX *ctx;ctx = EVP_CIPHER_CTX_new();ret = EVP_DecryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, (const unsigned char*)key, NULL);if (ret != 1) {printf("EVP_DecryptInit_ex error\n");EVP_CIPHER_CTX_free(ctx);return 0;}result = (unsigned char *)malloc(AES_BLOCK_SIZE*64);ret = EVP_DecryptUpdate(ctx, result, &len1, (const unsigned char*)in,get_str_len(in));//不可使用strlen求取,字符串中可能含有结束符等if (ret != 1) {printf("EVP_DecryptUpdate error\n");EVP_CIPHER_CTX_free(ctx);free(result);return 0;}ret = EVP_DecryptFinal_ex(ctx, result + len1, &len2);if (ret != 1) {printf("EVP_DecryptFinal_ex error\n");EVP_CIPHER_CTX_free(ctx);free(result);return 0;}while (len < (len1+len2)) {out[len] = result[len];len++;}EVP_CIPHER_CTX_free(ctx);free(result);return 1;
} // base64 编码
char *base64_encode(const char *buffer, int length) {BIO *bmem = NULL;BIO *b64 = NULL;BUF_MEM *bptr;char *buff = NULL;b64 = BIO_new(BIO_f_base64());BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);bmem = BIO_new(BIO_s_mem());b64 = BIO_push(b64, bmem);BIO_write(b64, buffer, length);BIO_flush(b64);BIO_get_mem_ptr(b64, &bptr);BIO_set_close(b64, BIO_NOCLOSE);buff = (char *)malloc(bptr->length + 1);memcpy(buff, bptr->data, bptr->length);buff[bptr->length] = 0;BIO_free_all(b64);return buff;
}// base64 解码
char *base64_decode(char *input, int length) {BIO *b64 = NULL;BIO *bmem = NULL;char *buffer = NULL;buffer = (char *)malloc(length);memset(buffer, 0, length);b64 = BIO_new(BIO_f_base64());BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);bmem = BIO_new_mem_buf(input, length);bmem = BIO_push(b64, bmem);BIO_read(bmem, buffer, length);BIO_free_all(bmem);return buffer;
}int md5_16(const char *src, char *out) {unsigned char c[MD5_DIGEST_LENGTH];int i = 0;MD5_CTX ctx;MD5_Init(&ctx);MD5_Update(&ctx, src, strlen(src));MD5_Final(c, &ctx);for (i = 0; i < MD5_DIGEST_LENGTH / 2; i++) {sprintf(out+i*2, "%02X", c[i+4]);}return 1;
}int get_str_len(const char *in) {int num = 0;if(in == NULL) {return 0;}while (!((*(in + num) == NULL) && (*(in + num + 1) == NULL) \&& (*(in + num + 2) == NULL) && (*(in + num + 3) == NULL) \&& (*(in + num + 4) == NULL)&& (*(in + num + 5) == NULL) \&& (*(in + num + 6) == NULL)&& (*(in + num + 7) == NULL))) {num++;}return num;
}int main(int argc, char const *argv[])
{char strAESEncrypt[1024] = {0}, strAESDecrypt[1024] = {0}, *strBase64Encrypt = NULL, *pStrBase64Decrypt = NULL, strMd516[17] = {0};int nAESEncryptLen = 0;char strKey[128] = "0123456789ABCDEF";char *passwd = "12345";md5_16(strKey, strMd516);printf("passwd: %s\n", passwd);printf("strMd516: %s\n", strMd516);// 加密部分nAESEncryptLen = aes_128_ecb_encrypt(passwd, strMd516, strAESEncrypt);strBase64Encrypt = base64_encode(strAESEncrypt, nAESEncryptLen);printf("strBase64Encrypt: %s\n", strBase64Encrypt);// 解密部分pStrBase64Decrypt = base64_decode(strBase64Encrypt, strlen(strBase64Encrypt));if (aes_128_ecb_decrypt(pStrBase64Decrypt, strMd516, strAESDecrypt) == 1) {printf("aes_128_ecb_decrypt OK\n");printf("strAESDecrypt passwd is: %s\n", strAESDecrypt);}return 0;
}
C语言openssl aes-128-ecb加解密相关推荐
- aes 256 ecb 加解密 pkcs7补全 python JS
python aes 256 ecb 加解密 功能 实现 Python ECB 256 JS版本 ECB 算法 JS版本 CBC 算法Pkcs7填充 SQL AES 在线验证网站 notice 功能 ...
- Go Nodejs Java Aes 128 ECB加密解密结果保持一致
在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性.下面列出了Go,Nodejs,Java 的 Aes-128-Ecb的加密解密算法 ...
- aes加密算法python语言实现_如何用Python实现AES CCM的加解密
1.简介 AES CCM被广泛应用于现代通讯中,在学习过程中需要验证数据的加解密的结果,那么有个方便修改的Python脚本工具就是一个迫切的需求. 2. 实施 我们下面介绍如何实现AES CCM的Py ...
- python实现AES对文件加解密(这里使用ECB密码本模式)
文章目录 1.加密 2.解密 pip install pycryptodome 请注意加解密成功的前提条件 加解密密匙key值相同 加解密密匙长度相同 加解密补长度的逻辑相同 加解密的模式相同 1.加 ...
- RSA+AES数字信封加解密设计
登录认证.鉴权这些都做好了过后.就开始我们的加密设计了.这里采用了简化数字信封进行加密.首先客户端(浏览器)先请求一份RSA非对称密钥.如果我们采用了openresty或者有能力在nginx开发C模块 ...
- LKT系列加密芯片DES加解密以及OpenSSL DES接口实现加解密
1.测试目标 使用已经预置DES密钥的LKT4201N系列加密芯片完成运算 2.测试环境 本示例运行环境为windows系统.测试软件LCS KIT.LKT-K100开发板. 3.测试步骤 注意:&q ...
- JavaIO流加解密,AES对字符串加解密
加解密文件? 哈哈哈哈,当然是为了安全,自己的东西不像让别人看见. 1,学了JavaIO流的字节流的读取写入,便可实现. 加密原理: 把文件读取,然后,按某个特定的规则改变其字节写入一个新文件. 解密 ...
- Java实现Base64、DES、AES、RSA加解密以及加密方式之间的区别
Base64 加密, 这个其实不可以算作加密方法,它可以看作是一种编码方式,它的用途只是二进制数字和字符串进行相互转化. Base64是网络上最常见的用于传输 8Bit字节码的编码方式之一,是一种基于 ...
- c语言实现的异或加解密,C语言实现视频异或加/解密
C语言实现异或加/解密的原理 异或原理很简单,异或一次为加密,再异或一次就成了解密了.看下代码 /** * 加密/解密文件 * *@param sourcefile 要加密/解密的文件名 *@para ...
- C语言实现简单的RSA加解密算法
使用c语言实现了简单的RSA加解密算法. 实验内容: 1.输入两个素数,然后生成一个随机数,计算出随机数的逆元,然后保存这些信息: 2.选择加密,则输入明文,输出密文: 3.选择解密,则输入密钥,输出 ...
最新文章
- wamp解决ajax跨域问题
- [转]将Ubuntu默认的邮件客户端Evolution替换为Thunderbird
- 如何接地气地接入微前端?
- deepin 使用cuda硬件解码
- nested set model应用系列文章-基于后根跳跃遍历的规则匹配算法
- Norton ConnectSafe,DNS策略防止误入钓鱼网站(Norton Security)
- 正在更新office,应用程序无法正常启动
- 洛谷 P2525 Uim的情人节礼物·其之壱
- sql2000 数据库置疑解决办法
- xor命令,运算优先级,Matlab计算规则(从左至右),舍入误差,取整函数、求余函数和符号函数,mod和rem的区别
- 学生用计算机的使用技巧,选学生笔记本电脑的小窍门
- Python多维数组,已知多科成绩求英语成绩最高的学生名
- STM32MP157开发笔记 | 04 - TF-A、uboot、linux内核源码获取、编译、烧写
- Zookeeper用作注册中心的原理
- 【美图】从字符串 com.meitu/mtxx/6.8.0(ios10.2)/lang:zh 中取出6.8.0
- JAVA练习题——判断题
- Android 一个像素几个字节,android 像素单位的一系列疑问困扰
- 简易五子棋(包含开始、双人对战、简易AI、悔棋、认输、判断输赢)不含禁手
- Android基于环信开发的即时通讯APP
- 开源告警工具Prometheusalert
热门文章
- 俄亥俄州立大学计算机专业排名,俄亥俄州立大学CS专业排名2020年
- 模拟电路学习-之电容,电感重新认识
- win10投影到此电脑显示灰色解决办法
- 系统管理员设置了系统策略,禁止进行此安装。解决方案
- think python 第9章 case study:word play
- 自定义CKeditor上传图片按钮
- della计算机驱动检测,Installazione dei driver della stampante per una versione precedente di Windows...
- Pytorch使用预训练模型进行图像分类
- 绝了!你裁我剪,斯尼帕!文末源码
- Linux 内核文件系统模块结构体关系图