第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实战》二维码

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

  1. 区块链技术架构 java_《区块链底层设计Java实战》之第二章区块链架构

    第2 章   区块链架构 会当凌绝顶  一览众山小 正如开篇所言:会当凌绝顶,一览众山小.进入区块链底层开发前,我们需要 了解区块链底层的通用架构是如何设计的,从上而下地审视区块链底层的结构,做 到了 ...

  2. 开发基于以太坊的区块链底层平台,秘猿科技想做共识数据时代的Oracle

    "与其说区块链是比特币的底层技术,不如说比特币是区块链技术的第一个成功的应用."秘猿科技的创始人谢晗剑这样看待区块链和比特币的关系. 秘猿科技是一家从事底层区块链平台开发和共识算法 ...

  3. 雄安,杭州政府自建区块链底层平台 自建、外包、加入三种模式谁是未来

    文丨互链脉搏·黑珍珠号 未经授权,不得转载! 在科技公司为政府开拓出逐渐明确的区块链治理之路后,城市政府开始尝试自建底层平台. 11月17日,雄安发布消息,将积极探索搭建自主知识产权的区块链底层基础平 ...

  4. CSDN技术分享——程序员如何快速上手区块链底层技术?

    区块链,应该是这两年来最火的话题.相比去年年末到今年年初,其火热程度虽有所降低,但依旧会有很多人想了解,想探寻其中的奥秘. 令人尴尬的是,真正火起来的不是区块链技术本身,而是数字资产和相关炒作.你跟  ...

  5. [区块链安全-Ethernaut]区块链智能合约安全实战-已完结

    [区块链安全-Ethernaut]区块链智能合约安全实战-已完结 准备 0. Hello Ethernaut 准备工作 创建实例并分析 合约交互 总结 1. Fallback 创建实例并分析 合约交互 ...

  6. 《如何开发区块链底层平台》-- 同济创业谷PPIO CodeTalks区块链技术分享会

    摘要:2019年11月26日,同济创业谷与 PPIO CodeTalks 联合举办了<创新X - 区块链与创新创业>区块链技术分享会. 在本次分享会中,我们有幸邀请到了四位重量级嘉宾来做主 ...

  7. 简述区块链架构设计,通俗易懂

    简述区块链架构设计,通俗易懂 首先,支持一下阿里云:阿里云ECS服务器,有幸运券了:有缘的朋友们,可以前来领取: https://promotion.aliyun.com/ntms/act/ambas ...

  8. 全新升级,《区块链技术进阶与实战(第2版)》正式上市

    (第 1 版亮相央视新闻联播) 2018 年下半年,浙江大学计算机学院首次推出"区块链与数字货币"课程.作为课程指定教材,<区块链技术进阶与实战(第1版)>面向广大区块 ...

  9. BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏)

    BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏) 导读 基于Python编程,实现一步一步实现(流程最清楚)区块链底层技术流程图,理解一目了然 ...

最新文章

  1. CLion 2017 注册码
  2. Xcode10:Implicit declaration of function '' is invalid in C99
  3. Andorid中的HAL
  4. 博客会被搬去csdn
  5. db2 创建样本数据库_db2创建数据库
  6. Java中值传递和引用传递原理以及区别
  7. 整理:Android apk 框架 布局 集锦
  8. sysv-rc-conf --- Linux设置开机自动启动
  9. 油猴安装错误问题(下载中断问题)及脚本安装
  10. matlab 兼容,matlab版本兼容问题
  11. python求梯形面积_python计算梯形面积
  12. selenium 复制粘贴
  13. APP限制录屏怎么办?如何绕过APP录屏限制和截图限制-支持安卓和IOS
  14. T32 获取电脑Product ID
  15. 未来已来,云上安全SaaS化势不可挡
  16. cad工具箱详细讲解_CAD工具箱的12种功能详解
  17. adc 采样时间 采样周期数 采样频率计算(以stm32为例)
  18. Redis学习笔记(四):配置文件详细说明(redis-3.2)
  19. 十一、Cadence ic 617以及assura使用总结
  20. 【windows】Xshell使用

热门文章

  1. 七牛 js JDK使用 - 上传APP
  2. 【分享】如何轻松对接快递物流单号查询api接口
  3. 关于政府网站的设计心得
  4. MVC5+EF6 入门完整教程六
  5. cpu为什么是计算机核心,小科普:为啥电脑CPU核心数都是双数
  6. 《工程伦理》-雨课堂 课后练习答案
  7. 在PHP中应用AJAX技术检测用户名是否重复
  8. 在阿里云IIS服务器上安装证书
  9. R统计绘图-rgbif包下载GBIF数据及绘制分布图
  10. 电厂机器人科远股份_科远股份凝汽器在线清洗机器人