zoukankan      html  css  js  c++  java
  • 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就可以了,下面是演示代码[代码不具有通用性转换性,仅演示]:

     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    }


    参考:《浅谈Base64编码》 http://www.5dmail.net/html/2004-1-30/200413084348.htm
  • 相关阅读:
    telnet退出
    Eclipse srever起来时,时间超过45s。
    maven报错 Failure to transfer org.apache.maven.plugins:maven-compiler-plugin:pom:3.5.0 from
    需求讨论
    PyTorch学习笔记之计算图
    PyTorch学习笔记之CBOW模型实践
    PyTorch学习笔记之n-gram模型实现
    PyTorch学习笔记之初识word_embedding
    7月3日-9日_周报
    python学习笔记之heapq内置模块
  • 原文地址:https://www.cnblogs.com/midea0978/p/755826.html
Copyright © 2011-2022 走看看