Base64编码

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,本质上是一种将二进制数据转成文本数据的方案,对于非二进制数据,是先将其转换成二进制形式,然后每连续6比特(2的6次方=64)计算其十进制值,根据该值在A--Z,a--z,0--9,+,/ 这64个字符中找到对应的字符,最终得到一个文本字符串。

严格来讲,Base64只能算是一个编码算法,并不是安全领域的加密算法。

标准Base64编码解码无需额外信息即完全可逆,即使你自己自定义字符集设计一种类Base64的编码方式用于数据加密,在多数场景下也较容易破解。

Base64编码基本规则如下几点

  • 标准Base64只有64个字符:英文大小写(A-Z、a-z)、数字(0-9)、加号(+)、斜杠(/)和用作后缀的等号(=);
  • Base64是把3个字节变成4个可打印字符,所以Base64编码后的字符串一定能被4整除(不算用作后缀的等号)
  • 等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,Base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个0就加上几个等号。显然添加等号的数目只能是0、1或2;
  • 拓展:位、字节、英文字符、汉字、标点符号之间的关系

    1 bit = 1  二进制数据
    1 byte = 8 bit
    1 字母 = 1 byte = 8 bit
    1 汉字 = 2 byte = 16 bit

    标点符号:

    A>.  汉字输入状态下,默认为全角输入方式,标点符号占2字节;
    B>. 英文输入状态下,默认为半角输入方式,标点符号占1字节;

    Base64编码原理

  • 转换原理
  • 转换前 	10101101,10111010,01110110
    转换后 00101011, 00011011 ,00101001 ,00110110
    十进制 43 27 41 54
    对应Base64编码表中的值 r b p 2

    如上,转换前,Base64收到一个8位字节的序列,首先将这个序列分割成6位的字节序列,然后在每一位的高位补两个0,组成8位的字节序列,也就是转换后的字节长度增加了13;再讲补0后的二进制转换成Base64编码表中对应的值;

  • 填充0原理
  • base64编码收到一个8位字节序列,将这个二进制序列流划分成6位的块。二进制序列有时不能正好平均地分为6位的块,在这种情况下,就在序列末尾填充零位,使二进制序列的长度成为24的倍数(6和8的最小公倍数)。

    对已填充的二进制进行编码时,任何完全填充(不包括原始数组中的位)的6位组都有特殊的第65个符号"="表示。如果6位组是部分填充的,就将填充位设置为0.

    借用张亚涛的一个例子说明:

    a:a -- 011000 010011 101001 100001 -- YTph
    a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ==
    a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE=
    a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh

    如上,初始输入字符串为"a:a"为3个字节(24位)。24是6和8的倍数,因此按照上面给出的例子计算。无需填充就会得到base64编码为"YTph"。
    然而,再增加一个字符,输入字符串变为"a:aa",转换为二进制就会有32位长。而6和8的下一个公倍数为48.因此要添加16为的填充码。填充的前4位是与数据位混合在一起的。得到的6位组01xxxx,会被当作010000、十进制中的16,或者base64编码的Q来处理。剩下的两个6位组都是填充码,用=来表示。

    Base64参数说明

    DEFAULT:使用默认的方法来加密
    NO_PADDING:略去加密字符串最后的“=”
    NO_WRAP:略去所有的换行符(设置后CRLF就没用了)
    CRLF:使用CR LF这一对作为一行的结尾而不是Unix风格的LF
    URL_SAFE:加密时不使用对URL和文件名有特殊意义的字符来作为加密字符,具体以-和_取代+和/

    Base64解码

    Base64编码表

    索引 对应字符 索引 对应字符 索引 对应字符 索引 对应字符
    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 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

    * 参阅资料
    * [百度百科](https://baike.baidu.com/item/base64/8545775?fr=aladdin)
    * [https://segmentfault.com/a/1190000004533485?_ea=657625](https://segmentfault.com/a/1190000004533485?_ea=657625)

    Message-Digest Algorithm 5:(简称MD5)——信息-摘要算法

    传送至加密算法代码位置

    MD2、MD4、MD5区别

    MD2

    MD2算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。如果忽略了检验和将产生MD2冲突。MD2算法的加密后结果是唯一的,即没有重复。

    MD4

    MD4算法同样需要填补信息以确保信息的字节长度加上64后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位Damg?rd/Merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。

    MD5

    MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

    MD5原理

    MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

    MD5的特性

    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
    2、容易计算:从原数据计算出MD5值很容易。
    3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

    MD5应用场景

    md5算法主要运用在数字签名、文件完整性验证以及口令加密(安全访问认证)等方面。

    RSA加密


    RSA基本含义

    RSA加密算法是一种非对称加密算法。是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

    先生成一对RSA密钥,保密密钥用户保存,公开密钥可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

    RSA原理

    RSA涉及三个参数:N,e1,e2

    1.随机选择两个大质数p和q,p不等于q,计算N=pq;N的二进制表示时所占用的位数,就是所谓的密钥长度;
    2.根据欧拉函数,求得r=(p-1)*(q-1);
    3.选择小于r的e1,e1可以任意取,但要求e1与r互质;
    4.选择e2,e2为e1关于r的模反元素,即:(e1*e2)=1(mod r);
    4.销毁p,q;

    (n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。

    RSA加解密的算法完全相同,设A为明文,B为密文,则:A≡B^e2( mod n);B≡A^e1 (mod n);(公钥加密体制中,一般用公钥加密,私钥密)

    e1和e2可以互换使用,即:A≡B^e1 (mod n);B≡A^e2( mod n);

    RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

    其他说明

    * 典型密钥长度:1997年后开发的系统,用户应使用1024位密钥,证书认证机构应用2048位或以上;

    Secure Hash Algorithm(简称SHA)——安全散列算法


    加密代码传送

    * [SHA-1 Hash/Hmac加密]()

    SHA基本含义

    SHA主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。
    SHA家族的演算法,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3,其分别是:
    • SHA-0:1993年发布,当时称做安全散列标准(Secure Hash Standard),发布之后很快就被NSA撤回,是SHA-1的前身。

    • SHA-1:1995年发布,SHA-1在许多安全协定中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1的安全性在2000年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1。

    • SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。虽然至今尚未出现对SHA-2有效的攻击,它的演算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的杂凑演算法。

    • SHA-3:2015年正式发布,SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点。由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前演算法不同的,可替换的加密杂凑演算法,也就是现在的SHA-3。

      其中规定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过264二进制位的消息。SHA-384和SHA-512适用于长度不超过2128二进制位的消息。

    SHA-1

    SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”,所以对散列值的数字签名就可以视为对此明文的数字签名。

    SHA-1原理

    SHA-1是一种能够根据上限为2^64位的消息计算出160比特的散列值的单向散列函数,它的分组及对数据的填充方式与MD5是一样的,512位为1组,填充数据时先填1,后面填0,一直填满448位,最后64位表示原始数据长度。

    SHA-224

    暂时知道SHA-224不支持Android4.2.2版本

    持续更新中, 了解更多——GitHub传送门

    Android中加解密算法大全的更多相关文章

    1. AES加解密算法在Android中的应用及Android4.2以上版本调用问题

       from://http://blog.csdn.net/xinzheng_wang/article/details/9159969 AES加解密算法在Android中的应用及Android4.2以上 ...

    2. 讲讲网络模块中加解密那点儿事--AES+BASE64

      本篇文章已授权微信公众号 dasuAndroidTv(大苏)独家发布 这次想来讲讲网络安全通信这一块,也就是网络层封装的那一套加密.解密,编码.解码的规则,不会很深入,但会大概将这一整块的讲一讲. 之 ...

    3. DES加解密算法Qt实现

        算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为b ...

    4. AES加解密算法Qt实现

      [声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...

    5. C#加解密算法

      先附上源码 加密解密算法目前已经应用到我们生活中的各个方面 加密用于达到以下目的: 保密性:帮助保护用户的标识或数据不被读取. 数据完整性:帮助保护数据不被更改. 身份验证:确保数据发自特定的一方. ...

    6. [转]RSA,DSA等加解密算法介绍

      From : http://blog.sina.com.cn/s/blog_a9303fd90101cgw4.html 1)      MD5/SHA MessageDigest是一个数据的数字指纹. ...

    7. JavaScript与C#互通的DES加解密算法

      原文地址:传送门 本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DE ...

    8. Android中加载位图的方法

      Android中加载位图的关键的代码: AssetManager assets =context.getAssets(); //用一个AssetManager 对象来从应用程序包的已编译资源中为工程加 ...

    9. 3des加解密算法

      编号:1003时间:2016年4月1日09:51:11功能:openssl_3des加解密算法http://blog.csdn.net/alonesword/article/details/17385 ...

    随机推荐

    1. nodejs-stream部分

      参考: https://blog.csdn.net/eeewwwddd/article/details/81042225 http://nodejs.cn/api/stream.html#stream ...

    2. metamask源码学习-metamask-controller.js

      The MetaMask Controller——The central metamask controller. Aggregates other controllers and exports a ...

    3. 升级pip后出现ImportError: cannot import name main

      https://blog.csdn.net/accumulate_zhang/article/details/80269313

    4. vue自定义指令(Directive中的clickoutside.js)的理解

      阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DOM 操 ...

    5. ESP32 TIMER

      ESP32有两组硬件计时器组,每组包含两个通用硬件计时器.这些计时器都是64位的可双向计数的计数器: 下面的步骤是典型的配置和操作定时器流程: 第一:初始化: 初始化定时器通过函数:timer_ini ...

    6. spring-cloud-starter-feign 等jar无法reimport的解决方案

      <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &l ...

    7. node 文件操作

      对文件的各种操作,使用姿势如下 文件操作单例 @example fu.exist(file); //是否存在 fu.copy(file, 'new-path'); //复制到某个新目录 fu.move ...

    8. Java多线程编程模式实战指南(三):Two-phase Termination模式

      停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它线程) ...

    9. 认识ASP.NET Windows身份认证

      本文摘自:细说ASP.NET Windows身份认证 Forms身份认证虽然使用广泛,不过,如果是在 Windows Active Directory 的环境中使用ASP.NET, 那么使用Windo ...

    10. Python基础语法复习

      1.数据类型 List 列表 函数 append(): 在列表末尾追加. count(): 计算对象在列表中出现的次数. extend():将列表内容添加到列表中. index(): 计算对象在列表中 ...