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编解码的更多相关文章

  1. Openssl aes加解密例程 更进一步

    原文链接: http://blog.csdn.net/itmes/article/details/7718427 前面我们用openssl的aes256对称加密算法对16个字节的内存块进行了的加解密运 ...

  2. Openssl aes加解密例程

    原文链接: http://blog.csdn.net/itmes/article/details/7714854 假设我们已经下载了 openssl的源码,并成功编译,设置好了编程环境. 我们现在来看 ...

  3. 【VBA研究】如何用Base64 编解码方法实现简单的加解密

    Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输.由于编码简单,所以很容易实现,代码也是现成的.利用这个编码规则可以实现简单的加解密.编解码方 ...

  4. openssl命令行Base64编解码

    openssl对base64编解码的规范支持较差,用它编解码的结果别的语言如php处理很不方便,注意的几点整理如下 1,如果php加密结果做base64编码长度小于64,则需要添加一个换行符opens ...

  5. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  6. ios Base64编解码工具类及使用

    为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...

  7. C#与java中的AES加解密互解算法

    一.C#版AES加解密算法 public class AESCode { public string Key { get; set; } public string Encrypt(string va ...

  8. .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 ...

  9. Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

随机推荐

  1. CNN之yolo目标检测算法笔记

    本文并不是详细介绍yolo工作原理以及改进发展的文章,只用做作者本人回想与提纲. 1.yolo是什么 输入一张图片,输出图片中检测到的目标和位置(目标的边框) yolo名字含义:you only lo ...

  2. mkdir,rmdir

    mkdir (选项)(参数)  创建文件夹-m:创建文件夹的同时,赋予其权限-p:若创建目录的上层不存在时,一并创建出来-v:显示创建的过程创建多个目录的时候,用空格隔开 rmdir (选项)(参数) ...

  3. 利用Helm简化Kubernetes应用部署(1)

    目录 利用Helm简化Kubernetes应用部署  Helm基础  安装Helm  使用Visual Studio 2019为Helm编写一个简单的应用    利用Helm简化Kubernetes应 ...

  4. 学习WEBAPI(DOM)第二天

    目录 第二天学习目标: 一.阻止超链接的默认跳转行为 二.鼠标进入事件和鼠标离开事件 三.根据name属性值获取元素==>表单标签,返回的是伪数组 四.根据类样式的名字来获取元素,返回的是伪数组 ...

  5. java面试宝典2019(好东西先留着)

    java面试宝典2019 1.meta标签的作用是什么 2.ReenTrantLock可重入锁(和synchronized的区别)总结 3.Spring中的自动装配有哪些限制? 4.什么是可变参数? ...

  6. ReentrantLock源码学习总结 (一)

    [^ ]: 以下源码分析基于JDK1.8 ReentrantLock 示例 private ReentrantLock lock = new ReentrantLock(true); public v ...

  7. ES6——新增数据结构Set与Map的用法

    ES6 提供了新的数据结构 Set以及Map,下面我们来一一讲解. 一.Set 特性 似于数组,但它的一大特性就是所有元素都是唯一的,没有重复. 我们可以利用这一唯一特性进行数组的去重工作. 1.单一 ...

  8. Java BIO及实现

    发现日常学习过的知识不久就会遗忘,在此只是整理并记录一下学习笔记,做个回忆,并方便以后查阅,若有错误,欢迎指正 网络模型:TCP/IP网络模型是从OSI七层模型中演化来的,osi模型分为物理层,数据链 ...

  9. C语言-正序输出一个一个多位数

    //正序输出一个多位数,所有的数字中间用空格分隔 int main() { ;//是可变化的 ; int d; int t =x; //先计算x的位数 ){ t /= ; mask *=; } pri ...

  10. #10056. 「一本通 2.3 练习 5」The XOR-longest Path

    题目描述 有一棵带权树,求这些边组成的路径的最大异或和. Solution 考场 SPFA 神奇 70 分代码 #include<cstdio> #include<cstdlib&g ...