在路上...
专注.net,发现。
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 48 文章- 37 评论- 1848
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 @ 2007-05-22 16:37
在路上...
阅读(3132)
评论(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 |
监控局域网[未注册用户]
多谢楼主分享。楼主的计算机知识真是厉害啊。
刷新评论
切换模板
发表评论
昵称:
[登录]
[注册]
主页:
邮箱:
(仅博主可见)
验证码:
看不清,换一个
评论内容:
登录
注册
[使用Ctrl+Enter键快速提交评论]
0
755826
导航:
网站首页
社区
新闻
博问
闪存
网摘
招聘
找找看
Google搜索
China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务
相关文章:
最新IT新闻:
预测:Twitter最可能收购的十家公司
网易澄清:与暴雪合资公司仅提供技术支持
杰克逊悼念仪式或成史上最大规模Web活动
《商业周刊》:Mozilla的志愿者开发模式被复制
Mono 的Virtual PC 虚拟机
相关链接:
公告
时光荏苒,岁月流逝,仅以此纪念那一段走过来的开发岁月,希望哪天回首时,仍能想起一幕幕难忘的日子。
一个新的尝试,开始、而不知何时结束...
我的最新闪存
drop dead
与我联系
发短消息
搜索
留言簿
给我留言
查看留言
我的标签
javascript
(2)
压缩
(2)
compressor
(2)
obfuscator
(2)
ruby
(2)
flex 天气
(1)
informix
(1)
redhat
(1)
乱码
(1)
Flex
(1)
随笔分类
Flex(3)
(rss)
Informix(1)
(rss)
Ruby(2)
(rss)
在路上...(39)
(rss)
随笔档案
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)
(rss)
加密、算法、数字签名等(9)
(rss)
心得共享(4)
(rss)
积分与排名
积分 - 363589
排名 - 98
最新评论
1. re: 各大网站的WEB服务器分析
上海丰企实业发展有限公司 (fengqibeng)
2. re: 关于破解
Thank you Very good crack from infragistic please tell me step vy step how can drop infragistic f... (yony)
3. re: TeeChart For .NET V1.1.1544.28001破解
请你指点一下teechart控件的事件功能说明!谢谢.我是初学者. TChart1_OnAfterDraw TChart1_OnMouseDown TChart1_OnMouseMove TCh... (chen-poll)
4. re: 关于破解
Intersoft WebUI Studio.NET 2008 R2 sp1版本
有吗
谢谢!!!
muhuli@naver.com (Someting)
5. re: 跨语言平台的RSA加密、解密、签名、验证算法的实现
最近在研究SHA1withRSA的签名,我能基本搞定了java和php的签名和验证,但是对于asp和、net的资料少之又少,能否帮我
能不能给我一份asp和、net的资料,让我学习下!谢谢! (megcker)
6. re: ComponentArt Web.UI for ASP.NET 2.X序列号
Hello, please could anyone send me the serial for Componentart UI Framework 2009, and a serial for C... (Auabda)
7. re: 关于破解
Intersoft WebUI Studio.NET 2008 R2 sp1版本
有吗
谢谢!!!
ljl_lei@163.com
(stonelimit)
8. re: Javascript代码压缩、加密算法的破解分析及工具实现
nNB (我的自留地)
9. re: 关于破解
Hi, I need serial or keygen for Intersoft WebUI Studio.NET 2008 R2 sp1Please send to me Thank youema... (psc_chine)
10. re: 关于破解
ufo-crackerx.blog.163.com (crackdung)
阅读排行榜
1. 免费200部以上的.net/java电子书下载(66044)
2. 关于破解(27904)
3. 关于Web.UI for ASP.NET 2.1的说明(17555)
4. 新增DotNetBar 4.6.0.0破解补丁及DundasWinGauge补丁下载(9367)
5. 关于FP Spread for Web Forms 2.0.0.0(6122)
6. 利用正则表达式分析腾讯网页提取天气信息(4409)
7. 跨语言平台的RSA加密、解密、签名、验证算法的实现(4060)
8. Javascript代码压缩、加密算法的破解分析及工具实现(3696)
9. 各大网站的WEB服务器分析(3465)
10. Base64转换:AQAB=65537,你知道为什么吗?(3132)
评论排行榜
1. 关于破解(377)
2. 关于Web.UI for ASP.NET 2.1的说明(240)
3. 新增DotNetBar 4.6.0.0破解补丁及DundasWinGauge补丁下载(126)
4. 免费200部以上的.net/java电子书下载(52)
5. 关于FP Spread for Web Forms 2.0.0.0(33)
6. 跨语言平台的RSA加密、解密、签名、验证算法的实现(24)
7. 闲着写了一个查看股票的程序(14)
8. Javascript代码压缩、加密算法的破解分析及工具实现(12)
9. 一个C#算法分析求解(11)
10. 中秋快乐,找个让自己快乐起来的理由(9)