在路上...
专注.net,发现。
随笔- 46 文章- 35 评论- 1793
博客园
首页
新随笔
联系
管理
订阅
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
在路上...
阅读(2753)
评论(4)
编辑
收藏
所属分类:
在路上...
发表评论
回复
引用
#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 |
监控局域网 [未注册用户]
多谢楼主分享。楼主的计算机知识真是厉害啊。
新用户注册
刷新评论列表
标题
姓名
主页
Email
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
博客园首页
新闻频道
社区
小组
博问
网摘
闪存
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关文章:
全国百强县排名完全名单——你老家上榜了吗?
人死后真的有灵魂吗?
在JavaScript中也玩变量类型强行转换
图片转换,把bmp图片转换为jpg图片
你知道指纹识别吗
社保知识,你知道多少
相关链接:
所属分类的其他文章:
Javascript代码压缩、加密算法的破解分析及工具实现
【翻译】Oracle不同版本之间Export & Import的兼容性矩阵
跨语言平台的RSA加密、解密、签名、验证算法的实现
Base64转换:AQAB=65537,你知道为什么吗?
闲话
闲着写了一个查看股票的程序
07年了,新的一年又开始了
简单生活
近期关注
无题
最新IT新闻:
淘宝与微软总部达成首次合作 Silverlight加入店铺
苹果9日发布iTunes 8、iPhone 2.1和第四代iPod Nano
微软出品8GB蓝色和120GB Zune播放器
千亿美元市值榜:微软居首移动第二 诺基亚退榜
Google申请“海上数据中心”专利 可能付诸行动
<
2007年5月
>
日
一
二
三
四
五
六
29
30
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
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
时光荏苒,岁月流逝,仅以此纪念那一段走过来的开发岁月,希望哪天回首时,仍能想起一幕幕难忘的日子。
一个新的尝试,开始、而不知何时结束...
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(115)
给我留言
查看留言
我的标签
javascript
(2)
压缩
(2)
compressor
(2)
obfuscator
(2)
ruby
(2)
rails
(1)
sqlite3
(1)
flex 天气
(1)
Flex
(1)
packer
(1)
更多
随笔分类
Flex(3)
Ruby(2)
在路上...(38)
随笔档案
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 控件研究 (23)
加密、算法、数字签名等(8)
心得共享(4)
文章档案
2008年4月 (2)
2007年6月 (2)
2006年6月 (1)
2005年11月 (3)
2005年9月 (3)
2005年8月 (1)
2005年7月 (1)
2005年5月 (1)
2005年4月 (2)
2005年2月 (1)
2005年1月 (1)
2004年12月 (9)
2004年11月 (8)
相册
About 在路上...
收藏夹
收藏文章(1)
网站链接
最新评论
1. re: 免费200部以上的.net/java电子书下载
书太老了,那个我们学校里头以前能访问,现访问不了了。
--JoonyLee
2. re: The Dundas Chart 4.1 For ASP.net&WinForms 破解
你好,能不能给我发一份Dundas Chart 4.1的破解dll
我的email:xiaoluo4163@126.com,急用!!谢谢!!
--xiaoluo
3. re: Flex上传文件功能
不错
--学习。。。。。。。。。
4. re: Flex上传文件功能
你JSP怎么写的啊??
--徐峰
5. re: DundasWebChart, ASP.net Version=5.0.0.1692研究
找的好苦,搂主有破解好的吗?
pccai1983@hotmail.com
多谢多谢!
--pccai
6. re: Telerik r.a.d.Editor 4.0 & Spell 1.2注册代码
研究下
--FreeDog
7. re: 免费200部以上的.net/java电子书下载
!
--yanshuihua
8. re: 关于破解
楼主,我恳求一份teechart for .net 2005,麻烦你抽个空发给我一份好吗?
我的邮箱zlp-zhuzhu@163.com,不胜感谢!
--hai
9. re: DevExpress.Web.ASPxGrid.ASPxGrid 1.6.0.1试用版补丁及注册码
和上面的问题一样!!!
高手帮帮忙啊!!!!!
急用的!!!
谢过!!!
--YANGMIN
10. re: RSA算法C#代码应用研究
单步调试通过,谢谢楼主
上面说缺少XML文件的只要在属性设置调试加运行参数就行了
--sexuu
阅读排行榜
1. 免费200部以上的.net/java电子书下载(63601)
2. 关于破解(25911)
3. 关于Web.UI for ASP.NET 2.1的说明(17269)
4. 新增DotNetBar 4.6.0.0破解补丁及DundasWinGauge补丁下载(9040)
5. 关于FP Spread for Web Forms 2.0.0.0(5880)
评论排行榜
1. 关于破解(362)
2. 关于Web.UI for ASP.NET 2.1的说明(240)
3. 新增DotNetBar 4.6.0.0破解补丁及DundasWinGauge补丁下载(125)
4. 免费200部以上的.net/java电子书下载(52)
5. 关于FP Spread for Web Forms 2.0.0.0(33)