Quorum加密技术分析

简介

Quorum 是由 JPMorgan 推出的一种分布式账本协议,它为金融、供应链、零售、房地产等行业提供支持隐私交易和隐私合约的以太坊联盟链实现。Quorum充分复用了以太坊已经完成的一些工作,在本文中讨论的加密技术即是以太坊基础技术之一的密码学 cryptography。它是数学的一个分支,广泛应用于计算机安全。加密也可以用来证明秘密的知识而不泄露该秘密(数字签名),或者证明数据的真实性(数字指纹)。这些类型的密码学证明是以太坊和大多数区块链系统的关键数学工具,广泛用于以太坊应用。

1.数字密钥

ether的所有权通过数字密钥 digital keys,以太坊地址和数字签名建立。数字密钥实际上并不存储在区块链中或在网络上传输,而是由用户创建并存储在文件或用户钱包中。用户钱包中的数字密钥完全独立于以太坊协议,可以由用户的钱包软件生成和管理,无需访问互联网。数字密钥可实现以太坊的许多特性,包括去中心化的信任和控制以及所有权证明。

数字密钥成对组成,私钥和公钥。将公钥视为类似于银行帐号,私钥类似于私密PIN,用于控制帐户。

1.1 私钥

私钥只是一个随机选取的数字。私有密钥的所有权和控制权是用户控制与相应以太坊地址相关联的所有资金的基础。为了证明交易中使用的资金的所有权,私钥用于创建花费ether所需的签名。私钥在任何时候都必须保密,私钥还必须备份并防止意外丢失。如果它丢失了,无法恢复,它保护的资金也将永远丢失。

生成私钥的第一步也是最重要的一步就是找到一个安全的熵源或随机源。创建以太坊私钥基本上与随机选择1到2的256次方之间的数字相同,只要不可预测和不可重复,用于选择该数字的确切方法并不重要。以太坊软件使用底层操作系统的随机数生成器生成256位熵(随机性)。

更确切地说,可能的私钥范围略小于2的256次方。在以太坊中,私钥可以是1和n-1之间的任何数字,其中n为椭圆曲线的阶数的常数(n = 1.158*1077,略小于2的256次方),后续会对椭圆曲线密码学进行解释。为了创建这样的密钥,我们随机选择一个256位数字并检查它是否小于n-1。在编程方面,这通常是通过将从密码学安全的随机源收集的随机串提供给256位哈希算法(如Keccak-256或SHA256),产生一个256位数字。如果结果小于n-1,则我们获得了一个合适的私钥,否则,我们需再次尝试使用另一个随机数,直到满足条件。

以下是以十六进制格式显示的随机生成的私钥(256位,显示为64个十六进制数字,每个4位):
f8f8a2f43c8376ccb0871305060d7b27b0554d2cc72bccf41b2705608452f315

1.2 公钥

以太坊公钥是一个椭圆曲线上的点,意思是它是一组满足椭圆曲线方程的X和Y坐标。简单来说,以太坊公钥是两个数字并联在一起。这些数字是通过一次单向的计算从私钥生成的。这意味着,如果拥有私钥,则能够轻易的计算出公钥。但是不能从公钥中计算私钥。

例如,计算两个大素数的乘积很简单,但是给定两个大素数的乘积,很难找到这两个素数(素因式分解问题)。如果你知道一些秘密信息,这些数学函数可以很容易地被反转。在上面的例子中,如果告诉一个素数是2617,可以简单地用除法找到另一个:7173197/2617 =2741。这样的函数被称为trapdoor函数,因为给定一个信息,可以使得反转该函数很简单。

公钥使用椭圆曲线乘法和私钥计算,这是不可逆的:K = k * G,其中k是私钥,G是一个称为generator point的常数点,结果K是公钥。在仅仅知道K的情况下,那么寻找k的逆运算就只能靠蛮力搜索可能的k值,十分困难。

椭圆曲线乘法是密码学家称之为“单向”函数的一种函数:在一个方向(乘法)很容易完成,而在相反方向(除法)不可能完成。私钥的所有者可以很容易地创建公钥,然后与其他人共享,因为没有人能够反转该函数并从公钥计算私钥。这种数学技巧成为证明以太坊资金所有权的不可伪造和安全数字签名的基础。

1.3 椭圆曲线密码学

椭圆曲线密码学是一种基于离散对数问题的非对称或公钥密码体系,如椭圆曲线上的加法和乘法运算。以太坊使用是由NIST制定的secp256k1标准中所定义的椭圆曲线和一组数学常数。

以下是secp256k1椭圆曲线的几个实现:

OpenSSL库提供了一套全面的加密原语,包括secp256k1的完整实现。

libsecp256k1是secp256k1椭圆曲线和其他密码原语的C语言实现,比OpenSSL具有更优越的性能和安全性。

关于椭圆曲线密码学的可以借由相关工具和库进行使用,本文不进行详细讨论,感兴趣的读者可以自行了解。

2 加密哈希函数

加密哈希函数在整个以太坊都有使用。事实上,哈希函数几乎在所有密码系统中都有广泛应用,这是密码学家布鲁斯•施奈尔(Bruce Schneier)所说的一个事实:单向哈希函数远不止于加密算法,而是现代密码学的主要工具。

简而言之,哈希函数是可用于将任意大小的数据映射到固定大小的数据的函数。哈希函数的输入称为原象pre-image或消息 message。输出被称为哈希hash或摘要digest。哈希函数的一个特殊类别是加密哈希函数,它具有密码学的特定属性。

加密哈希函数是一种单向哈希函数,它将任意大小的数据映射到固定长度的串,理论上不可能通过输出获取到输入。确定输入的唯一方法是对所有可能的输入进行蛮力搜索,检查匹配输出。

加密哈希函数有五个主要属性 :

确定性
任何输入消息总是产生相同的哈希摘要。

可验证性
计算消息的哈希是有效的(线性性能)。

不相关
对消息的小改动(例如,一位改变)会大幅改变哈希输出,以致它不能与原始消息的哈希相关联。

不可逆性
从输出哈希计算输入信息是不可行的,相当于通过可能的消息进行蛮力搜索。

碰撞保护
两个不同的消息产生相同的哈希输出理论上是不可能的,碰撞保护对于防止以太坊中的数字签名伪造至关重要。

2.1 以太坊的加密哈希函数Keccak256

以太坊在许多地方使用Keccak-256加密哈希函数。Keccak-256是于2007年举行的SHA-3密码哈希函数竞赛的获胜者。

在以太坊开发期间,NIST调整了Keccak的一些参数,据称可以提高效率,实际上是故意削弱了随机数生成器标准,在标准随机数生成器中放置一个后门(FIPS-202 SHA-3标准),存在信息安全的问题。因此以太坊决定实施最初的Keccak算法。

由于以太坊中使用的哈希函数(Keccak-256)与最终标准(FIP-202 SHA-3)之间存在差异,如何判断你使用的软件库是FIPS-202 SHA-3还是Keccak-256?最常用于哈希函数的测试是输入一个空串。如果你使用空字符串作为输入运行哈希函数,应该会有以下结果:

Keccak256("") =c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470SHA3("") =a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

因此,无论调用什么函数,都可以通过运行上面的简单测试来测试它是否是原始的Keccak-256或最终的NIST标准FIPS-202 SHA-3。

2.2 以太坊地址

以太坊地址是唯一标识 unique identifiers,它们是使用单向哈希函数(Keccak-256)从公钥或合约生成的。

首先从一个私钥开始,并使用椭圆曲线乘法来生成一个公钥:

k = f8f8a2f43c8376ccb0871305060d7b27b0554d2cc72bccf41b2705608452f315K = 6e145ccef1033dea239875dd00dfb4fee6e3348b84985c92f103444683bae07b83b5c38e5e2b0c8529d7fa3f64d46daa1ece2d9ac14cab9477d042c84c32ccd0

接下来使用Keccak-256来计算这个公钥的hash:

Keccak256(K) = 2a5bc342ed616b5ba5732269001d3f1ef827552ae1114027bd3ecf1f086ba0f9

然后我们只保留最后的20个字节(大端序中的最低有效字节),这就是我们的以太坊地址:

001d3f1ef827552ae1114027bd3ecf1f086ba0f9

大多数情况下,你会看到带有前缀“0x”的以太坊地址,表明它是十六进制编码,如下所示:

0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9