自定义Base 64加密
一.前言
最近做软件需要一个功能,就是对文件进行加密。本来嘛,加密算法一堆一堆的,但是试了几个成熟的加密算法后发现对文件进行加密需要的时间很长,特别是上G的文件,这样客户是接受不了的。最后没办法了,好坏也要找一个吧,就选定用Base64加密。标准的base64加密很简单,而且编码表也是固定的,所以只要稍加修改,也能成为有效的加密工具,虽然有一点弱,本来嘛这种加密也是“防君子不防小人”的。
下载地址:http://download.csdn.net/source/2915065
二.Base64加密原理
①.把3个字符变成4个字符
②.每76个字符加一个换行符
③.最后的结束符也要处理
这样说会不会太抽象了?不怕,我们来看一个例子:
转换前 aaaaaabb ccccdddd eeffffff
转换后 00aaaaaa 00bbcccc 00ddddee 00ffffff
应该很清楚了吧?上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。
转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的:(摘自RFC2045)
|
索引 |
对应字符 |
索引 |
对应字符 |
索引 |
对应字符 |
索引 |
对应字符 |
|
0 |
A |
17 |
R |
34 |
i |
51 |
z |
|
1 |
B |
18 |
S |
35 |
j |
52 |
0 |
|
2 |
C |
19 |
T |
36 |
k |
53 |
1 |
|
3 |
D |
20 |
U |
37 |
l |
54 |
2 |
|
4 |
E |
21 |
V |
38 |
m |
55 |
3 |
|
5 |
F |
22 |
W |
39 |
n |
56 |
4 |
|
6 |
G |
23 |
X |
40 |
o |
57 |
5 |
|
7 |
H |
24 |
Y |
41 |
p |
58 |
6 |
|
8 |
I |
25 |
Z |
42 |
q |
59 |
7 |
|
9 |
J |
26 |
a |
43 |
r |
60 |
8 |
|
10 |
K |
27 |
b |
44 |
s |
61 |
9 |
|
11 |
L |
28 |
c |
45 |
t |
62 |
+ |
|
12 |
M |
29 |
d |
46 |
u |
63 |
/ |
|
13 |
N |
30 |
e |
47 |
v |
||
|
14 |
O |
31 |
f |
48 |
w |
||
|
15 |
P |
32 |
g |
49 |
x |
||
|
16 |
Q |
33 |
h |
50 |
y |
让我们再来看一个实际的例子,加深印象!
转换前 10101101 10111010 01110110
转换后 00101011 00011011 00101001 00110110
十进制 43 27 41 54
对应码表中的值 r b p 2
所以上面的24位编码,编码后的Base64值为 rbp2
原文的字节不够的地方可以用全0来补足,转换时Base64编码用=号来代替。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为:
余数 = 原文字节数 MOD 3
所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况啦)。如果是1的话,为了让Base64编码是3的倍数,就要补2个等号;同理,如果是2的话,就要补1个等号。
三.自定义编码
我们把上面标准的编码表定义成我们自己的编码就行了。如果要加密后的字符是可以看见的,最好选ASCII 码在0-128之间的。即字符在"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"之间。上面A的ASCII码是65,B是66,最大的是z=122,都在128之间。
我们重新定义上面字符表的顺序,也就是自己排排上面字符串的顺序,目的是打乱上面那个表的映射。这样只有我们自己知道映射表,也就只有我们自己知道钥匙了,所以别人用标准的Base64编码表也就不能顺利解码了。
再强调一遍,这种加密很弱,是效率优先的加密算法。
四.自定义编码实现
网上标准的Base64加密算法很多,我随便找一了个,部分代码如下:
首先有一点可以肯定,那就是这两个表是有一定的关系。我们唯一要做的就是找出这两个表之间的对应关系。
是什么关系呢?我们知道A的ASCII码是65,我们观察解密表中第65位是0,再看B的ASCII码是66,解密表是的66位是1。是不是有点明白了?!!
结论就是,加密表中的ASCII码的值对应解密表的位,加密表的位对应解密表的值。
用代码表示就是这样的:
for (i = ; i < ; ++i)
{
int code = BASE64_ALPHABET[i]; BASE64_DEALPHABET[code] = i;
}
五.问题
1.如果你想加密表再复杂点,最好来点什么乱码或不能打印的字符,这样解密表也要跟着变。这里我想说的是解密数组大小范围你自己要估计,要尽量使有效的数据多,不要浪费空间。
2. 这种加密比较弱,对方穷举就行破解,也用不了多少时间。他的目的是“防君子不防小人”和提高效率而已。
六. 附录
下面是我自己写的Base64 dll使用的一些说明:
/*******************************************
功能: 重置加密表
描述: 默认是ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
如果你想自己定义加密表,直接调用此接口即可,
如:SetNew_ALPHABET("3456789+/CDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012AB");
********************************************/
bool SetNew_ALPHABET(CString strTable); /*******************************************
功能: 对字符串进行加密解密
********************************************/
void EncodeBuffer (char* p_pInputBuffer, unsigned int p_InputBufferLength, char*p_pOutputBufferString);
unsigned int DecodeBuffer (char* p_pInputBufferString, char* p_pOutputBuffer); /*******************************************
功能: 对单个文件进行加密解密
********************************************/
unsigned int EncodeFile (CString SourceFileName, CString EncodedFileName);
unsigned int DecodeFile (CString SourceFileName, CString DecodedFileName); /*******************************************
功能: 对目录下所有文件进行加密解密
********************************************/
unsigned int EncodeDir (CString SourceDirName, CString EncodedDirName);
unsigned int DecodeDir (CString SourceDirName, CString DecodedDirName);
怎么样,简单吧!!有了这两张表,就相当于有了钥匙!想怎么加密就随你了。
自定义Base 64加密的更多相关文章
- Base 64 加密、解密
1.写一个公共类 package com.boyutec.oss.sys.utils; import java.io.UnsupportedEncodingException; import java ...
- Base 64 编码
原创地址:http://www.cnblogs.com/jfzhu/p/4020097.html 转载请注明出处 (一)Encoding VS. Encryption 很多人都以为编码(Encodin ...
- 浅谈 Data URI 与 BASE 64 编码
前言(废话):鼓捣 Stylish 的时候发现了这么个奇怪的代码行: Data:image/gif;BASE64,R0lGODlhEAAQAKEAAEKF9NPi/AAAAAAAACH5BAEAAAI ...
- C# base 64图片编码解码
使用WinForm实现了图片base64编码解码的 效果图: 示例base 64编码字符串: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKD ...
- base 64 编解码器
base 64 编解码 1. base64的编码都是按字符串长度,以每3个8bit的字符为一组, 2. 然后针对每组.首先获取每一个字符的ASCII编码. 3. 然后将ASCII编码转换成8bit的二 ...
- js密码64加密
可以在客户端对密码进行简单的64位加密,服务端对应使用64位解密即可. /** * * Base64 encode / decode * * @author * @date * @email */ f ...
- Base 64 & decodeURIComponent
Base 64 & decodeURIComponent js btoa() & atob() let obj = [{"key":"q",&q ...
- [windows篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录
为了更好的阅读体验,欢迎阅读原文.原文链接在此. [windows篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录 Part 2: Using G ...
- 关于BASE 24 ,BASE 64原理以及实现程序
关于BASE 24 ,BASE 64原理以及实现程序 来源 https://wangye.org/blog/archives/5/ 可能很多人听说过Base64编码,很少有人听说过Base24编码,B ...
随机推荐
- ant安装配置问题:ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.
项目用到ant 1.去官网下载:http://ant.apache.org/bindownload.cgi 2.解压至安装C盘 3.设置ANT_HOME.PATh.CLASSPATH ANT_HOME ...
- 百度LBS开放平台个性化地图 制作一款独一无二的地图
百度LBS开放平台个性化地图 制作一款独一无二的地图 天天用百度地图的亲们是否已不再满足仅仅看例如以下的地图样式了呢? 默认百度地图样式 是否特别渴望看特别不一样的地图呢.如带京城81号气息的午夜蓝 ...
- Windows 8 快捷键收集整理
Windows键快捷方式列表 Windows键:打开開始屏幕 Windows键+空格键:切换输入语言和键盘布局 Windows键+O:禁用屏幕翻转 Windows键+,:暂时查看桌面 Windows键 ...
- Magento--判断checkout中是否使用了coupon code
在checkout页面中,如果想判断顾客是否有使用coupon code,可以通过checkout session来进行判断.以下代码会返回checkout中使用的coupon code或者返回空(当 ...
- 项目:rbac 基于角色的权限管理系统;
- 简单示意流程图 - RBAC分析: - 基于角色的权限管理: - 权限等于用户可以访问的URL: - 通过限制URL来限制权限: - RBAC表结构组成: from django.db impor ...
- ACM的算法分类 2015-04-16 14:25 22人阅读 评论(0) 收藏
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ...
- HUE配置文件hue.ini 的desktop模块详解(图文详解)(分HA集群)
http://archive.cloudera.com/cdh5/cdh/5/hue-3.9.0-cdh5.5.4/manual.html#_install_hue [desktop]这块,配置如下 ...
- 开源计算机集群监控Ganglia应用视频
Ganglia源于Berkeley发起的一个开源集群监视项目,设计用于监测数上千节点的计算机集群.它包含gmond.gmetad以及一个Web前端.可以用来监控系统处理器 .内存.硬盘 I/O.网络流 ...
- 原型,构造函数,实例,__proto__
再说说__proto__,这个孩子性格慢向,所以即使在现代浏览器广为支持得今天也不建议使用,性能特别慢,而且影响所有来自该[[prototype]]的对象.只是拿出来了解了解: 1.它是个啥? 原型对 ...
- 【RHEL7/CentOS7网络配置】
目录 网卡配置文件 查网卡信息 测试网络是否正常 使用 nmtui 命令配置网络 使用 nm-connection-editor 工具配置网络 修改回6.x版本的网卡名 Rhel/CentOS网络配置 ...