网络传输——Base64详解
网络传输——Base64详解
自从引用以来,Base64编码的标准极普及为的迅速。不过,把文件作为附件通过网际邮件扩充协议(MIME)传送时,Base64是标准的编码标准。然而,几乎所有的电子邮件客户端都是用MIME发送文件(以附件形式)的,这就意味着大多数的电子邮件客户端使用Base64对文件编码后通过网络传输。格式如下:
Content-Transfer-Encoding:base64( Gb2312)
这种传输格式又被称为U-t-U(Unix to Unix)传输协议,能兼容大多数的硬件设备并基于其上进行无损字节传输。但是缺点在于是,使用此种格式会使文件的大小增加百分之四十左右。
除了作为MIME的默认编码标准,base64编码也广泛用于其他领域。一个常见的例子是用于网络服务器完成基于HTTP的基本认证。当服务器想限制访问某些文件时,通过使用基于HTTP的基本认证系统,便可以对这些文件进行密码保护。而基本认证使用Base64编码标准对用户名和密码进行编码。这样,黑客们使用TCP通过端口连接ESMTP服务器时,手动输入量就会大大增加。
尽管Base64编码受到广泛的支持和应用,但却是当今最弱的编码标准之一,通过以下步骤就可以轻易地进行逆向工程。不仅仅是算法上的容易逆向,因为在网络上Base64用纯文本形式发送密码,使得Base64加密文本很容易受到sniffer程序的嗅探。
编码程序如下:
1、 将要加密的文本的每个字符转换成标准的ASCII十进制码。
2、 通过任何一种方式(手算、机器算、对照表格)将这部分十进制编码转换成二进制(文章最后附有转换表)编码。每个十进制码都对应器等价的八位二进制数值。
3、 将这部分二进制数连结到一起,产生一串二进制数。
4、 将这一大片的二进制字符串分割成每6个字符为一部分的小块。
5、 通过任何一种方式(手算、机器算、对照表格)将这部分6字符的小块分别转换成相应的等价十进制数。
6、 通过Base64表转换成Base64编码。
Base64编码转换表如下:
十进制 |
编码 |
十进制 |
编码 |
十进制 |
编码 |
十进制 |
编码 |
||
0 |
A |
16 |
Q |
32 |
g |
48 |
w |
||
1 |
B |
17 |
R |
33 |
h |
49 |
x |
||
2 |
C |
18 |
S |
34 |
i |
50 |
y |
||
3 |
D |
19 |
T |
35 |
j |
51 |
z |
||
4 |
E |
20 |
U |
36 |
k |
52 |
0 |
||
5 |
F |
21 |
V |
37 |
l |
53 |
1 |
||
6 |
G |
22 |
W |
38 |
m |
54 |
2 |
||
7 |
H |
23 |
X |
39 |
n |
55 |
3 |
||
8 |
I |
24 |
Y |
40 |
o |
56 |
4 |
||
9 |
J |
25 |
Z |
41 |
p |
57 |
5 |
||
10 |
K |
26 |
a |
42 |
q |
58 |
6 |
||
11 |
L |
27 |
b |
43 |
r |
59 |
7 |
||
12 |
M |
28 |
c |
44 |
s |
60 |
8 |
||
13 |
N |
29 |
d |
45 |
t |
61 |
9 |
||
14 |
O |
30 |
e |
46 |
u |
62 |
+ |
||
15 |
P |
31 |
f |
47 |
v |
63 |
/ |
例如:mne,通过ASCII字符表转化为是进制值为:m、109,n,110,e、101.合起来就是:109110101.转化为二进制就是:0110 1101 0110 1110 0110 0101。将它们分成六个字为一段:011011 010110 111001 100101。而他们对应的十进制字符分别是:27 22 57 37。Base64等价值就是:27、b,22、w,57、5,37、1,也就是说mne的Base64编码是bw51。
需要注意的是:如果被加密的字符串每3个一组,还剩1或2个字符,使用特殊字符“=”补齐Base64成为4个字。
知道了加密方式,要逆向就很简单了。将对应的Base64值转换为十进制,再通过计算转换成二进制编码。将这一串码分为8位1组,得到十进制码,最后再等价到相应的ASCII编码即可。
附1:ASCII编码表(部分)
二进制 |
十进制 |
十六进制 |
缩写/字符 |
解释 |
0000 0000 |
0 |
00 |
NUL (null) |
空字符 |
0000 0001 |
1 |
01 |
SOH (start of handing) |
标题开始 |
0000 0010 |
2 |
02 |
STX (start of text) |
正文开始 |
0000 0011 |
3 |
03 |
ETX (end of text) |
正文结束 |
0000 0100 |
4 |
04 |
EOT (end of transmission) |
传输结束 |
0000 0101 |
5 |
05 |
ENQ (enquiry) |
请求 |
0000 0110 |
6 |
06 |
ACK (acknowledge) |
收到通知 |
0000 0111 |
7 |
07 |
BEL (bell) |
响铃 |
0000 1000 |
8 |
08 |
BS (backspace) |
退格 |
0000 1001 |
9 |
09 |
HT (horizontal tab) |
水平制表符 |
0000 1010 |
10 |
0A |
LF (NL line feed, new line) |
换行键 |
0000 1011 |
11 |
0B |
VT (vertical tab) |
垂直制表符 |
0000 1100 |
12 |
0C |
FF (NP form feed, new page) |
换页键 |
0000 1101 |
13 |
0D |
CR (carriage return) |
回车键 |
0000 1110 |
14 |
0E |
SO (shift out) |
不用切换 |
0000 1111 |
15 |
0F |
SI (shift in) |
启用切换 |
0001 0000 |
16 |
10 |
DLE (data link escape) |
数据链路转义 |
0001 0001 |
17 |
11 |
DC1 (device control 1) |
设备控制1 |
0001 0010 |
18 |
12 |
DC2 (device control 2) |
设备控制2 |
0001 0011 |
19 |
13 |
DC3 (device control 3) |
设备控制3 |
0001 0100 |
20 |
14 |
DC4 (device control 4) |
设备控制4 |
0001 0101 |
21 |
15 |
NAK (negative acknowledge) |
拒绝接收 |
0001 0110 |
22 |
16 |
SYN (synchronous idle) |
同步空闲 |
0001 0111 |
23 |
17 |
ETB (end of trans. block) |
传输块结束 |
0001 1000 |
24 |
18 |
CAN (cancel) |
取消 |
0001 1001 |
25 |
19 |
EM (end of medium) |
介质中断 |
0001 1010 |
26 |
1A |
SUB (substitute) |
替补 |
0001 1011 |
27 |
1B |
ESC (escape) |
溢出 |
0001 1100 |
28 |
1C |
FS (file separator) |
文件分割符 |
0001 1101 |
29 |
1D |
GS (group separator) |
分组符 |
0001 1110 |
30 |
1E |
RS (record separator) |
记录分离符 |
0001 1111 |
31 |
1F |
US (unit separator) |
单元分隔符 |
附2:下列Perl脚本将会自动帮你做解密:
Use MIME::Base64;
Print decode_base64(“Insert Text here”);
附3:使用Java脚本实现解密(代码):
<script type="text/javascript">
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64DecodeChars = new Array(
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
function base64Encode(str) {
var out, i, len;
var c1, c2, c3;
len = str.length;
i = 0;
out = "";
while(i < len) {
c1 = str.charCodeAt(i++) & 0xff;
if(i == len)
{
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt((c1 & 0x3) << 4);
out += "==";
break;
}
c2 = str.charCodeAt(i++);
if(i == len)
{
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt((c2 & 0xF) << 2);
out += "=";
break;
}
c3 = str.charCodeAt(i++);
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
out += base64EncodeChars.charAt(c3 & 0x3F);
}
return out;
}
function base64Decode(str) {
var c1, c2, c3, c4;
var i, len, out;
len = str.length;
i = 0;
out = "";
while(i < len) {
/* c1 */
do {
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
} while(i < len && c1 == -1);
if(c1 == -1)
break;
/* c2 */
do {
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
} while(i < len && c2 == -1);
if(c2 == -1)
break;
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
/* c3 */
do {
c3 = str.charCodeAt(i++) & 0xff;
if(c3 == 61)
return out;
c3 = base64DecodeChars[c3];
} while(i < len && c3 == -1);
if(c3 == -1)
break;
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
/* c4 */
do {
c4 = str.charCodeAt(i++) & 0xff;
if(c4 == 61)
return out;
c4 = base64DecodeChars[c4];
} while(i < len && c4 == -1);
if(c4 == -1)
break;
out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
}
return out;
}
alert("原文:"+sTemp+"\n加密:"+base64Encode(sTemp)+"\n解密:"+base64Decode(base64Encode(sTemp)));
alert("原文:"+sTemp+"\n加密:"+base64Encode(sTemp)+"\n解密:"+base64Decode(base64Encode(sTemp)));
</script>
好东西一般都放在最后的位置……
很高兴你能看到这个文档,说明你离过关又近了一步。
Tip:ZGIvc2lsaWMubWRi
网络传输——Base64详解相关推荐
- 数据包在网络中的传输过程详解
我们当今使用电子设备都离不开网络,通过网络我们可以聊天.玩游戏.看电影都操作. 网络的本质就是交换数据. 本文我们就来看下数据是如何在网络中传输的. 计算机网络模型 现在有两种计算机网络模型,分别为O ...
- 看完之后保证你对socket编程步骤胸有成竹。 C++ Socket网络编程基础详解(TCP)
C++ Socket网络编程基础详解(TCP版) 网络编程,就是编写程序使得两台计算机交换数据,其实从本质上来讲,网络编程最终所实现的功能,和我们文件的输入输出很相似,只是文件输入输出的对象 ...
- 网络-IP协议详解(报文格式、分类、NAT、子网、CIDR、抓包分析)
目录 简介 报文格式 IPv4地址 分类 网络地址转换NAT 子网划分与子网掩码 CIDR 实战 参考 简介 IP(网际互连协议,Internet Protocol)是TCP/IP协议族中最为核心的协 ...
- 华为HCIE认证考试费多少,华为技术网络工程师技术细节详解 什么是PPP MP接口
华为HCIE认证考试费多少,华为技术网络工程师技术细节详解 什么是PPP MP接口 华为HCIE课程中,提到的一种接口类型PPP MP接口是什么? MP是Multi-Link PPP的缩写,是将多个物 ...
- 科普:5G网络关键技术详解
不久前,中国华为公司主推的Polar Code(极化码)方案,成为5G控制信道eMBB场景编码方案.消息一出,在网络上就炸开了锅,甚至有媒体用"华为碾压高通,拿下5G时代"来形容这 ...
- openstack架构详解图_英特尔顶级技术专家合力缔造精品:Linux开源网络全栈详解...
日常水开篇 自1991年诞生起,Linux已经走过了接近三十年.Linux早已没有了问世时的稚气,正在各个领域展示自己成熟的魅力. 以Linux为基础,也衍生出了各种开源生态,例如网络和存储.而生态离 ...
- 2020中级计算机工程师,2020年上半年中级网络工程师报考详解
原标题:2020年上半年中级网络工程师报考详解 软考全称叫做"全国计算机技术与软件专业技术资格(水平)考试"已经开展了十多年了,所受到的欢迎程度也是越来越高,据统计累计参加软考的人 ...
- iOS开发——使用Charles进行https网络抓包详解
我在前面两篇博客中<网络抓包工具Charles的介绍与使用><iOS开发--使用Charles进行http网络抓包详解>对Charles的http抓包进行了详细的讲解.今天我们 ...
- Incremental-Network-Quantization增量网络量化论文详解
Incremental-Network-Quantization增量网络量化论文详解 笔者将从以下几个方面分析该论文的原理及其实现,由于笔者能力有限,如有错误望诸公指正. 论文作者代码:https:/ ...
最新文章
- 虚拟机cenos 重置密码
- 你需要知道的加密算法
- ElasticSearch Java Api(一) -创建索引
- MariaDB 数据库索引详解(9)
- 网站重新解析换服务器,更换解析服务器地址
- java numberformat 方法_Java NumberFormat parse()用法及代码示例
- rocketmq删除topic_RocketMq 快速入门教程
- 学习分享|量化风控从入门到放弃
- Android使用adb命令查看CPU信息
- web 开发之js---js 实现文本高亮
- 基于 WebRTC 构建 Web SIP Phone
- 【蓝桥杯】历年真题题目及题解汇总
- PHP 对接阿里云短信
- 子组件无法更新父组件请求的数据
- 验证集与测试集的区别
- dbeave 安装驱动网络问题失败
- 仓库管理系统怎么选?想高效管理仓库的老板,别错过这篇干货!
- 少儿学编程系列---如何使用turtle画鸡蛋
- 嵌入式系统 操作系统 uC/OS uClinux
- 详谈软件架构设计(一)之软件架构的概念以及风格-上