编码加密那些事之——Base64

作者: 键盘上的麒麟臂 | 来源:发表于2019-06-20 18:48 被阅读3次

打算总结一些常用的编码和加密的方式,为什么要分开写而不把全部写在同一篇,当然是为了凑字数啦。
今天就先来讲Base64,为什么先讲他,因为看起来比较容易理解。

1. Base64是什么?

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
简单来说就是把你的需要编码的串转换为 A-Z、a-z、0-9、+、/ 和 =
可以先看看索引表(网上找的)

2. 进行Base64编码

因为Base64是64个字符,所以可以使用6bit表示,就是2的6次方。

比如最大的二进制数 111111,以8bit来看比较直观,所以前两位补零00111111,转成10进制就是63,对应表就是 / ,所以最多只能有6位来表示,比如10111111 这样就没办法找对对应的索引。

那么进行Base64编码的方式就很简单了,假如有一个字符串,我们先将字符串转换为 2进制,这样的二进制一般是8位,再从左往右取6位,转换成10进制再对应索引表就行。
记住,3个字节一组,为什么3个字节一组,因为3x8=4x6

讲了这么多道理,可能有点绕,实践一些就知道了,比如下面的栗子(抄网上的)

字符串      a       b        c
ASCII      97      98       99
8bit   01100001 01100010 01100011
6bit   011000   010110   001001   100011
十进制      24      22        9        35
对应编码    Y        W        J        j

一看就知道了,都不用解释是吧,随便直接再看看补位图,如果分割之后剩余的不足,也就是上面说的3x8=4x6 , 没凑够3,那就会在后面补上 =


偷图

这个也不用解释吧, 3x8=4x6 我觉得这个等式就能说明一切。

3. 特殊字符串进行编码

上面的例子看似没问题,但是会有个误导,那就是ASCII码,并不是一定要有转成ASCII码这一步,我们只需要最终转成二进制就行,不然比如emoji 比如汉字这些是没办法转成ASCII码的。

比如我现在要将 “卧槽” 进行Base64编码要怎么做?
(1)首先需要将“卧槽”转成2进制
将“卧槽”转成2进制,这又和编码方式有关,我们用的不是ASCII码,不同的编码转成的二进制不同,得到的Base64编码的结果也不同,这点需要注意
在UTF-8下:111001011000110110100111 111001101010011110111101
在Unicode下:00000000000000000101001101100111 00000000000000000110100111111101
PS:我们就以UTF-8为例。
(2)对2进制进行 3x8=4x6

按3个分组  11100101 10001101 10100111       11100110 10100111 10111101
6bit             111001 011000 110110 100111      111001 101010 011110 111101
十进制        57   24   54   39        57   42   30   61
对应编码    5Y2n    5qe9

我们验证一下,可以在随便在网上找个在线编码的


好,这就对上了,如果没对上了也没关系,因为我们上面有说过,不同的编码得到的结果不同,说不定你用的是UTF-8,但是在线编码的网站用的是Unicode
既然汉字能解决了,那设么emoji啊,其他国家的语言啊,自然不在话下

4. Base64解码

既然有编码,那自然有解码。 先看我用java写的一个Demo(binary是转二进制的方法):

        String baseStr = "卧槽";
        byte[] baseBytes = baseStr.getBytes();
        Log.v("mmp","编码前的二进制:"+binary(baseBytes, 2));
        String encodedString = Base64.getEncoder().encodeToString(baseBytes);
        Log.v("mmp","编码之后的结果:"+encodedString);

        byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
        Log.v("mmp","解码前的二进制:"+binary(decodedBytes, 2));
        String decodedString = new String(decodedBytes);
        Log.v("mmp","解码之后的结果:"+decodedString);

打印出结果



可以看出解码就是一个逆向的过程,使用原本的二进制进行编码,对这个Base64串解码之后会得到原本的二进制。而解码的过程也没什么好说的了,就是上面编码的过程逆过来就行。

5.其它

需要注意的是编码之后的 + / = 3个符号都是比较常用的符号,所以在传递数据时为了防止出错,可以将这3个符号替换成其它的符号。
Base64编码不仅仅能用在字符串上,对文件也能使用,是对二进制进行编码。
Base64只是编码,不是加密,Base64是可逆的,而且它生成的结果一眼就能看出来,这能瞒过谁。

相关文章

  • 编码加密那些事之——Base64

    打算总结一些常用的编码和加密的方式,为什么要分开写而不把全部写在同一篇,当然是为了凑字数啦。今天就先来讲Base6...

  • java android 对接接口加密

    加密方式 方案1 使用Base64编码最常用的就是Base64编码了,Base64不算是加密,只是把字符经过编码变...

  • 常见编码加密解密Base64,URL ,GZIP,DES,RSA

    常见编码加密解密的基础用法 Base64编码 URL编码 GZIP AES加密 DES加密 RSA加密 编码 加密工具类

  • iOS加密

    什么是加密? 加密 = 算法 + 钥匙 base64只是编码,不能归类于加密,base64编码原理 算法是固定且公...

  • CryptoJS 使用

    数组加密,Utf8编码,传递,加解密 加密,Base64编码,传递,解密 引用PHP 和 Web 端对称加密传输|...

  • base64 加密方式详解

    base64 加密方式详解 base64编码表 命名 base64是用于传输8Bit字节代码,由上图的编码表可以知...

  • IOS 编码 加密 漫谈

    加密分为对称加密和非对称加密 Base64编码 1.Base64简单说明 描述:Base64可以成为密码学的基...

  • 自己用php实现base64编码(转载 )

    很多人误以为Base64是一种加密方式,其实不是加密,它只是一种编码方式,是可逆的。Base64编码,是我们程序开...

  • C语言操作openssl

    C语言调用OpenSSL加解密 md5加密 sha1加密 base64 编码 base64 解码 调用base64...

  • iOS 常用加密方式讲解

    1. Base64 说起常用加密算法,很多人都会说有base64,其实base64不是加密方式,而是一种编码方式。...

网友评论

    本文标题:编码加密那些事之——Base64

    本文链接:https://www.haomeiwen.com/subject/npddqctx.html