一.前言

最近做软件需要一个功能,就是对文件进行加密。本来嘛,加密算法一堆一堆的,但是试了几个成熟的加密算法后发现对文件进行加密需要的时间很长,特别是上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加密的更多相关文章

  1. Base 64 加密、解密

    1.写一个公共类 package com.boyutec.oss.sys.utils; import java.io.UnsupportedEncodingException; import java ...

  2. Base 64 编码

    原创地址:http://www.cnblogs.com/jfzhu/p/4020097.html 转载请注明出处 (一)Encoding VS. Encryption 很多人都以为编码(Encodin ...

  3. 浅谈 Data URI 与 BASE 64 编码

    前言(废话):鼓捣 Stylish 的时候发现了这么个奇怪的代码行: Data:image/gif;BASE64,R0lGODlhEAAQAKEAAEKF9NPi/AAAAAAAACH5BAEAAAI ...

  4. C# base 64图片编码解码

    使用WinForm实现了图片base64编码解码的 效果图: 示例base 64编码字符串: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKD ...

  5. base 64 编解码器

    base 64 编解码 1. base64的编码都是按字符串长度,以每3个8bit的字符为一组, 2. 然后针对每组.首先获取每一个字符的ASCII编码. 3. 然后将ASCII编码转换成8bit的二 ...

  6. js密码64加密

    可以在客户端对密码进行简单的64位加密,服务端对应使用64位解密即可. /** * * Base64 encode / decode * * @author * @date * @email */ f ...

  7. Base 64 & decodeURIComponent

    Base 64 & decodeURIComponent js btoa() & atob() let obj = [{"key":"q",&q ...

  8. [windows篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录

    为了更好的阅读体验,欢迎阅读原文.原文链接在此. [windows篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录 Part 2: Using G ...

  9. 关于BASE 24 ,BASE 64原理以及实现程序

    关于BASE 24 ,BASE 64原理以及实现程序 来源 https://wangye.org/blog/archives/5/ 可能很多人听说过Base64编码,很少有人听说过Base24编码,B ...

随机推荐

  1. netsh http的使用

    1.首先通过cmd进入 C:\Windows\System32\inetsrv>netshnetsh>http netsh http> 退出的时候,使用exit命令 2.显示监听的i ...

  2. 1.windows(64位)下使用curl命令

    转自:https://www.cnblogs.com/xing901022/p/4652624.html Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景 ...

  3. 原生ajax实现方式

    http://www.cnblogs.com/rubylouvre/archive/2013/01/08/2851051.html <!DOCTYPE html> <html lan ...

  4. 基于CANopen DSP402的运动控制笔记

    常用的mode of operation 有以下几种: 控制字 control word: 6--------------7---------------15--------------------7 ...

  5. ivms4200 远程桌面访问测试过程及问题汇总

    17.11.4 测试存储服务器配置后能否自动录像确认 10:34   4200客户端关闭 10:40  打开4200客户端软件 10:51   关机 10:56  开机,有提示出现,“防火墙阻止... ...

  6. babel的插件

    比如想编译es6的箭头函数,需要使用babel-plugin-transform-es2015-arrow-functions这个插件 此外babel提供了 prests(预设) 相当于是插件的集合 ...

  7. MySQL Pool

    创建连接池 function SqlPool() { this.flag = true;//是否连接过 this.pool = mysql.createPool({ host : 'localhost ...

  8. 紫书 例题 9-9 UVa 10003 (区间dp+递推顺序)

    区间dp,可以以一个区间为状态,f[i][j]是第i个切点到第j个切点的木棍的最小费用 那么对于当前这一个区间,枚举切点k, 可以得出f[i][j] = min{dp(i, k) + dp(k, j) ...

  9. JavaLearning:日期操作类

    package org.fun.classdemo; import java.util.Calendar; import java.util.GregorianCalendar; public cla ...

  10. ethercat主站控制软件TwinCAT的安装

    TwinCAT软件系统是基于PC兼容机的自己主动化系统,全称是"The Windows Control and Automation Technology".它把不论什么PC兼容机 ...