“数据加密是联邦学习的一个重要环节,对于数据隐私保护起着至关重要的作用,本期推送将介绍常用的加密算法,并且给出部分加密算法基于Java的算法实现。”——来自“云时代架构”
01 加密算法的主要类别
常用的加密算法有对称加密算法,非对称加密算法,哈希算法等。
对称加密,加密和解密是对称的,加密时用一个秘钥去加密,解密时用同一个秘钥去解密,由信息发送方和接收方共同约定一个秘钥。缺点是风险都在这个秘钥上面,一旦秘钥被窃取,信息会暴露,所以安全级别不够高。常用对称加密算法有DES,3DES,AES等。
非对称加密,顾名思义就是加密与解密的过程不是对称的,不是用同一个秘钥。非对称加密有公私钥对的概念,也就是有两把秘钥,一把是公钥,一把是私钥,一对公私钥有固定的生成方法,在加密的时候,用公钥去加密,接收方再用对应的私钥去解密。使用时可以由接收方生成公私钥对,然后将公钥传给加密方,这样私钥不会在网络中传输,没有被窃取的风险。通过和对称加密的对比,可以看到,非对称加密解决了秘钥传输中的安全问题。常用非对称加密算法有RSA,ECC等。
哈希算法,简单说就是将任意数据都转换成一个固定长度的字符串,通过哈希后的值几乎无法推导出原文,而且两个不同的原文哈希后结果一定不同。常用算法有MD5,SHA-256等等。
此外,Base58和Base64也是常用的加密算法,下面将对常用的加密算法进行详细介绍。
02 常用加密算法详解
1、 MD5
MD5是哈希算法的典型代表,全称叫Message-Digest Algorithm 5,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一,基本原理是将数据运算为另一固定长度值,MD5的前身有MD2、MD3和MD4。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式,即把一个任意长度的字节串变换成一定长的十六进制数字串。Java的JDK就自带了MD5加密算法,可以直接调用,使用非常方便。
MD5算法具有以下特点:
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
- 容易计算:从原数据计算出MD5值很容易。
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
- 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
2、SHA-256
SHA-256也属于哈希算法,是安全散列算法(Secure Hash Algorithm,简称SHA)的一种。SHA算法是一个密码散列函数家族,SHA算法能计算出一个数字消息所对应到的、长度固定的字符串,且若输入的消息不同,它们对应到不同字符串的机率很高。SHA家族包括五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512。
说简单来说,SHA-256算法就是将一个对象的多个关键不重复信息组合起来,通过算法生成一个加密字符串。下面是Java中SHA-256算法的具体内容:
![05bd038b2d3116c0caede975e9f9c1e0.png](https://i-blog.csdnimg.cn/blog_migrate/2400613fb743b16377cf19eee5e76994.jpeg)
下面是算法的测试类内容:
![d50abded1af39fe0867533f2730f5ab5.png](https://i-blog.csdnimg.cn/blog_migrate/5e965798de499ae47e51ad1b1250cfcb.jpeg)
运行可以看到如下结果:
![80bec70bf3980b4bba29aeb363f9f9be.png](https://i-blog.csdnimg.cn/blog_migrate/01a26d61de455fbfee792b551b820075.jpeg)
3、Base64&Base58
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,是一种基于64个可打印字符来表示二进制数据的方法。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在Java的Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL中的形式。此时,采用Base64编码具有不可读性,需要解码后才能阅读。
Java中使用Base64也非常简单,jdk的工具包中自带Base64的工具类,先新建一个工具类:
![1ca0b008dbd7f057d2cbc4248b480757.png](https://i-blog.csdnimg.cn/blog_migrate/ad8413fd2b4e9429bda041ddc21bea6e.jpeg)
Base64的加密过程是可逆的,加密解密内容如下:
![31fef341340ce59b327dbe823131a280.png](https://i-blog.csdnimg.cn/blog_migrate/653d7ee4d801a09479273a9abafba2cd.jpeg)
可以看到使用非常简单,下面是测试类内容:
![1982caf2218d9005e83b35765d30e74f.png](https://i-blog.csdnimg.cn/blog_migrate/b470b1239be7572409d82b31d92a630b.jpeg)
执行测试方法,结果如下:
![b827213d8c40c417ab9ebcc064e9779c.png](https://i-blog.csdnimg.cn/blog_migrate/5f01e7cd61015117e996f86a16069c1e.jpeg)
Base58和Base64类似,也是一种将二进制转为可视字符串的算法,它和Base64的主要区别是,转换出来的字符串去除了几个看起来会产生歧义的字符,如 0 (零), O (大写字母O), I (大写的字母i) and l (小写的字母L) ,和几个影响双击选择的字符如“/”和“+”,结果字符集正好58个字符(包括9个数字,24个大写字母,25个小写字母)。Base58是站在使用者的角度考虑的,比Base64更加人性化。
Java中Base58算法的使用也很便捷,新建一个Base58的工具类,目录结构如下:
![6cb2d750de9ed9db14839fe06727a76c.png](https://i-blog.csdnimg.cn/blog_migrate/5cea4b9272cddb64b9215d749940067d.jpeg)
工具类的大概内容结构如下:
![c39e28bef259ceb245c3426e76aaa977.png](https://i-blog.csdnimg.cn/blog_migrate/369179cadf1bc3dec70862d78e7d8fa3.jpeg)
下面是测试代码:
![5210a527ec5ce093bfe827c455e78301.png](https://i-blog.csdnimg.cn/blog_migrate/a04d5d77813920da02a25aeb298a9d44.jpeg)
运行结果如下:
![5a0462fbb0120bcb15aafeb51c9907be.png](https://i-blog.csdnimg.cn/blog_migrate/4bf32309742934b8701f8d60cfae7498.jpeg)
更详细的内容可查看项目代码:https://github.com/guoyb1990/btc-demo.git
-END-
本文非联邦学习原创文章,转载请联系原公众号云时代架构获得授权。
投稿或寻求报道:fedlearningai@163.com
![ebef8733a9ead37530de188def746326.png](https://i-blog.csdnimg.cn/blog_migrate/6b1f044565d5c76d1120096af09d1721.jpeg)
长按扫描上方二维码加关注,
为您送上源源不断的前沿知识!