在路上...
专注.net,发现。
随笔- 54 文章- 38 评论- 1879
博客园
首页
新随笔
联系
管理
订阅
Base64转换:AQAB=65537,你知道为什么吗?
在RSA加密算法中,RSA公钥的public exponent通常都是65537,用base64来表示就是AQAB,这个转换是怎么得来的呢?
通常的base64算法是实现byte[]与base64字符串之间的转换,如果你习惯下面的转换方式,那就错了:
Console.WriteLine(Convert.ToBase64String(Encoding.Default.GetBytes(
"
65537
"
)));
输出的结果:NjU1Mzc=,并不是AQAB。
那么对于数字转换为base64应该怎么转换呢?首先来回顾一下base64算法原理:
1、算法原理
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。
具体转化形式如下图:
字符串
"张3"
byte[]
110101
011100
010100
110011
添加前缀00, byte[]
00110101
00011100
00010100
00110011
十进制
53
28
20
51
转码
1
c
U
z
可以这么考虑:把8位的字节连成一串110101011100010100110011
然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0,就成了一个新的字节。之后再选出6个来,再添加0,依此类推,直到24个二进制数全部被选完。
那么,根据上面的对照表计算出字符串“张3”的base64编码就是"1cUz"
2、转码对照表
Value Encoding Value Encoding Value Encoding Value Encoding
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 (pad)
=
15
P
32
g
49
x
16
Q
33
h
50
y
3、AQAB与65537
根据上面的原理,实际上65537作为数字就不能直接转换字符串再转换为base64,这样只会得出错误的结果,应该直接将65537转换为2进制
Step 1: 1 0000 0000 0000 0001
由于转换需要3个8字节的数据,需要在左边加上前导0,结果就是
Step 2:0000 0001 0000 0000 0000 0001
然后依次取6位,加上00,变成下面的一窜数据
Step 3:0000 0000 0001 0000 0000 0000 0000 0001
每8转换为10进制
Step 4:0 16 0 1
对照转码表
Step 5:AQAB
这就是为什么AQAB=65537,按照上面的原理我们就可以将RSA加密的密钥大质数转换为byte[]或者base64字符串存储了,.net中就是按照base64格式存储的。
4、代码实现
如何用代码来实现上面的转换呢,在.net中有一个类BitConverter可以实现int32=>byte[]的转换,但是转换后高低位的存储位置颠倒了,需要转换过来
例如数字65520=1111 1111 1111 0000=〉BitConverter.GetBytes=〉byte[]={240,255,0,0}
实际我们需要转换为byte[]={0,0,255,240},接下来用Convert.ToBase64String就可以了,下面是演示代码[代码不具有通用性转换性,仅演示]:
1
public
static
void
demo()
{
2
byte
[] bits
=
BitConverter.GetBytes(
65537
);
3
byte
[] newbits
=
new
byte
[bits.Length
-
1
];
//
避免产生padding位,去掉高位0,仅取3位
4
for
(
int
i
=
0
;i
<
newbits.Length;i
++
)
{
5
newbits[i]
=
bits[bits.Length
-
2
-
i];
//
newbits[0]=bits[2],依次
6
}
7
String s
=
Convert.ToBase64String(newbits);
8
Console.WriteLine(
"
Base64=
"
+
s);
9
newbits
=
Convert.FromBase64String(s);
10
for
(
int
i
=
0
;i
<
newbits.Length;i
++
)
{
11
bits[bits.Length
-
2
-
i]
=
newbits[i];
//
newbits[0]=bits[2],依次
12
}
13
bits[
3
]
=
0
;
//
高位补0
14
Console.WriteLine(
"
Num=
"
+
BitConverter.ToInt32(bits,
0
));
15
16
}
参考:《浅谈Base64编码》
http://www.5dmail.net/html/2004-1-30/200413084348.htm
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted on 2007-05-22 16:37
在路上...
阅读(3854)
评论(4)
编辑
收藏
发表评论
846633
回复
引用
#1楼
2007-05-22 23:32
|
热门单曲[未注册用户]
多谢楼主分享 顶一个
回复
引用
查看
#2楼
2007-05-23 16:58
|
gray
字节顺序取决于特定的计算机结构,所以不应该假定程序总运行在little-endian字节顺序的环境中:
byte[] bits=BitConverter.GetBytes((int)65537);
if(BitConverter.IsLittleEndian) Array.Reverse(bits);
int ofs = 0;
while(bits[ofs]==0 && ofs < bits.Length) ofs++;
String s=Convert.ToBase64String(bits,ofs,bits.Length - ofs);
//Write s
byte[] intBytes = new byte[4];
bits = Convert.FromBase64String(s);
bits.CopyTo(intBytes,intBytes.Length-bits.Length);
if(BitConverter.IsLittleEndian) Array.Reverse(intBytes);
int num = BitConverter.ToInt32(intBytes,0);
//Write num
回复
引用
#3楼
2007-08-07 18:03
|
监控局域网[未注册用户]
多谢楼主分享。楼主的计算机知识真是厉害啊。
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
最想要的Entity Framework功能
·
专访Jeffrey Richter:Windows 8是微软的重中之重
·
《福布斯》:谷歌进军硬件产品 难撼动苹果地位
·
美国空军拟最多购买1.8万台iPad 2
·
分析称专利之争让谷歌苹果两败俱伤
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
时光荏苒,岁月流逝,仅以此纪念那一段走过来的开发岁月,希望哪天回首时,仍能想起一幕幕难忘的日子。
一个新的尝试,开始、而不知何时结束...
跟小D每日学口语
昵称:
在路上...
园龄:
7年2个月
粉丝:
16
关注:
0
搜索
我的标签
加密
(2)
ruby
(2)
javascript
(2)
压缩
(2)
compressor
(2)
obfuscator
(2)
packer
(1)
混淆
(1)
pack
(1)
flex 天气
(1)
更多
随笔分类
Flex(4)
Informix(2)
Ruby(2)
在路上...(44)
随笔档案
2011年1月 (1)
2010年3月 (1)
2009年11月 (2)
2009年10月 (1)
2009年7月 (1)
2009年2月 (1)
2008年10月 (1)
2008年8月 (3)
2008年4月 (4)
2008年3月 (1)
2007年6月 (1)
2007年5月 (1)
2007年3月 (2)
2007年1月 (2)
2006年11月 (1)
2006年8月 (1)
2006年6月 (1)
2006年5月 (1)
2006年3月 (1)
2006年1月 (1)
2005年12月 (2)
2005年11月 (1)
2005年10月 (1)
2005年9月 (4)
2005年7月 (1)
2005年4月 (1)
2005年3月 (2)
2005年2月 (2)
2005年1月 (1)
2004年12月 (7)
2004年11月 (4)
文章分类
.NET 控件研究 (24)
加密、算法、数字签名等(10)
心得共享(4)
积分与排名
积分 - 410160
排名 - 154
最新评论
阅读排行榜
评论排行榜
推荐排行榜