c++ 非对称加密算法_大学里面挂科最高的科目?非对称加密 加密算法(下)

43f89a85a8e997503363eac99d613f12.png

编者按:本文由Seabook海叔的技术分享,转载请注明来自Seabook海叔,并联系作者获得授权。

大家好,我的名字叫Seabook,或者大家可以叫我海叔。我是澳大利亚Deakin大学的在读博士生,我的主要研究方向是区块链底层,今天开始我将为大家带来一个干货区块链的系列,主要以区块链的技术为主。风格尽量往: 简单易懂 诙谐幽默 靠拢

为了更清楚的讲清楚后面 比特币是的技术原理(挖矿,数字签名,钱包地址等),我们先要了解一系列的基本知识点:

  • 什么是Bit,Byte,decimal vs hexadecimal vs binary. 一位?一个字节?2进制,10进制,16进制 ?
  • Hash, what is SHA256?
  • 数学之美 大数字?1000,000,000,000 一个trillion算大吗? 地球上有多少沙子?一杯水里面有多少分子?
  • 大学最容易挂科的科目?Cryptography, 加密学(上)- 对称加密
  • 2000多年来密码学最牛B的发明?Cryptography, 加密学(下)- 非对称加密

上一期我们粗略的讲了一下对称加密的算法,并且自己用代码简单实现了一个对称加密。再讲非对称加密之前那我们简单回顾一下对称加密的特点:

最核心的特点就是,加密 和 解密 的要用相同的秘钥,或同一个算法 他们的关系是对称的,所以, 这个相对来说很容易理解。

但是对称加密有一个最大的问题:就是如何保证秘钥安全的传播。

为了更好的讲清楚这个问题,我来举个例子,上期我们简单讲到了最早期的对称加密凯撒密码。想了解凯撒大帝生平世界 八卦的同学,可以百度百科。

http://bit.ly/2m7bCpK​

bit.ly

凯撒大帝为了对重要的军事机密进行加密,发明了凯撒密码,从今天来看,其实是一个很脑残的算法, 但在2000年前可能有一定的意义。

具体算法如下: 一段明文中的所有英语字母都在字母表上向后按照一个固定数目进行偏移后形成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。

当初在没有计算机的情况下凯撒大帝用了下面的圆盘装置。

c2c45ebff5f505880cb99729422306b7.png

0f112d026cc87708d473c705e9b3038e.png

e5e55d1ff53345135c1a48557a7431ae.png

9cf9bcbd3b371ca730cc432dcc57bcad.png

1b623fa3e324895d0dd8e745e28669f8.png

b2453370e61823d29b9dd20577373c2c.png

ff504885eec0ac9495b7e479ed6d5524.png

bec0a035979b262fa76405d5e1d9fc75.png

大家有兴趣可以去网页版去玩一下: https://inventwithpython.com/cipherwheel/

当然今天海叔我们用代码来实现一下这个算法

let letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']function caesarCipherEncryption(plainMessage, shiftPositionNumber) { let encryptedMessage = [] for (let i = 0; i < plainMessage.length; i++) { let letter = plainMessage.charAt(i) if (letter === ' ') { encryptedMessage.push(letter) continue; } let letterPoisition = letters.indexOf(letter) let newLetterPosition = letterPoisition + shiftPositionNumber if (newLetterPosition > letters.length) { newLetterPosition = newLetterPosition - letters.length } encryptedMessage.push(letters[newLetterPosition]) } return encryptedMessage.join("")}function caesarCipherDecryption(encryptedMessage, shiftPositionNumber) { let plainMessage = [] for (let i = 0; i < encryptedMessage.length; i++) { let letter = encryptedMessage.charAt(i) if (letter === ' ') { plainMessage.push(' ') continue; } let letterPoisition = letters.indexOf(letter) let newLetterPosition = letterPoisition - shiftPositionNumber if (newLetterPosition < 0) { newLetterPosition = letters.length + newLetterPosition } plainMessage.push(letters[newLetterPosition]) } return plainMessage.join("")}

比如 凯撒给他的军队下令:

attack at dawn // 在傍晚进攻。设置秘钥3 也就是向后移3位。

根据算法attack at dawn的 密文是 dwwdfn dw gdzq

军队指挥官 收到密文(dwwdfn dw gdzq) 并且收到秘钥3, 可以解开密文 知道在傍晚进攻的消息

那么问题来了,这个秘钥3(向后移动3位) 如何安全的传到指挥官的手里?如果当中被敌人获取?那不就是机密泄露了吗?

由此可见 在对称加密的场景下,如何安全有限的传送秘钥就成了大问题。

公钥的发明,堪称是两千年以来密码学的最伟大成就,也是今天区块链和比特币的最重要基础技术之一。大家可能之前听说过RSA算法,我们平时用的HTTPS,SSH等都是基于RSA的算法,RSA可以说是非对称加密算法里面最早期的发明之一,至今还用在我们生活的方方面面,麻省理工学院实习的三个人是解决这个问题的关键。在罗纳德·李维斯特(Ronald L。 Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)三人的努力之下,一种被称为“不对称密钥”的密钥诞生了。RSA算法,也有此三人的首字母命名。

好了 问题又来了 那究竟什么是非对称加密算法?究竟是什么鬼?下面让海叔我举个例子。我们假设我们有一个神秘藏宝箱,这个珠宝箱要用两把钥匙才能代开

ff908471bac71e5282497634eda25219.png

d96d0b3e41cc1816e24b4470c6ecb510.png

0e4e8bbd1a50a356c16c1d5285ea8f1f.png

190775c1c6e717568fd441566303a0de.png

然后这个宝箱的设计要有下面几个特点

  1. 一把是Private Key (私有钥匙), 一把是Public Key(公有钥匙),而且我们完美的发现了一个方法就是从私有钥匙可以产生公有钥匙,而反过来去几乎不可能。私有钥匙和公有钥匙的不同 就是我们所谓的非对称
  2. 私钥上了锁的藏宝箱,公钥可以打开,公钥上了锁的藏宝箱,私钥可以才能打开这个藏宝箱。
  3. 在实际的数字传送中,加密算法可以看做是藏宝箱

我们在回到凯撒大帝想要给他的部队来回传送机密文件的这个实际例子:

  1. 凯撒发明了一个藏宝箱,他先发明了一把私有钥匙留给了自己,并且从私有钥匙可以产生公有钥匙,而且公有钥匙不能生成私有钥匙。
  2. 凯撒把公有钥匙和那个藏宝箱发了出去, 给他的将军。
  3. 他的将军要和凯撒沟通的时候,首先把秘密文件放入藏宝箱中,然后用公钥钥匙锁住藏宝箱,送回给凯撒。
  4. 假设途中被敌人截取信息,由于没有私钥,即使敌人截获了宝箱或者公钥也无法打开这个宝箱。(暴力打开宝箱,不在讨论范围之内。)
  5. 利用这个原理 凯撒可以把宝箱 和 公钥 分布给他下面的所有将军,而凯撒只需要保管一个私钥就可以了。

下面我们看一张 非对称加密算法示意图:

7300e66a536b7b5688743ad98815e8a1.png

ea36d25acbd8d4356c4754088722b7af.png

上述的可以说就是非对称加密的核心。主要就是可以有效的解决私钥如何安全的分发的问题。

但是牛人就是牛人, 在RSA发明之前,有两个更牛的人一个叫 Whitfield Diffie 另一个叫 Martin Hellman,他们是数学界和密码学界的牛中牛。 他们提出了,非对称加密可以用于电子签名,今天在比特币中的电子签名,就是出子这个原理。

那我们看一下什么叫电子签名:其实是一个很简单的原理,我们就以比特币为例:

同学:终于讲到比特币了?

海叔: 我们都知道,比特币 有私钥, 公钥,地址, 私钥产生公钥,公钥产生地址。当你支付比特币给某个地址的时候,首先你用你的私钥加密,然后把你的公钥,和你加密的transaction分发出去,就像你授权一张银行check,你在上面签名之后发出。获得支票的对方,如果是check,他们会找银行 去 看授权签名,然后获得资金。 在比特币的电子转账中,获得比特币方,会用获得的公钥解密这个transaction,由于私钥和公钥是一对一的关系,也就是说这个公钥能够打开的话,就只有私钥的拥有者才能加密这个transaction,由此证明这个fund是属于之前私钥的拥有者的。

电子签名的核心就是用非对称加密的两把钥匙反过来应用,用私钥加密,公钥解密,当然你的公钥会派发给每个人,但也证明了你是唯一的私钥拥有者。这个真的很吊,换个思路看问题,就帮我们又解决了世界上一大堆问题,真的牛。

关于比特币的 私钥,公钥, 地址, 电子签名的原理,我们后面会再详细讨论。

我们看一下 电子签名的这张图:

a05168b9cf91570e8e3c7f493280909e.png

5f48bc7038a1491a9356fbbe30f78319.png

到今天为止,我们把区块链的fundamentals基本都讲了一遍,其中涉及到了,

  • 计算机原理, 2进制,16进制
  • 什么是hash算法?
  • 比特币的完美的大数字,超过宇宙尘埃的地址,保证了比特币的安全性
  • 加密算法的历史和衍生,并且用代码展示了简单加密算法的实现
  • 比特币里面的电子签名的加密学理论基础

有了这些基本知识的铺垫,我们可以开始更好的学习比特币了,从下周开始,我们会从比特币的私钥,公钥,地址开始讲起,这些东西都是怎么来? 助记词又是什么?

然后我们会动手一起写一个私钥,公钥,地址的简单App,让我们拭目以待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值