vlambda博客
学习文章列表

对称加密和非对称加密

小编最近负责的项目需要开放API接口,这难免就需要设计申请API key的页面。我照我司之前的产品,画出了页面。但是设计的过程中,完全不知道公钥,私钥,Access Key,Secret Key是什么?
小编是一个求知欲很强的产品,所以就去google了下,这下一学真是学到大学课本上知识去了,Https协议?我隐隐约约记得大学课本网络工程这本书上说到过Https协议的,所以有点后悔大学没好好学习。

接下来我就给大家好好介绍下,我是如何从申请API Key学到Https协议再到加密算法的。

首先介绍Htttp,Http是一种超本文协议,它是一个在计算机世界里专门在两点之间传输文字、图片、音频等超文本数据的约定和规范。

那Https呢?比Http多了一个“S”,这个“S”指的是“Secure”,安全。所以Https就相当于在Http协议上加了安全,所以我们也可以给Https个定义。

它指的是一个在计算机世界里专门在两点之间安全的传输文字、图片、音频等超文本数据约定和规范。 Https是Http协议的一种扩展,它本身并不保证安全性,它使用的是传输层安全性(TLS)或者安全套接字层(SSL)对通信协议进行加密。

Https协议提供了3个关键指标:

  • 加密,Https通过对数据加密来使用户在浏览网站时,没人能够监听他和网站之间的数据交换。

  • 数据一致性,数据在传输过程中不会被窃听者修改,用户发送的数据会完整传输到服务端,保证用户发送的是什么,服务器接受到的就是什么。

  • 身份验证,确认“你就是你”,确认对方的真实身份。

对称加密和非对称加密

前面我也说了,Https使用的是TLS或SSL对通信协议进行加密的,那什么是TLS/SSL呢?

TLS,英文全称 Transport Layer Security,它是SSL(Secure Socket Layer)的后续版本,它们都是用在互联网中两台计算机之间用于身份验证和加密的协议。
TLS在根本上使用对称加密和非对称加密两种形式。点题的重点来了,非对称加密!对称加密!
  • 对称加密

对称加密指的是加密和解密时使用的密钥都是同一个,是对称的。只要保证了密钥的安全性,那么整个通信过程就是加密的。
比如说,你想登录某个网站,只要事先和它约定好一个使用对称密码,通信过程中传输的就全是密钥加密后的密文,例如你的账号密码信息,只有你和网站能够解密。黑客就算想要窃听,看到的也全是一堆乱码,因为黑客没有密钥,所以也就不能解密。
对称加密和非对称加密

对称算法看起来好像解决了信息加密的问题,传输的加密信息只有拥有密钥的人才能解密,但是问题来了?如何保证这个密钥的传输是加密的呢?所以这就需要非对称加密了

  • 非对称加密

非对称加密也叫公钥加密法,它有两个密钥。 一个公钥(Public Key),一个私钥(Private Key),两个密钥是不同的,不对称,公钥可以发送给任何人,但是私钥必须严格保密,只能自己知道。
如果使用公钥对数据进行加密,那么就只能用对应的私钥进行解密;如果使用私钥对数据进行加密,那只能使用公钥进行解密。

一般AB相互传输数据的时候,各会有一对公钥私钥。公钥全部分发到网上,但是私钥会各自保管好。

A给B传输信息,用B的公钥对信息进行加密,这样只有B才能用自己的私钥进行解密;B再给A传输信息,用A的公钥对信息进行加密,这样也就只有A进行解密。这样也就解决了对称加密中密钥的传输如何保证机密性的问题。

TLS里有很多中对称加密的算法,目前常用的是AES和ChaCha20;

非对称加密算法的设计要比对称加密算法难很多,在TLS里只有很少的几种,最著名的就是RSA,我对这个名词都很有印象,大学课本提过。

  • RSA

RSA公钥加密算法是素数的一个典型应用。素数我想大家应该都知道,也就是质数,只能被1和自身整除。

RSA的安全性基于“整数分解”的数学难题,使用两个超大素数的乘积作为生成密钥的材料,想要从公钥推出私钥是非常困难的。

对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解越困难,RSA算法越可靠。

假如有人找到一种快速因数分解的算法的话,那么用RSA加密信息的可靠性就会极度下降,但现实中,只有非常短的RSA钥匙才会被强力方式攻破。到目前为止,世界上还没有任何可靠攻击RSA算法的方式。只要其钥匙的长度足够长,那么RSA加密的信息实际上是不会被攻破的。

那么RSA算法是如何用素数进行加密解密计算的呢?我附上一张推理过程的图吧,敲字有点麻烦。忽略我字不咋地哈~

其中因为C^D和M^E的值计算出来特别大,所以非对称加密解密的速度非常慢。

那么是不是可以将对称加密和非对称加密结合起来,两者相互取长补短,这样既可以高效的加密解密,又可以安全交换密钥。

这就是现在TLS里使用的 混合加密方式,在通信刚开始的时候使用非对称算法,解决密钥交换问题;然后再用随机数产生对称算法使用的“会话密钥”,再用公钥加密,对方拿到密文用私钥解密,取出“会话密钥”
这样后续就可以使用会话密钥即对称算法进行通信,而不必使用非对称算法了。

以上就是我从项目中设计申请API Key延伸到加密算法的学习历程,学习过程中两个特别深的感悟:

  1. 大学没好好学习啊,这些好像大学课本上都提过
  2. 数学踏马的可真牛逼牛逼牛逼!(其中非对称算法里还有一个ECC,它是基于“椭圆曲线离散对数”的难题,使用特定的曲线方程和基点生成公钥和私钥。比特币也是选择ECC作为加密算法的,有一说一,小编现在是真不太看得懂,涉及到数学基础知识有点高,希望我有朝一日可以看的明白)