Base64转换:AQAB=65537,你知道为什么吗?
来源:互联网 发布:学生成绩表 sql语句 编辑:程序博客网 时间:2024/05/21 10:07
转载地址 http://www.cnblogs.com/midea0978/archive/2007/05/22/755826.html
Base64转换:AQAB=65537,你知道为什么吗?
在RSA加密算法中,RSA公钥的public exponent通常都是65537,用base64来表示就是AQAB,这个转换是怎么得来的呢?
通常的base64算法是实现byte[]与base64字符串之间的转换,如果你习惯下面的转换方式,那就错了:
输出的结果:NjU1Mzc=,并不是AQAB。
那么对于数字转换为base64应该怎么转换呢?首先来回顾一下base64算法原理:
1、算法原理
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。
具体转化形式如下图:
字符串"张3"byte[]110101011100010100110011添加前缀00, byte[]00110101000111000001010000110011十进制53 282051转码1cUz可以这么考虑:把8位的字节连成一串110101011100010100110011
然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0,就成了一个新的字节。之后再选出6个来,再添加0,依此类推,直到24个二进制数全部被选完。
那么,根据上面的对照表计算出字符串“张3”的base64编码就是"1cUz"
2、转码对照表
根据上面的原理,实际上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就可以了,下面是演示代码[代码不具有通用性转换性,仅演示]:
参考:《浅谈Base64编码》 http://www.5dmail.net/html/2004-1-30/200413084348.htm
通常的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[]110101011100010100110011添加前缀00, byte[]00110101000111000001010000110011十进制53 282051转码1cUz可以这么考虑:把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与655370 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
根据上面的原理,实际上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就可以了,下面是演示代码[代码不具有通用性转换性,仅演示]:
1public 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 }
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
0 0
- Base64转换:AQAB=65537,你知道为什么吗?
- 你知道为什么吗
- 你知道360为什么叫360吗
- 你知道你为什么穷吗?因为你喜欢省钱!
- 你知道为什么手机耳机是标配吗?
- 我知道你为什么拖延
- CDN: 知道为什么是你
- 你失业了吗? 知道为什么吗? (zt)
- 你失业了吗? 知道为什么吗? (zt)
- 你失业了吗? 知道为什么吗? (zt)
- 你知道为什么zip始终不兼容rar吗?
- 你知道为什么zip始终不兼容rar吗?
- 网站收录量上不去。你知道为什么吗?
- 知道我为什么不再主动找你了吗?
- 你知道为什么是从C盘开始吗?
- 为什么要研究对象池,你知道吗?
- 你知道为什么原装光模块价格这么贵吗?
- 你知道为什么Android手机总是越用越慢?
- Abdroid中静态(主清单)注册广播接收者,监听开机广播
- 802.11学习笔记
- JAVA类项目如何开启远程DEBUG模式?TOMCAT,JETTY等容器启动也可以DEBUG,以及JAVA远程连接JMXREMOTE
- java简单实现webservice接口
- oracle查看监听状态
- Base64转换:AQAB=65537,你知道为什么吗?
- 音乐推荐系统比较调研
- 查询课程编号以'c05'开头,被3名及以上学生选修且期末成绩的平均分高于75分的课程号、选修人数和期末成绩平均分,并按平均分降序排序
- C#中的DataSet、string、DataTable 、对象转换成Json
- 解决Android的ListView控件滚动时背景变黑
- cisco交换机配置命令
- nginx关闭日志
- poj 3009——Curling 2.0
- C++11 auto