base64加密解密

什么是base64:base64是一种常见的用于传输8Bit字节码的编码方式,是一种基于64个可打印字符来表示二进制数据的方法。

base64所用的字符为A到Z、a到z、0到9、+号符和/号符,他的索引(下标)从0开始,具体如下转换对照所示:

索引

对应字符

索引

对应字符

索引

对应字符

索引

对应字符

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

  

15

P

32

g

49

x

  

16

Q

33

h

50

y

 

 

base64加密方法:


 1、 首先将需要加密的明文的每个字符依次翻译为二进制的ASII码,取八位(不足八位前面填充0补充)
 2 、然后将1中所有二进制组成一串长字符串,然后再将这个字符串以每六个为一组组成几个新的二进制数;如果最后一组二进制数不足六位,则在其后面加0凑成六位(每三个8Bit的字节转换为四个6Bit的字节,空余的bit用0补上)
 3、最后将这些二进制依次转换为十进制,这些十进制对应base64转换表中的索引,根据这些索引获取对应的字符组成的字符串就是密文(密文的个数必须为4的倍数,可以将其分为每4个一组,最后一组不足4的话添加=号补充完整)
 demo:
     明文:AllenYu
     1、首先将这个明文中的每个字符转换成二进制的ASII码(通过查询本文末尾处的ASII码对照表获取)
          A -> 01000001
          l   -> 01101100
          l   -> 01101100
          e  -> 01100101
          n  -> 01101110
          Y  -> 01011001
          u  -> 01110101
     2、 由1获得字符串:01000001011011000110110001100101011011100101100101110101
          将这个字符串以每六个一组,组成新的二进制,然后再将这些二进制转换成十进制,最后以这些十进制为索引找到相应的字符
          二进制:    010000  010110  110001  101100  011001  010110  111001  011001  011101  010000(最后一组补四个0)
          十进制:    16          22          49          44         25          22          57         25          29         16
          对应字符: Q           W           x            s           Z            W          5           Z            d            Q
     3、 由2得到编码:QWxs ZW5Z dQ 每4个一组,不足四个补=号 得到最终加密后的密文QWxsZW5ZdQ==

base64解密方法:


 1、 首先将base64加密后需要进行解密的密文(如末尾的有=号,将=号删除)的每个字符通过base64转换表找到索引,然后将这些索引转换为六位的二进制数(不足六位前面补充,凑足六位)
 2、 然后将1中所有二进制组成一个字符串,将这个字符串以每8个为一组,组成几个新的二进制数;如果最后一组不足8个,则这组全部删除(字符长度取模8得到余数,末尾去除这个余数相应的个数的字符)
 3、 通过查找ASII码对照表,找到2中所有二进制所对应的字符,这些字符就是解密后的明文
 demo:
     密文:QWxsZW5ZdQ==
     1、 将结尾的两个=去除,并通过字符去编码表找到对应下标并转换为二进制(六位的)
          字符:                  Q            W          x            s            Z          W           5            Z           d           Q
          对应索引:           16           22         49          44          25         22          57          25         29         16
          索引对应二进制: 010000  010110  110001  101100  011001  010110  111001  011001  011101  010000
     2、由1得到字符串:010000010110110001101100011001010110111001011001011101010000
          每八个一组,组成多个二进制(最后一组不足八个的话,最后一组删除)
          01000001  01101100  01101100  01100101  01101110  01011001  01110101  0000
          最后一组只有四个字符,删除
          二进制:              01000001  01101100  01101100  01100101  01101110  01011001  01110101
          ASII码十进制:    65             108            108           101            110            89              117
          对应ASII码字符:A                l                 l                e                 n               Y                u
          得到最终解密明文:AllenYu

附:Java实现base64加密解密代码

  /**
     * base64 字典,编码表
     */
    public static java.util.List<Character> getDictionaries() {
        java.util.List<Character> dictionaries = new ArrayList<>();
        dictionaries.add('A');
        dictionaries.add('B');
        dictionaries.add('C');
        dictionaries.add('D');
        dictionaries.add('E');
        dictionaries.add('F');
        dictionaries.add('G');
        dictionaries.add('H');
        dictionaries.add('I');
        dictionaries.add('J');
        dictionaries.add('K');
        dictionaries.add('L');
        dictionaries.add('M');
        dictionaries.add('N');
        dictionaries.add('O');
        dictionaries.add('P');
        dictionaries.add('Q');
        dictionaries.add('R');
        dictionaries.add('S');
        dictionaries.add('T');
        dictionaries.add('U');
        dictionaries.add('V');
        dictionaries.add('W');
        dictionaries.add('X');
        dictionaries.add('Y');
        dictionaries.add('Z');
        dictionaries.add('a');
        dictionaries.add('b');
        dictionaries.add('c');
        dictionaries.add('d');
        dictionaries.add('e');
        dictionaries.add('f');
        dictionaries.add('g');
        dictionaries.add('h');
        dictionaries.add('i');
        dictionaries.add('j');
        dictionaries.add('k');
        dictionaries.add('l');
        dictionaries.add('m');
        dictionaries.add('n');
        dictionaries.add('o');
        dictionaries.add('p');
        dictionaries.add('q');
        dictionaries.add('r');
        dictionaries.add('s');
        dictionaries.add('t');
        dictionaries.add('u');
        dictionaries.add('v');
        dictionaries.add('w');
        dictionaries.add('x');
        dictionaries.add('y');
        dictionaries.add('z');
        dictionaries.add('0');
        dictionaries.add('1');
        dictionaries.add('2');
        dictionaries.add('3');
        dictionaries.add('4');
        dictionaries.add('5');
        dictionaries.add('6');
        dictionaries.add('7');
        dictionaries.add('8');
        dictionaries.add('9');
        dictionaries.add('+');
        dictionaries.add('/');
        return dictionaries;
    }

    /**
     * base64加密
     *
     * @param code 明文
     * @return
     */
    public static String enCode(String code) {
        java.util.List<Character> pem_array = getDictionaries();
        char[] codes = code.toCharArray();
        StringBuffer binaryCode = new StringBuffer();
        for (char c : codes) {
            int asii = (int) c;
            String binary = Integer.toBinaryString(asii);
            for (int i = binary.length(); i < 8; i++) {
                binary = "0" + binary;
            }
            binaryCode.append(binary);
        }
        StringBuffer str = new StringBuffer();
        int binaryMode = binaryCode.length() % 6;
        if (binaryMode != 0) {
            for (int i = binaryMode; i < 6; i++) {
                binaryCode.append(0);
            }
        }
        for (int i = 0, j = 0; j < binaryCode.length() / 6; j++) {
            String binaryString = binaryCode.substring(i, i += 6);
            int decimalism = Integer.parseInt(binaryString, 2);
            str.append(pem_array.get(decimalism));
        }
        binaryMode = binaryCode.length() / 6 % 4;
        if (binaryMode != 0) {
            for (int i = binaryMode; i < 4; i++) {
                str.append("=");
            }
        }
        return str.toString();
    }

    /**
     * base64 解密
     *
     * @param code 密文
     * @return
     */
    public static String deCode(String code) {
        StringBuffer res = new StringBuffer();
        List<Character> pem_array = getDictionaries();
        while (code.lastIndexOf('=') == code.length() - 1) {
            code = code.substring(0, code.length() - 1);
        }
        StringBuffer deStr = new StringBuffer();
        for (int i = 0; i < code.length(); i++) {
            int index = pem_array.indexOf(code.charAt(i));
            String deCode = Integer.toBinaryString(index);
            for (int j = deCode.length(); j < 6; j++) {
                deCode = "0" + deCode;
            }
            deStr.append(deCode);
        }
        int binaryMode = deStr.length() % 8;
        String deStrs = deStr.substring(0, deStr.length() - binaryMode);
        for (int i = 0, j = 0; j < deStrs.length() / 8; j++) {
            int decimalism = Integer.parseInt(deStrs.substring(i, i += 8), 2);
            res.append((char) decimalism);
        }
        return res.toString();
    }

附:ASCll码对照表(来源:http://ascii.911cha.com/)

ASCII控制字符

二进制十进制十六进制缩写可以显示的表示法名称/意义
0000 0000000NUL空字符(Null)
0000 0001101SOH标题开始
0000 0010202STX本文开始
0000 0011303ETX本文结束
0000 0100404EOT传输结束
0000 0101505ENQ请求
0000 0110606ACK确认回应
0000 0111707BEL响铃
0000 1000808BS退格
0000 1001909HT水平定位符号
0000 1010100ALF换行键
0000 1011110BVT垂直定位符号
0000 1100120CFF换页键
0000 1101130DCR归位键
0000 1110140ESO取消变换(Shift out)
0000 1111150FSI启用变换(Shift in)
0001 00001610DLE跳出数据通讯
0001 00011711DC1设备控制一(XON 启用软件速度控制)
0001 00101812DC2设备控制二
0001 00111913DC3设备控制三(XOFF 停用软件速度控制)
0001 01002014DC4设备控制四
0001 01012115NAK确认失败回应
0001 01102216SYN同步用暂停
0001 01112317ETB区块传输结束
0001 10002418CAN取消
0001 10012519EM连接介质中断
0001 1010261ASUB替换
0001 1011271BESC跳出
0001 1100281CFS文件分割符
0001 1101291DGS组群分隔符
0001 1110301ERS记录分隔符
0001 1111311FUS单元分隔符
0111 11111277FDEL删除

 

ASCII可显示字符

二进制十进制十六进制图形
0010 00003220(空格)(␠)
0010 00013321!
0010 00103422"
0010 00113523#
0010 01003624$
0010 01013725 %
0010 01103826&
0010 01113927'
0010 10004028(
0010 10014129)
0010 1010422A*
0010 1011432B+
0010 1100442C,
0010 1101452D-
0010 1110462E.
0010 1111472F/
0011 000048300
0011 000149311
0011 001050322
0011 001151333
0011 010052344
0011 010153355
0011 011054366
0011 011155377
0011 100056388
0011 100157399
0011 1010583A:
0011 1011593B;
0011 1100603C<
0011 1101613D=
0011 1110623E>
0011 1111633F?
 
二进制十进制十六进制图形
0100 00006440@
0100 00016541A
0100 00106642B
0100 00116743C
0100 01006844D
0100 01016945E
0100 01107046F
0100 01117147G
0100 10007248H
0100 10017349I
0100 1010744AJ
0100 1011754BK
0100 1100764CL
0100 1101774DM
0100 1110784EN
0100 1111794FO
0101 00008050P
0101 00018151Q
0101 00108252R
0101 00118353S
0101 01008454T
0101 01018555U
0101 01108656V
0101 01118757W
0101 10008858X
0101 10018959Y
0101 1010905AZ
0101 1011915B[
0101 1100925C\
0101 1101935D]
0101 1110945E^
0101 1111955F_
 
二进制十进制十六进制图形
0110 00009660`
0110 00019761a
0110 00109862b
0110 00119963c
0110 010010064d
0110 010110165e
0110 011010266f
0110 011110367g
0110 100010468h
0110 100110569i
0110 10101066Aj
0110 10111076Bk
0110 11001086Cl
0110 11011096Dm
0110 11101106En
0110 11111116Fo
0111 000011270p
0111 000111371q
0111 001011472r
0111 001111573s
0111 010011674t
0111 010111775u
0111 011011876v
0111 011111977w
0111 100012078x
0111 100112179y
0111 10101227Az
0111 10111237B{
0111 11001247C|
0111 11011257D}
0111 11101267E~
  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值