查看原文
其他

文科生也必须看得懂的非对称加密算法原理和简史,加密钱包中的公钥和密钥到底啥关系?

稻盛匹夫 传DAO士 2022-11-29

“如果你看不懂一件事,那么就放到更大的时空中去追寻答案;

所谓:调整一下咱们的时空比例尺。”  

—— 稻盛匹夫

看了@王建硕 写了两篇关于非对称加密算法的数学领域,用吃奶的劲试着解释加密算法的数学原理,结果失败了,以至于需要写第二遍(有人没看懂?再次尝试讲解 RSA 加密算法)。他说写的吃奶的费劲;看评论区,读者的反馈大致意思是:吃奶者,行百里者半五十。

为什么会这么费劲呢?我理解建硕的写法是一个典型的、常用的抽丝剥茧(由简入繁)的写作和答题手法;有没有可能更简单的方法是:剥茧抽丝呢?先剥茧,再抽丝;先理解鸡为什么要下蛋?蛋为什么要能孵出鸡?然后再试图理解先有鸡还是先有蛋?行不行?咱们试试。

公钥和私钥的价值是什么?

答;用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密。

为什么需要这么费劲的加密法(一种不可逆的算法)?

因为在非对称加密出现之前,人们一直是用对称加密,也就是加密和解密使用同一套密码。这种传统的加密算法有重大缺陷——解密方必须获得加密密钥。所以,这种算法的安全性取决于加密密钥的保存情况,但要求每个持有密钥的人都保守秘密是不可能的,如果一个用户使用的密钥被入侵者所获得,入侵者便可以读取该用户密钥加密的所有信息,安全性便无从谈起。

号称最难破译的是二战时候德军的 Enigma 密码机,其核心在于转子的自动转动,当使用者加密一个字母后,右边的转子会自动转动一格,每当它转够26格,会带动中间的转子转动一格,当中间的转子转动够26格,又会带动左边的转子转动一格。这意味着,这张字母代换表,每被使用一次,就会做出改变!并且,德国人每天都会更换转子和插线板的设置(德军提前准备了一整年的设置表格),因此破译时效也只有一天。

来自wiki,二战时德军Enigma机器

在电影《模仿游戏》(The Imitation Game)中讲述了1940年,图灵协助盟军破译德国密码系统 Enigma,帮助盟军破译纳粹德国的军事密码,从而扭转二战战局的真实故事。

因为 Enigma 机有一个致命的弱点,那就是一个字母加密后不可能是它本身!德国人认为这是一个优点,毕竟一个字母加密成自身等于没有加密。但是这个特点,被盟军狠狠利用了。

来自wiki,二战时德军Enigma密钥表

德国人发报都会有固定的格式,比如在开头的某个位置会有“天气预报”(德语 wetterbericht)的字样。因此可以用这一段已知的明文来做出攻击,密码学上称为“已知明文攻击”。再次强调,在 Enigma 密码里,一个字母不会被加密为自身,如果能确定明文出现的大概位置,完全可以用明文在电文的某个区间逐个比较明文和密文的字母,找到一个位置,满足“明文的所有字母不被加密为自身”,如果明文足够长,这样的位置是容易确定的,因此可以认为找到了这段明文对应的密文,进而推算出整个密码表。

电影《模仿游戏》海报

而非对称加密算法中,加密和解密用的是不同的密钥,也就是说,持有公开密钥的人,不需要获得私密的加密密钥,也能完成解密。

假如汉献帝有了这套算法,传消息给刘备就不怕被曹操截获了。大致过程如下:

汉献帝将公钥告知天下,并宣布凡是要与自己通信的,只需要将文档用公钥加密即可。

假如刘备要和汉献帝取得联系,只需要将文档用汉献帝的公钥加密,再发送邮件给汉献帝,汉献帝就可以用自己的私钥解密邮件中的文档。

整个过程,刘备不需要汉献帝的密钥。

而汉献帝也同样拿到刘备的公钥,并用于加密回信,当然也不会有人能解密回信了。

因为公钥只能加密不能解密,曹操或其他拿到汉献帝或刘备公钥的人,即便获取了加密邮件,也无法解密文档,从而保证了信件的安全性。

历史从此改写!!!

这样的算法是什么天才想出来的呢?

加密算法发展史

我们来回顾一下非对称加密简史(同时也是数字货币的简史,为什么,且听下文分解)(扩展阅读:2022你看得懂的“数字货币简史”

1976年,经济学家哈耶克出版了他人生中最后一本经济学方面的专著:《货币的非国家化》。哈耶克在书中所提出的非主权货币、竞争发行货币等理念,是去中心化货币的精神指南。

···

追求人类永生的逆熵者们(Extropian)提出需要加密货币,因为他们高度赞同新自由主义经济学说,认为人类无法引导市场,必须抵制、颠覆和拒斥政府对市场的任何干预,所以需要一种能够摆脱政府控制、保护交易隐私的货币。于是, Extropian (他们是谁?有啥丰功伟绩,见上扩展阅读)设想了一种由 Extropolis 虚拟银行发行的加密货币,它可以通过加密技术保障数据安全并且实现不被监管的私人交易。但是,三十年过去了, Extropian 的研究所早已关停,他们自己的加密货币也没有落地推广。

当时,数字货币的产生条件确实还不具备,其中的一个原因就是密码学的技术还比较落后,没有达到可以应用的水平。

早在1949年,香农发表了《秘密体制的通信理论》一文,标志着加密算法的重心转移往应用数学上的转移。于是,逐渐衍生出了当今重要的三类加密算法:非对称加密、对称加密以及哈希算法(HASH严格说不是加密算法,但由于其不可逆性,已成为加密算法中的一个重要构成部分)

不过,在1976-1991这15年,密码学才真正取得了重大突破,可以开始应用于电子货币和数字货币(历史演进的过程中充满了丝丝入扣的巧合,也就是所谓的时势造英雄——稻盛匹夫)

首先,Bailey W. Diffie、Martin E. Hellman两位密码学的大师发表了论文《密码学的新方向》,论文覆盖了未来几十年密码学所有的新的进展领域,包括非对称加密、椭圆曲线算法、哈希等一些手段,奠定了迄今为止整个密码学的发展方向,并且论证了它们之间的关系:利用计算复杂性问题可以构造陷门单向函数,进一步可以构造公钥密码学,而公钥密码学可以实现加密和认证功能。后续的研究一步步地实现了这些功能。

虽然 Diffie 和 Hellman 并没有提出其中任何一种具体的公钥加密算法,但确实从思想上说清楚了研究方向。

1977年,Ron Rivest,Adi Shamir 和 Leonard Adleman 这三个 MIT 的教授真正提出了一个公钥加密/数字签名算法,也就是 RSA 算法。

RSA 算法

我们来真实地感受一下 RSA 算法非对称加密的艺术。

这种算法跟质数分不开。

现在给你 13 17 两个质数,让你算出它们的乘积,很容易算出是 221

但如果告诉你 221 这个数字,要求你算出这是哪两个质数的乘积,就比较难了。你得翻一翻质数表,才能知道原来这两个数是 1317

这只是两位数质数的乘积,如果是几十位、上百位甚至上千位的质数乘积呢?逆向推理就变得十分困难。现在数学上没有什么简单的算法,基本上就是一个个试。随着乘积的不断变大,尝试的成本急速增加。

举个五位数质数相乘的例子,请问 9936899831 是哪两个质数的乘积?

虽然有困难,但通过计算机,还是可以得出这两个数是 99679 99689 。但如果是上千位数,就十分困难了。

这个算法,就是著名的 RSA 非对称性加密算法,也是密码学里面最常用的一种算法。

这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长 RSA 密钥是 232 个十进制位,也就是 768 个二进制位,因此可以认为,1024 位的 RSA 密钥基本安全,2048 位的密钥极其安全,以现在计算机的算力(算力的问题也是消耗能量的问题),要对一个 2048 位的数字进行暴力破解,至少要用上几百年的时间,可以被认为是无法破解的。所以,这样的模型目前是能保证 2048 位的密钥安全的,即使量子计算机出现重大突破, 把位数再增加到 3000 多位也够了。

(目前找到的最大质数是 2^74207281 - 1,即2的74207281次方减1。该质数有2233万位数。2018年,日本人居然把这个数印成了一本 719 页的书。)

RSA算法被发明出来后,距离第一个真正的数字货币的诞生又等了32年,孕育的过程太难了,需要有工作量证明机制、支付网络、哈希算法、智能合约等,还需要包括分布式网络技术。

2008年是加密货币元年,中本聪就像是搭建了一个宏伟的乐高建筑,把上述的技术拼在一起,基于之前设计的图纸,加以完善。2010 年,中本聪在 Bitcointalk 论坛上写道:“比特币是戴伟于 1998 年在密码学朋克邮件列表中提出的 B-money 构想以及尼克·萨博提出的 Bit Gold 构想的实现。”

比特币需要什么样的加密法?且如何做到“用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密;且私钥不可破解?”

答案是:无论用什么方法,必须找找到两个数字 e 和 d,e 公开给整个世界,d 留给自己,同时还能让任何数字 m 的 e 次方的 d 次方还等于原来这个 m,bingo!用公式表达:m ^ (k * φ(n) + 1) ≡ m

那么世界上有没有这样的公式呢?还真有;

解释一下:

欧拉定理 :如果两个正整数m和n互质,那么m的φ(n)次方减去1,可以被n整除。莱昂哈德·欧拉(Leonhard Euler ,1707年4月15日~1783年9月18日),瑞士数学家。数学史上公认的4名最伟大的数学家分别是:阿基米德牛顿欧拉高斯。史上四强之一!

从欧拉定理走到RSA算法的可操作时间点,大约需要220年;你可能看得懂/或者看不懂以上的推理过程,这个不重要。

具体是如何加密和解密的呢?我们现在可以举例子了;因为剥茧抽丝的前奏已经完成;

为了方便计算和理解,我们还是使用13和17这两个质数。

假如甲要发送“ 15 ”给乙,为了数据传输安全,乙首先要生成一个密钥对,即一个公钥和一个私钥。

首先13*17= 221

然后我们把13和17各减去1,再乘起来,也就是12 X 16 = 192。接下来我们要随机选择一个小于192且与192互质的数。两个数互质的意思是他们没有除了1以外的公约数。我们把192分解成因数相乘的形式:

192 = 2*2*2*2*2*2*3

选择一个不能被2和3整除的数,我们就选择 5 这个数字。

(221,5)就是公钥

这个公钥可以让任何人知道,完全没有关系,所有人都可以使用这个公钥加密数据,然后发送给你。

还记得之前算出来的192和随机选择的5吗?我们要找到这样一个数:它是5的倍数,然后除以192刚好余1。这个数很好找,它就是385。然后385除以5等于77。

于是我们得出了私钥:(221,77)

私钥只能自己知道,一旦泄露,传输的数据就等于是在阳光下裸奔。

好了,有了密钥对,我们终于可以进行加密和解密了。

甲先将想要发送的信息,也就是“15”这个数字,使用乙的公钥进行加密。乙的公钥是(221,5)。

首先甲算出15的5次方,得出759375这个数字。接着再用759375除以221,得出余数是 19

最后一步,甲将“19”发送给乙。

乙拿到“19”后,使用私钥进行解密。私钥是(221,77)。

首先乙会先计算19的77次方,然后再用得到的数字除以221,求出该数的余数,得出最终的答案就是“ 15 !”

非对称加密大体上就是这么一个过程,非常具有艺术感!

但是,RSA算法计算量太大,太慢了。怎么办?

人类一思考,上帝就发笑😊

椭圆曲线加密(ECC)算法

1985年,华盛顿大学教授尼尔·科布利茨(Neal Koblitz)和数学家维克托·米勒 (Victor S. Miller)各自独立提出了著名的椭圆曲线加密(ECC)算法。

尼尔·科布利茨(左),维克托·米勒(右)

ECC英文全称"Ellipse Curve Cryptography",通过椭圆曲线方程式的性质产生密钥,计算量较小,处理速度更快,存储空间和传输带宽占用较少。ECC算法的164位的密钥产生的安全等级,相当于RSA 1024位密钥提供的安全等级。因此,比特币选择了ECC作为加密算法。之所以不选择RSA算法,是因为RSA这种基于大质数因子分解困难性的加密方法,计算量过大,很难实用。

2001年, SHA256算法被发明,SHA是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数。简单来说,就是把一切文本都计算成一个256位的字符串。

至此,加密钱包中所需要的密码学知识都已经齐备。

下面,进入说人话部分。


钱包中加密算法的使用

在使用加密钱包的时候,首先,会通过助记词,随机生成私钥,再通过加密算法(比如椭圆曲线加密算法)从私钥生成公钥。

公钥再经过哈希运算,计算出钱包地址。对以太坊来说,就是生成一个以0x开头的字符串。

拿以太坊来说,从公钥生成地址的过程如下:

(1)生成公钥的keccak-256哈希,得到一个256位的二进制数字。

(2)丢弃前面的96位,即12字节。得到160位二进制数字,即20字节。

(3)把地址编译成十六进制的字符串。最后将得到一个40字符的字节串,就是账户地址。

注意,这个链条是单向的,也就是说,知道了钱包地址,是无法知道公钥的,知道了公钥,也是无法知道私钥的。

私钥就是控制钱包所有权的关键,可以进行交易,可以把钱包看成一个Web3银行的账号。

公钥相当于银行账户的开户人信息。

而钱包地址相当于银行卡的用户名和账户号,就像弄多个银行卡一样,也可以生成多个钱包地址。但有了银行卡,还不能交易,交易需要密码,这个密码就是钱包的密码。

所以,钱包地址可以让别人知道,相当于银行卡号可以告诉别人,但私钥千万不能让别人知道。

私钥是什么样的?

私钥是一个64个字符组成的字符串。这个数字一般是随机生成的,不然就容易被猜到,造成巨大风险。

比如,你可以任性的把私钥设置成这样:

0000000000000000000000000000000000000000000000000000000000000001

就是数字1。(千万别真的真么做。这个例子就是为了演示用一个大家能猜到的私钥是多么危险)

然后通过椭圆曲线函数计算,就可以对应的公钥:

0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

然后经过一系列让人眼花缭乱的哈希,最终形成比特币地址如下:

1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm

一个钱包地址只有一个私钥,且不能修改。

助记词和私钥的权限是一样的。私钥是我们银行的所有权凭证、保险柜密码一样,由于东西太多,携带不方便,那么就有必须有个便于记忆的口令,比如说,芝麻开门,当我说了这个口令之后,我就等于证明我有了私钥,也就拥有了所有的一切。

助记词是把私钥明文表现的形式,最早是由BIP39提案提出,其目的是为了帮助用户记忆复杂的私钥(64位的哈希值)。助记词一般由12、15、18、21个单词构成,这些单词都取自一个固定词库,其生成顺序也是按照一定算法而来。

比如,类似这样:

voice again pupil thumb strategy toss extend unusual neutral shuffle claim cave

和私钥一样,一个钱包只有一个助记词,且不能修改。助记词和私钥具有同样的功能,只要输入一个助记词并设置密码就能进入钱包,并拥有这个钱包的掌控权,就可以把钱包中的币转走。助记词只能备份一次,备份后在钱包中便不会显示。因此在备份时一定要抄写下来。

另外,创建了钱包之后,必须设置密码。这个密码可以自由设置,最好不少于8位数,尽量设置的复杂一点。输入密码可以导出私钥。

密码的用途有两个:

第一是转账时候需要输入密码,就类似于你用银行卡转账的时候需要输入密码是一样的。

第二是在导入钱包时必须输入这个密码。

但是如果密码忘了怎么办,没关系,可以用私钥来修改密码。

所以私钥的权限是极大的,有了私钥就等于有了账户+密码了。千万注意保密。

在区块链世界中,钱包信息如果丢了,就没有人能够帮你找回。

但是,只要你保护好钱包信息,钱包里的资产就只属于你自己,谁也抢不走,这是去中心化的优势。

美人计行不行?!


传稻士社区:读完了,请你思考下列问题:

1 为什么用钱包的私钥可以生成公钥?而反过来不行?

2 钱包地址是从公钥生成,为什么一个钱包中能生成多个钱包地址?

3 会出现相同的钱包地址吗?

关注传DAO士,获得更多Web3有关的知识

推荐学习《芝麻开门吧,Web3入门10日谈》系列的10个主题,本文是主题2 数字钱包的第六篇,请持续关注。
1 加密货币 2 数字钱包 3 区块链 4 NFT 5 DAO
6 Web3 7 GameFi 8 DeFi 9 虚拟人 10 元宇宙

跟NFT、Web3和区块链相关的文章列表
数字钱包之一:存加密货币的数字钱包是怎样的?
数字钱包之二:怎样申请加密数字钱包?有多少种钱包?
数字钱包之三:用咒语生成的钱包,怎样在加密世界完成交易?
数字钱包之四:怎样申请能放比特币的钱包?
数字钱包之五:一周被盗 7.7 亿美元,怎么保护加密钱包?Web3 用户安全指南
什么是NFT 2.0?为啥说动态NFT是未来?与现实场景怎么结合?
买 NFT,实际是在买什么?
解读上海市数字经济发展规划:启动 NFT 交易平台的令箭 ?
创建1年值50亿美元,出品无聊猿NFT的YugaLabs,就像Web3的罗马
NFT精神史:罐头、青蛙和平凡人的15分钟英雄梦想
天价 NFT 是庞氏骗局吗?有什么具体价值?
为什么说大部分 Web3 创业者在犯错?- Web3 创业的28个原则
区块链的下半场,与 NFT 无关?为什么说中国 Web3 的机遇巨大?
为什么说大部分 Web3 创业者在犯错?- Web3 创业的28个原则
Token 经济是 Web3 应用必须的吗?
为什么说 DAO的本质是可编程组织?怎么做?
数字人民币的真正意义是什么?会带来哪些机会?
从暴雪到GameFi?谁的未来更灿烂?边玩边赚是扯淡吗?为什么总是会出现死亡螺旋?
做个明白人,一文弄懂Web 进化简史:从文档互联到价值互联
Token 经济是 Web3 应用必须的吗?
Web3 的本质是什么?为什么它不是下一代互联网?
下一个加密牛市新叙事的10大关键词预测
北大博士10分钟科普:Web3到底是咋回事?
为什么说 Web3 的今天,相当于互联网的 1993 年?
小白如何赢在Web3的起跑线上?
区块链是什么?人们是怎么挖矿的?
什么是智能合约?代币(Token)是怎么造出来的?

假如你对Web3有兴趣,或需要跟DAO这种组织方式相关的知识,请去“传DAO士”社区索取,一群研究DAO实践DAO的人等着你,点“查看原文”看社区介绍。

欢迎扫码申请加入“传DAO士”社区,提高认知,结交志同DAO合的好友。
长按扫码!加微信

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存