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. svn 第一次使用注意事项
  2. 他是阿里中台之父,从一线员工做到CTO:有商业意识的技术人,才有未来!
  3. if...else 小练习
  4. 【数据结构与算法】之N个数中有K个数可能的组合算法
  5. 【翻译】从Store生成Checkbox Group
  6. 解决CentOS 中部署JasperReport时出错的问题。错误:net.sf.jasperreports.engine.util.JRFontNotFoundException: Font '宋体
  7. window.onload=function(){};
  8. python控制ppt定时_python中使用requests实现自动回帖.ppt
  9. java基础知识补漏(1)---内部类,重写、重载
  10. DRF的@action装饰器
  11. windows。forms.timer设置第一次不等待_混凝土密封固化剂个人简易施工方案(不打磨)...
  12. Codeforces Round #383 Div 1题解
  13. 计算机啊如何进入代码编写界面,一段程序代码写完以后是如何转换成有操作界面的软件的?...
  14. HFSS - 半波偶极子天线的设计与仿真
  15. HaaS506-HD1本地更新固件教程
  16. UltraISO制作U盘系统盘安装CentOS经验分享
  17. Android图片无损缩放,Android图片查看器(图片可挪动、缩放)
  18. 基于qiankun.js的微前端应用实战
  19. RN 技术探索:Hermes Engine 初探
  20. 我的世界java邮箱和密码_java实现邮箱找密码

热门文章

  1. CF1503D Flip the Cards(思维题)
  2. android工具类
  3. 炼油厂将abc三种原油 matlab求解,某工厂制造三种产品A、B和C需要两种资源(劳动力和原材料),目标是要确定总利润最大的最优生产计划。列出的线性...
  4. 公里与英里的换算c语言函数_80迈=80迈=80公里?过年了许多开车回家的老司机都未必清楚!...
  5. 安卓模拟器打开开发者选项
  6. excel计算加权平均方法
  7. 微信小程序——云开发的安全规则
  8. oracle查询语句大全
  9. sqlserver中,sql语句,按照汉字拼音首字母排序
  10. xcpc网络赛个人总结(文笔不好,纯纯记录)