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加解密相关推荐

  1. aes 256 ecb 加解密 pkcs7补全 python JS

    python aes 256 ecb 加解密 功能 实现 Python ECB 256 JS版本 ECB 算法 JS版本 CBC 算法Pkcs7填充 SQL AES 在线验证网站 notice 功能 ...

  2. Go Nodejs Java Aes 128 ECB加密解密结果保持一致

    在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性.下面列出了Go,Nodejs,Java 的 Aes-128-Ecb的加密解密算法 ...

  3. aes加密算法python语言实现_如何用Python实现AES CCM的加解密

    1.简介 AES CCM被广泛应用于现代通讯中,在学习过程中需要验证数据的加解密的结果,那么有个方便修改的Python脚本工具就是一个迫切的需求. 2. 实施 我们下面介绍如何实现AES CCM的Py ...

  4. python实现AES对文件加解密(这里使用ECB密码本模式)

    文章目录 1.加密 2.解密 pip install pycryptodome 请注意加解密成功的前提条件 加解密密匙key值相同 加解密密匙长度相同 加解密补长度的逻辑相同 加解密的模式相同 1.加 ...

  5. RSA+AES数字信封加解密设计

    登录认证.鉴权这些都做好了过后.就开始我们的加密设计了.这里采用了简化数字信封进行加密.首先客户端(浏览器)先请求一份RSA非对称密钥.如果我们采用了openresty或者有能力在nginx开发C模块 ...

  6. LKT系列加密芯片DES加解密以及OpenSSL DES接口实现加解密

    1.测试目标 使用已经预置DES密钥的LKT4201N系列加密芯片完成运算 2.测试环境 本示例运行环境为windows系统.测试软件LCS KIT.LKT-K100开发板. 3.测试步骤 注意:&q ...

  7. JavaIO流加解密,AES对字符串加解密

    加解密文件? 哈哈哈哈,当然是为了安全,自己的东西不像让别人看见. 1,学了JavaIO流的字节流的读取写入,便可实现. 加密原理: 把文件读取,然后,按某个特定的规则改变其字节写入一个新文件. 解密 ...

  8. Java实现Base64、DES、AES、RSA加解密以及加密方式之间的区别

    Base64 加密, 这个其实不可以算作加密方法,它可以看作是一种编码方式,它的用途只是二进制数字和字符串进行相互转化. Base64是网络上最常见的用于传输 8Bit字节码的编码方式之一,是一种基于 ...

  9. c语言实现的异或加解密,C语言实现视频异或加/解密

    C语言实现异或加/解密的原理 异或原理很简单,异或一次为加密,再异或一次就成了解密了.看下代码 /** * 加密/解密文件 * *@param sourcefile 要加密/解密的文件名 *@para ...

  10. C语言实现简单的RSA加解密算法

    使用c语言实现了简单的RSA加解密算法. 实验内容: 1.输入两个素数,然后生成一个随机数,计算出随机数的逆元,然后保存这些信息: 2.选择加密,则输入明文,输出密文: 3.选择解密,则输入密钥,输出 ...

最新文章

  1. wamp解决ajax跨域问题
  2. [转]将Ubuntu默认的邮件客户端Evolution替换为Thunderbird
  3. 如何接地气地接入微前端?
  4. deepin 使用cuda硬件解码
  5. nested set model应用系列文章-基于后根跳跃遍历的规则匹配算法
  6. Norton ConnectSafe,DNS策略防止误入钓鱼网站(Norton Security)
  7. 正在更新office,应用程序无法正常启动
  8. 洛谷 P2525 Uim的情人节礼物·其之壱
  9. sql2000 数据库置疑解决办法
  10. xor命令,运算优先级,Matlab计算规则(从左至右),舍入误差,取整函数、求余函数和符号函数,mod和rem的区别
  11. 学生用计算机的使用技巧,选学生笔记本电脑的小窍门
  12. Python多维数组,已知多科成绩求英语成绩最高的学生名
  13. STM32MP157开发笔记 | 04 - TF-A、uboot、linux内核源码获取、编译、烧写
  14. Zookeeper用作注册中心的原理
  15. 【美图】从字符串 com.meitu/mtxx/6.8.0(ios10.2)/lang:zh 中取出6.8.0
  16. JAVA练习题——判断题
  17. Android 一个像素几个字节,android 像素单位的一系列疑问困扰
  18. 简易五子棋(包含开始、双人对战、简易AI、悔棋、认输、判断输赢)不含禁手
  19. Android基于环信开发的即时通讯APP
  20. 开源告警工具Prometheusalert

热门文章

  1. 俄亥俄州立大学计算机专业排名,俄亥俄州立大学CS专业排名2020年
  2. 模拟电路学习-之电容,电感重新认识
  3. win10投影到此电脑显示灰色解决办法
  4. 系统管理员设置了系统策略,禁止进行此安装。解决方案
  5. think python 第9章 case study:word play
  6. 自定义CKeditor上传图片按钮
  7. della计算机驱动检测,Installazione dei driver della stampante per una versione precedente di Windows...
  8. Pytorch使用预训练模型进行图像分类
  9. 绝了!你裁我剪,斯尼帕!文末源码
  10. Linux 内核文件系统模块结构体关系图