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 ...
随机推荐
- 1 Processing入门简介
1 Processing入门简介 1.1 Before you start Processing是一个为开发面向图形的应用(visually oriented application)而生的简单易用的 ...
- Maven配置JRE版本
Maven配置JRE版本 apache-maven-3.5.0\conf\settings.xml <profiles> <profile> <id>develop ...
- 【Java】获取当前操作系统桌面路径
//当前用户桌面 File desktopDir = FileSystemView.getFileSystemView() .getHomeDirectory(); String desktopPat ...
- Java基础学习(八) - 多线程
理解线程 进程是指一个内存中运行的应用程序,系统运行一个程序即是一个进程从创建,运行,结束的过程. 线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程. 多线程的特点是并发 ...
- 如何写md格式的文档
一.标题 标题其实和HTML中的h系列很像,想要设置为标题的文字前面加#来表示一个#是一级标题,二个#是二级标题,以此类推.支持六级标题. 注:标准语法一般在#后跟个空格再写文字, 示例: 效果如下: ...
- 02-17 kd树
目录 kd树 一.kd树学习目标 二.kd树引入 三.kd树详解 3.1 构造kd树 3.1.1 示例 3.2 kd树搜索 3.2.1 示例 四.kd树流程 4.1 输入 4.2 输出 4.3 流程 ...
- B-微积分-sign(符号)函数
目录 sign(符号)函数 一.sign函数概述 二.python实现sign函数 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:h ...
- .netCore+Vue 搭建的简捷开发框架 (5)
文章目录:.netCore+Vue 搭建的简捷开发框架--目录 上两节的内容介绍了一些关于.netCore 相关的一些基础知识.介绍这些的目的,最主要的还是为了我们的架构搭建服务. 上一节中,我们介绍 ...
- Springboot】Springboot整合邮件服务(HTML/附件/模板-QQ、网易)
介绍 邮件服务是常用的服务之一,作用很多,对外可以给用户发送活动.营销广告等:对内可以发送系统监控报告与告警. 本文将介绍Springboot如何整合邮件服务,并给出不同邮件服务商的整合配置. 如图所 ...
- MySQL索引的建立与实现
一.索引介绍 1.MySQL中,所有的数据类型都可以被索引,索引包括普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引等. 2.额外的:我已知的自动创建索引的时机:创建主键,唯一,外键约束的 ...