OpenSSL aes加解密实例+base64编解码
OpenSSL aes加解密简单实例+base64编解码
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <openssl/aes.h>
#include <stdlib.h> #define AES_BLOCK_SIZE 16
#define BUF_SIZE 1024
#define CRYPT_USER_KEY "d1ea806ec3c35643" static const unsigned char en_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static unsigned char de_table[] = {}; static void init_de_table()
{
if (de_table[] != ) {
return;
}
memset(de_table, 0xff, sizeof(de_table));
const unsigned char* p;
for (p = en_table; *p != ; p++) {
de_table[*p] = p - en_table;
}
de_table['='] = ;
} int get_encode_len(int len)
{
return (((len/ + (len%== ? :)) * ) + );
} int get_decode_len(int len)
{
return ((len/)* + );
} // base64 编码
int base64_encode(const unsigned char* data, int data_len, char* dst, int dst_len)
{
if (data == NULL || data_len == || dst == NULL || dst_len == ) {
return -;
} if (dst_len < get_encode_len(data_len)) {
return -;
} int mod_len = data_len%; char* dst_tmp = dst; int pos = ;
for (pos = ; pos+ < data_len; pos+=) {
*(dst_tmp++) = en_table[data[pos] >> ];
*(dst_tmp++) = en_table[((data[pos] & 0x03) << ) | (data[pos+] >> )];
*(dst_tmp++) = en_table[((data[pos+] & 0x0f) << ) | (data[pos+] >> )];
*(dst_tmp++) = en_table[data[pos+] & 0x3f];
} if (mod_len == ) {
*(dst_tmp++) = en_table[data[pos] >> ];
*(dst_tmp++) = en_table[((data[pos] & 0x03) << ) | (data[pos+] >> )];
*(dst_tmp++) = en_table[((data[pos+] & 0x0f) << )];
*(dst_tmp++) = '=';
}
else if (mod_len == ) {
*(dst_tmp++) = en_table[data[pos] >> ];
*(dst_tmp++) = en_table[((data[pos] & 0x03) << )];
*(dst_tmp++) = '=';
*(dst_tmp++) = '=';
} *dst_tmp = ; return (dst_tmp - dst);
} // base64 解码
int base64_decode(const unsigned char* data, int data_len, char* dst, int dst_len)
{
if (data == NULL || data_len < || dst == NULL || dst_len == ) {
return -;
} if (dst_len < get_decode_len(data_len)) {
return -;
} init_de_table(); char* dst_tmp = dst;
int pos;
for (pos = ; pos < data_len; pos+=) {
if (de_table[data[pos]]==0xff || de_table[data[pos+]]==0xff
|| de_table[data[pos+]]==0xff || de_table[data[pos+]]==0xff)
{
return -;
}
*(dst_tmp++) = (de_table[data[pos]]<<) | (de_table[data[pos+]]>>)&0x3;
*(dst_tmp++) = (de_table[data[pos+]]<<) | (de_table[data[pos+]]>>)&0x0f;
*(dst_tmp++) = (de_table[data[pos+]]<<) | (de_table[data[pos+]])&0x3f;
} while (*(dst_tmp-) == ) {
dst_tmp--;
} *dst_tmp = ; return (dst_tmp - dst);
} // 根据数据字节数 获取加密字节数
int get_crypt_size(int data_len)
{
return ((data_len/AES_BLOCK_SIZE)+((data_len%AES_BLOCK_SIZE) == ? :))*AES_BLOCK_SIZE;
} // 加密
int aes_encrypt(char* in, char* key, char* out)//, int olen)
{
if(NULL == in || NULL == key || NULL == out)
return -; AES_KEY aes;
if(AES_set_encrypt_key((unsigned char*)key, , &aes) < )
{
return -;
} int len=strlen(in);
int en_len=;
while(en_len<len)//输入输出字符串够长。而且是AES_BLOCK_SIZE的整数倍,须要严格限制
{
AES_encrypt((unsigned char*)in, (unsigned char*)out, &aes);
in+=AES_BLOCK_SIZE;
out+=AES_BLOCK_SIZE;
en_len+=AES_BLOCK_SIZE;
} return get_crypt_size(len);
} // 解密
int aes_decrypt(char* in, int in_len, char* key, char* out)
{
if(NULL == in || NULL == key || NULL == out)
return -; AES_KEY aes;
if(AES_set_decrypt_key((unsigned char*)key, , &aes) < )
{
return -;
} int en_len=;
while(en_len<in_len)
{
AES_decrypt((unsigned char*)in, (unsigned char*)out, &aes);
in+=AES_BLOCK_SIZE;
out+=AES_BLOCK_SIZE;
en_len+=AES_BLOCK_SIZE;
} return ;
} int main(int argc, char* argv[])
{
if (argc < )
return -; printf("src: %s\n", argv[]);
char in[BUF_SIZE] = {};
memcpy(in, argv[], strlen(argv[])); char aes_en[BUF_SIZE] = {};
int aes_en_len = aes_encrypt(in, CRYPT_USER_KEY, aes_en); // aes-128 加密
if (aes_en_len < )
{
printf("aes_encrypt error ret: %d\n", aes_en_len);
return -;
}
int i=;
printf("aes_en: {");
for(i=; i<aes_en_len; i++) printf(" %d",aes_en[i]);
printf(" } aes_en_len: %d\n", aes_en_len); char base64_en[BUF_SIZE] = {};
int base64_en_len = base64_encode(aes_en, aes_en_len, base64_en, BUF_SIZE); // base64 编码
if (base64_en_len < )
{
printf("base64_encode error ret: %d\n", base64_en_len);
return -;
}
printf("base64_en_len: %d base64_en: %s\n", base64_en_len, base64_en); char base64_de[BUF_SIZE] = {};
int base64_de_len = base64_decode(base64_en, base64_en_len, base64_de, BUF_SIZE); // base64 解码
if (base64_de_len < )
{
printf("base64_encode error ret: %d\n", base64_de_len);
return -;
}
printf("base64_de: {");
for(i=; i<base64_de_len; i++) printf(" %d",base64_de[i]);
printf(" } base64_de_len: %d\n", base64_de_len); char aes_de[BUF_SIZE] = {};
int aes_de_len = aes_decrypt(base64_de, base64_de_len, CRYPT_USER_KEY, aes_de); // aes-128 解密
if (aes_de_len < )
{
printf("aes_encrypt error ret: %d\n", aes_de_len);
return -;
}
printf("aes_de_len: %d aes_en: %s\n", strlen(aes_de), aes_de); return ;
}
编译时要 libcrypto.so
OpenSSL aes加解密实例+base64编解码的更多相关文章
- Openssl aes加解密例程 更进一步
原文链接: http://blog.csdn.net/itmes/article/details/7718427 前面我们用openssl的aes256对称加密算法对16个字节的内存块进行了的加解密运 ...
- Openssl aes加解密例程
原文链接: http://blog.csdn.net/itmes/article/details/7714854 假设我们已经下载了 openssl的源码,并成功编译,设置好了编程环境. 我们现在来看 ...
- 【VBA研究】如何用Base64 编解码方法实现简单的加解密
Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输.由于编码简单,所以很容易实现,代码也是现成的.利用这个编码规则可以实现简单的加解密.编解码方 ...
- openssl命令行Base64编解码
openssl对base64编解码的规范支持较差,用它编解码的结果别的语言如php处理很不方便,注意的几点整理如下 1,如果php加密结果做base64编码长度小于64,则需要添加一个换行符opens ...
- python rsa 加密解密 (编解码,base64编解码)
最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...
- ios Base64编解码工具类及使用
为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...
- C#与java中的AES加解密互解算法
一.C#版AES加解密算法 public class AESCode { public string Key { get; set; } public string Encrypt(string va ...
- .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转
.net mvc 站点自带简易SSL加密传输 因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...
- Java中的AES加解密工具类:AESUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...
随机推荐
- Matplotlib之Bar Chart
Matplotlib之Bar Chart: import numpy as np import matplotlib.pyplot as plt data = [[300, 200, 250, 150 ...
- 对接第三方服务引起的小思考-回调和Sign算法
背景 最近在对接一个同事写的支付公用模块,然后对第三方服务引起一两个小思考. 思考 回调 来看看我们同事是如何做回调的. 首先,请求支付接口的时候,将回调URL作为请求body的一个参数[不加密] ...
- 安装vant2.2.7版本报错These dependencies were not found: vant/es/goods-action-big-btn in ./src/config/vant.config.js......
一.问题 前天,在使用vant的checkbox复选框的时候,注意到新增加一个全选功能,通过 ref 可以获取到 CheckboxGroup 实例并调用实例方法.于是我就想用这个,但是按照上面的示例写 ...
- 《完美解决系列》Android5.0以上 Implicit intents with startService are not safe
在Android6.0上,使用了以下代码: Intent intent = new Intent(); intent.setAction("xxx.server"); bindSe ...
- pycharm2018.2汉化 解决设置打不开问题
首先检查下是不是装了中文汉化包resources_cn.jar 如果有的话,解决办法:1.更换一个汉化包或者将原来的resources_en.jar也放进lib目录下 2.将汉化包都删除,只留下原版的 ...
- 套壳浏览器与Chrome浏览器之间的差别
之前QQ浏览器一直是我前端调试工具的主力,因为它是一个套壳浏览器,所以它的兼容模式(谷歌Chrome内核)和极速模式(IE浏览器内核)简直是调试兼容性的神器,可以直接切换,不用再反复打开Chrome和 ...
- ArrayList源码解析[一]
ArrayList源码解析[一] 欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 在工作中集合list集合用的相对来 ...
- python编程系列---进程池的优越性体验
1.通过multiprocessing.Process()类创建子进程 import multiprocessing, time, os, random def work(index): " ...
- 3.如何理解开多线程可以充分利用CPU?
如何理解开多线程可以充分利用CPU? <1>操作系统采用时间片轮转调度算法分配的时间片给每个进程中的线程 <2>操作系统的时间片轮转调度算法分配的时间片 在别的进程中都没有准备 ...
- 解决IDEA下SpringBoot启动没有Run Dashboard并找回
前两天看到别人SpringBoot启动服务,启动器是长这样的 而我的呢?是这样的 Run Dashboard 它是一个代替Run窗口的一个更好清晰简洁的一个启动器. 如果我们需要启动多个窗口时,Run ...