一.前言

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

    #pragma once #include <stdio.h> #include <graphics.h> #include <mmsystem.h> #pragm ...

  2. java带package的编译

    ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "java -cp d:\\TEST com/ ...

  3. A start job is running for Network Manager wait online (29s / no limit) 等待30s解决办法

    电脑安装openSUSE42.3和 Ubuntu16.04 双系统,当电脑插上网线后开机会出现A start job is running for Network Manager wait onlin ...

  4. 联想 U410 超极本启用加速硬盘方法

    安装步骤: 方法一: 使用raid1方法 (此方法未安装过) 方法二:  普通安装后,使用RST加速 1.改BIOS , 为AHCI启动    , 2.安装好系统后,下载RST软件并安装 3.改BIO ...

  5. android对话框显示异常报错:You need to use a Theme.AppCompat theme (or descendant) with this activity.

    今天写android实验碰到到一个问题,在用AlertDialog.Builder类构建一个对话框之后,调用Builder.show()方法时抛出异常如下: - ::-/xyz.qlrr.sqlite ...

  6. wampserver-mysql创建数据库

    首先打开wampserver,在右下角会出现一个这样的图标,左键单击它,选择MYSQL->MYSQL控制台 输入密码 创建一个新的数据库:create database XXX 注意要输“;”, ...

  7. 使用DbUtils实现增删改查——ResultSetHandler 接口的实现类

    在上一篇文章中<使用DbUtils实现增删改查>,发现运行runner.query()这行代码时.须要自己去处理查询到的结果集,比較麻烦.这行代码的原型是: public Object q ...

  8. Flat UI简介

    Flat UI简介 一.简介 Flat UI是基于Bootstrap之上进行二次开发的扁平化前端框架,他提供了动感.时尚的风格色调搭配,简洁.炫丽的功能组件,同时还提供了更为平滑的js交互动画,可以称 ...

  9. 47.Express文件上传

    转自:http://www.runoob.com/nodejs/nodejs-express-framework.html 文件上传 以下我们创建一个用于上传文件的表单,使用 POST 方法,表单 e ...

  10. 如何使iframe外部的超级链接的页面在iframe中打开

    如何使iframe外部的超级链接的页面在iframe中打开,有以下两种方法: 一.html方法: <iframe name="a1"></iframe> & ...