Base64转换:AQAB=65537,你知道为什么吗?

       在RSA加密算法中,RSA公钥的public exponent通常都是65537,用base64来表示就是AQAB,这个转换是怎么得来的呢?
通常的base64算法是实现byte[]与base64字符串之间的转换,如果你习惯下面的转换方式,那就错了:
None.gif Console.WriteLine(Convert.ToBase64String(Encoding.Default.GetBytes( " 65537 " )));
None.gif

输出的结果:NjU1Mzc=,并不是AQAB。
那么对于数字转换为base64应该怎么转换呢?首先来回顾一下base64算法原理:
1、算法原理
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。
具体转化形式如下图:
字符串"张3"
byte[] 110101 011100010100110011
添加前缀00, byte[]00110101 00011100 00010100 00110011
十进制53   282051
转码1cUz
可以这么考虑:把8位的字节连成一串110101011100010100110011
然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0,就成了一个新的字节。之后再选出6个来,再添加0,依此类推,直到24个二进制数全部被选完。

那么,根据上面的对照表计算出字符串“张3”的base64编码就是"1cUz"
2、转码对照表
None.gif Value Encoding  Value Encoding  Value Encoding  Value Encoding
None.gif         
0  A             17  R             34  i             51  z
None.gif         
1  B             18  S             35  j             52   0
None.gif         
2  C             19  T             36  k             53   1
None.gif         
3  D             20  U             37  l             54   2
None.gif         
4  E             21  V             38  m             55   3
None.gif         
5  F             22  W             39  n             56   4
None.gif         
6  G             23  X             40  o             57   5
None.gif         
7  H             24  Y             41  p             58   6
None.gif         
8  I              25  Z             42  q             59   7
None.gif         
9  J              26  a             43  r             60   8
None.gif        
10  K             27  b             44  s             61   9
None.gif        
11  L             28  c             45  t             62  +
None.gif        
12  M             29  d             46  u             63  /
None.gif        
13  N             30  e             47  v
None.gif        
14  O             31  f             48  w         (pad)  =
None.gif        
15  P             32  g             49  x
None.gif        
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 ExpandedBlockStart.gif ContractedBlock.gif public   static   void  demo() dot.gif {
 2InBlock.gif        byte[] bits=BitConverter.GetBytes(65537);
 3InBlock.gif        byte[] newbits=new byte[bits.Length-1]; //避免产生padding位,去掉高位0,仅取3位
 4ExpandedSubBlockStart.gifContractedSubBlock.gif        for(int i=0;i<newbits.Length;i++)dot.gif{
 5InBlock.gif            newbits[i]=bits[bits.Length-2-i];//newbits[0]=bits[2],依次
 6ExpandedSubBlockEnd.gif        }

 7InBlock.gif        String s=Convert.ToBase64String(newbits);
 8InBlock.gif        Console.WriteLine("Base64="+s);
 9InBlock.gif        newbits=Convert.FromBase64String(s);
10ExpandedSubBlockStart.gifContractedSubBlock.gif        for(int i=0;i<newbits.Length;i++)dot.gif{
11InBlock.gif            bits[bits.Length-2-i]=newbits[i];//newbits[0]=bits[2],依次
12ExpandedSubBlockEnd.gif        }

13InBlock.gif        bits[3]=0;//高位补0
14InBlock.gif        Console.WriteLine("Num="+BitConverter.ToInt32(bits,0));
15InBlock.gif
16ExpandedBlockEnd.gif    }


参考:《浅谈Base64编码》 http://www.5dmail.net/html/2004-1-30/200413084348.htm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值