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 ...
随机推荐
- CMD的最佳“代替品”
让CMD成为历史 Windows用户大多都使用过"cmd",cmd被称为"阉割版"的DOS系统~ 很多用户除此之外,还喜欢Linux命令行~但是CMD的命令和L ...
- 我的mongoDb之旅(一)
开发环境 php版本:7.0.10 mongodb版本:1.5 开发框架:tp5 数据库工具:navicat12formongodb 可以参考的外部文件链接 tp5中mongodb的扩展说明:http ...
- Spark 学习笔记之 Standalone与Yarn启动和运行时间测试
Standalone与Yarn启动和运行时间测试: 写一个简单的wordcount: 打包上传运行: Standalone启动: 运行时间: Yarn启动: 运行时间: 测试结果: Standalon ...
- IDEA 学习笔记之 Java项目开发
Java项目开发: 新建模块: 添加JDK: 导入本地Jars: 从远程Maven仓库下载: 创建package: 新建类/接口/枚举等: 字体太小,改字体: Duplicate Scheme 修改编 ...
- Scala 学习笔记之集合(7) Option
object CollectionDemo8 { def main(args: Array[String]): Unit = { //Option集合的使用,可以用来安全的判断null或非null,放 ...
- MongoDB 学习笔记之 检测存储引擎
检测存储引擎: db.serverStatus().storageEngine db.serverStatus().wiredTiger (转)WiredTiger测试结果 单纯写的测试结果 结论:W ...
- gorilla/mux类库解析
golang自带的http.SeverMux路由实现简单,本质是一个map[string]Handler,是请求路径与该路径对应的处理函数的映射关系.实现简单功能也比较单一: 不支持正则路由, 这个是 ...
- 使用Newspaper3k框架快速抓取文章信息
一.框架介绍 Newspaper是一个python3库,但是Newspaper框架并不适用于实际工程类新闻信息爬取工作,框架不稳定,爬取过程中会有各种bug,例如获取不到url.新闻信息等,但对于想获 ...
- 【Java基础】Java开发过程中的常用工具类库
目录 Java开发过程中的常用工具类库 1. Apache Commons类库 2. Guava类库 3. Spring中的常用工具类 4. 其他工具 参考 Java开发过程中的常用工具类库 1. A ...
- pc vue 项目中的菜单权限控制
在pc 管理系统这种类型的产品,通常会涉及到账号权限的控制,不同的账号权限能浏览的功能模块是不同的,对应侧边栏菜单模块的显示也会不同. 场景一.(电商类管理系统) 登录 登录后,依次获取账号 toke ...