`

《区块链底层设计Java实战》之第三章密码学

阅读更多

第3 章 密码学

九层之台,起于累土  千里之行,始于足下

 

第3 章 密码学 .................................................................................................... 20

3.1 加密与解密 ............................................................................................... 21

3.1.1 加密与解密简介 ........................................................................... 21

3.1.2 Java 实现 ...................................................................................... 22

3.2 哈希 ........................................................................................................... 46

3.2.1 散列函数简介............................................................................... 46

3.2.2 SHA-256 Java 实战 ...................................................................... 47

3.3 Merkle 树 .................................................................................................. 50

3.3.1 Merkle 树简介 .............................................................................. 50

3.3.2 Merkle 树Java 实战 ..................................................................... 52

3.4 小结 ........................................................................................................... 63

 

密码在日常生活中屡见不鲜,购物支付用支付密码、在ATM 机取款要用取款密

码、手机屏幕解锁要用解锁密码,等等。

 

密码学一词源自希腊文kryptos 及logos,在希腊语中意为隐藏及消息。世界上最

早的密码是在公元前405 年,古希腊雅典和斯巴达之间的伯罗奔尼撒战争末期。在

斯巴达军队准备对雅典发动最后一击之际,战前与斯巴达联盟的波斯帝国突然准备

反戈一击。为此斯巴达急需摸清波斯帝国的行动部署。恰巧,斯巴达军队捕获了一

名从波斯帝国回雅典送信的雅典信使。从信使身上搜出一条布满杂乱无章的希腊字

母的腰带,斯巴达军队统帅莱桑德无意中把腰带缠绕在手中的剑鞘上时,竟然发现

腰带上那些杂乱无章的字母组成了一段文字。这便是雅典间谍送回的情报,原来波

斯军队准备在斯巴达军队发起最后攻击时,对斯巴达军队进行突袭。斯巴达军队根

据这份情报马上改变了作战计划,以迅雷不及掩耳之势击溃了毫无戒备的波斯军队,

从而解除了后顾之忧。随后,斯巴达军队回师征伐雅典,最后赢得了战争的胜利。

 

而在我国古代,藏头诗可谓是密码学的另一种浪漫应用了。

 

时代车轮滚滚向前,密码学的发展也蒸蒸日上。随着现代信息社会的到来,密

码学的作用也愈发重要。特别是很多信息都必须经过加密之后才能在互联网上传送,

这都离不开现代密码技术。现代密码技术在信息加密、信息认证、数字签名和密钥

管理方面都有很多应用。

 

区块链技术也离不开密码学,可以说密码学是区块链系统的基石之一。

从本章起,我们将逐步介绍区块链系统的各个核心模块的实现逻辑。

 

3.1 加密与解密

3.1.1 加密与解密简介

加密与解密技术是对信息进行编码和解码的技术。编码的过程即加密的过程,

加密模块把可读信息(即明文)处理成代码形式(即密文)。解码的过程即解密的过

程,解密模块把代码形式(即密文)转换回可读信息(即明文)。在加密和解密的过

程中,密钥是非常关键的角色。

 

目前,加密技术主要分为对称加密、不对称加密和不可逆加密三类算法。

对称加密算法是应用较早的加密算法,技术十分成熟。在对称加密算法中,加

密和解密的密钥相同。对称密钥技术有两种基本类型:分组密码和序列密码。

对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。不足

之处是,交易双方使用相同的密钥,安全性得不到保证。目前,广泛使用的对称加

密算法有DES、3DES、IDEA 和AES 等,其中,美国国家标准局倡导的AES 即将作

为新标准取代DES。

 

不对称加密算法使用两把完全不同但又完全匹配的一对钥匙,称之为公钥和私

钥,公钥和私钥成对配合使用。目前,广泛应用的不对称加密算法有RSA 算法和美

国国家标准局提出的DSA。我们常见的数字签名(Digital Signature)技术就是以不

对称加密算法为基础的。虽然不对称加密算法的安全性得到了提高,但相较于对称

加密算法,加密速度慢、效率低。

 

不可逆加密算法的使用和上述两类算法略有不同,加密过程中不需要使用密钥,

输入明文后由系统直接经过加密算法处理成密文,加密后的数据是无法被解密的,

只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文

并被系统重新识别后,才能真正解密。目前,应用较多的不可逆加密算法有RSA 公

司发明的MD5 算法和由美国国家标准局建议的不可逆加密标准SHS(Secure Hash

Standard,安全Hash 标准)等。

 

3.1.2 Java 实现

 

我们既可以基于Java 原生实现加密和解密,又可以基于第三方的工具包实现。

下面我们首先介绍基于Java 原生API 的实现方法,接着介绍第三方工具包hutool

和Tink 的加密解密API 使用方法。

 

1.Cipher 类

Java 中的Cipher 类主要提供加密和解密的功能,该类位于javax.crypto 包下,声

明为 public class Cipher extends Object,它构成了Java Cryptographic Extension (JCE)

框架的核心。

 

代码详见书中

 

3.Hutool 简介

在Java 世界中,AES、DES 的加密解密需要使用Cipher 对象构建加密解密系统,

有没有更好的封装工具类来简化开发呢?当然有!Hutool 就是一个好助手。

 

Hutool 是一个实用的Java 工具包,有pom.jar、javadoc.jar 和sources.jar 等文件,

可对文件、流、加密解密、转码、正则、线程、XML 等JDK 方法进行封装,组成各

种Util 工具类。适用于Web 开发,与其他框架无耦合,高度可替换。

 

在加密解密这部分,Hutool 针对JDK 支持的所有对称加密算法都做了封装,封

装为SymmetricCrypto 类,AES 和DES 是此类的简化表示。通过实例化这个类,传

入相应的算法枚举即可使用相同方法加密解密字符串或对象。

 

当前Hutool 支持的对称加密算法枚举有:

 AES

 ARCFOUR

 Blowfish

 DES

 DESede

 RC2

第3 章 密码学 ∣ 33

 PBEWithMD5AndDES

 PBEWithSHA1AndDESede

 PBEWithSHA1AndRC2_40

这些枚举全部在SymmetricAlgorithm 中被列举。

 

对于不对称加密,最常用的就是RSA 和DSA,在Hutool 中使用AsymmetricCrypto

对象来负责加密解密。

 

代码详见书中

5.Tink 简介

Tink 是由谷歌的一群密码学家和安全工程师编写的密码库。GitHub 开源地址:

https://github.com/google/tink/。

 

Tink 的诞生融合了Google 产品团队的丰富工程经验,现已修复了原有实现中的

缺陷,并提供了简单的API,用户可以安全使用,无须具备密码学知识背景。

Tink 提供了易于正确使用且不易被误用的安全API。Tink 通过以用户为中心的

设计、严谨的代码实现和代码审查以及广泛的测试,显著减少了工程开发中常见的

密码陷阱。在谷歌,Tink 已经被用来保护许多产品的数据,如广告、谷歌薪酬、谷

歌助理、Firebase、Android 搜索应用等。

 

使用Tink 最简单的方法是安装Bazel,然后构建、运行和播放GitHub 中预设的

hello world 示例。

 

Tink 通过原语执行加密任务,每个原语都是通过指定原语功能的相应接口定义

的。例如,对称密钥加密是通过AEAD 原语(带有关联数据的认证加密)提供的,

它支持两种操作:

1)加密(明文,associated _ data),加密给定明文(使用associated _ data 作为

额外的AEAD 输入),并返回结果密文。

2)解密(密文,associated _ data),它解密给定的密文(使用associated _ data

作为额外的AEAD 输入),并返回结果明文。

 

目前,Tink 的Java 语言版、Android 语言版、C++语言版和Obj-C 语言版都已通

过了严格的测试,并已投入生产部署。当前Tink 的最新版本是1.2.0,发布于2018

年8 月9 日。此外,Tink 的 Go 语言版本和JavaScript 语言版本正在积极开发中。

 

6.Tink 的使用

Tink 可以通过Maven 或Gradle 来实现依赖管理。在Maven 中,Tink 的 group ID

是com.google.crypto.tink,artifact ID 是tink。

 

代码详见书中

 

  

《区块链底层设计Java实战》二维码



 

  • 大小: 1.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics