现在,数字资产,加密,算法已经充斥着我们的生活,就像头条的推荐算法,抖音的推荐算法,如何推出爆款的算法等等。
那么什么是算法。其实这是一个很容易理解的概念,算法其实就是按照一定逻辑并且把它实现出来的过程。简单来说,按照计算机输入-> 处理 -> 输出的流程,就是:
输入数据 -> 用算法进行计算 -> 输出结果
举个例子: 输入的数据是 【abc】,
算法是 :输入数据的每一位的字母顺序向后移动3位并输出对应的字母,
输出的就是【def】。
然后大家有没有发现,上面的例子其实也是一个加解密的过程。这里是著名的【凯撒密码】,据称,当年凯撒就是用这种方法和他的将军们进行沟通交流了。
凯撒大帝
密码学
密码学(在西欧语文中,源于希腊语kryptós“隐藏的”,和gráphein“书写”)是研究如何隐密地传递信息的学科。
在现代特别指对信息以及其传输的数学性研究,常被认为是数学和计算机科学的分支,密码学的首要目的是如何隐藏信息的真实意图和含义。特别是在于电脑与网络安全所使用的技术,如访问控制与信息的机密性。
著名的密码学者Ron Rivest解释道:“密码学是关于如何在敌人存在的环境中通讯”,自工程学的角度,这相当于密码学与纯数学的异同。
向神一般的男人致敬
信息加密这个需求是一直存在的,自从有了信息远距离传递的需求,如何防止信息泄露一直都是人们所追求并时刻关注的。从飞鸽传书到电报再到电话,互联网,无处不在,也是因为战争,信息的重要性被无比的重视和提高到一个全新的高度,并飞快地发展。
战争在某种程度上推动了科技的发展,大家现在使用的,接触的加解密算法,甚至计算机,都是来源于二战。二战中过于加解密的手段和战斗丝毫不逊色于正面战场的激烈程度。
大家耳熟能详的大概有,美军截获并破解了日军进攻中途岛的密文,最终在中途岛歼灭了日军大部分的舰队成为太平洋战争的转折点;又或者,更加有意义和深刻影响的英德密码学上的交锋。
图灵破解了德国号称不可能并破解的Enigma(恩尼格玛)密码机和Tunny密码,为盟军赢回了主动权和极大的战略优势,并创建了现代计算机科学和人工智能理论,是个神一般的男人,可以说带领人类点亮数字化甚至说改变人类文明的走向的男人。
在现在,任何谈及密码学,加解密,算法,人工智能,数字化等现在计算机科学,都绕不开这个犹如数字上帝一般的人物,因为是他奠定了这些学科的基础,以至于我们现在在用的计算机,人工智能,手机等等软硬件都是基于他的理论框架内实践的。
计算机界内有一个号称计算机的诺贝尔奖就叫“图灵奖”。
据说苹果那个咬掉一口的苹果LOGO也是乔布斯为了致敬图灵老爷子。
什么是加密
其实加密这个事情大家每时每刻都在接触,打开手机的密码,指纹,银行卡密码等等,这些都是一个加密手段,这里主要讲的是加密在互联网上的使用。
这里有个概念要写解释一下,就是无论是手机,还是电脑,还是服务器,甚至是智能开关,我们把接入网络的设备统一称为终端。那么,互联网就是把这些终端串起来的一张大网,让这里面的设备可以互联互通。
正如上文述说的,在这种长距离的传播中,如何保证数据安全就是一个很大的刚需和命题,在这个网络中,所有人都参与,也就意味着都有机会截取到你的数据包,如果你是明文传输的话,也就意味着赤裸裸地把自己的密码暴漏在所有人面前。互联网一开始,也为军方和科研机构服务的,那些印着top secret(绝密)的材料更加需要得到保护。
所以,在互联网的假设和各种协议的设计之处,如何保证数据包的传输安全和加解密算法,都已经早早地安排上了,毕竟,没有加密的明文数据包在互联网上传播,和你在人潮涌动的大街上裸奔没啥区别。
这里先不描述那些复杂晦涩难懂的加密原理和算法,我们先来了解一般来说,用得最多的加密算法和基本的原理,然后举个栗子来感受一下加解密和算法的过程来看看是怎么保护数据和通讯安全的。
加密算法
一般来说,现在我们在用的主流的加密方式分为两大类,一类是可逆加密,一类是不可逆加密。
不可逆加密
不可逆加密其实就很简答了,就是字面意思,就是加密后其实是解密不了的,要解密的话,其实也是根据明文再加密一次,然后得到密文,和原来的密文做匹配最后来校验这个结果对不对。主流的加密算法有:MD5,SHA1等等。
这部分可以略过,有点复杂,有兴趣的可以研究一下。
MD5算法原理:
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值;
第一步、填充:如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit);
第二步、记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512+448+64=(N+1)*512位;
第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16);
第四步、四轮循环运算:循环的次数是分组的个数(N+1);
因为不可逆,所以不可逆算法主要是应用在防篡改,防止明文直接暴漏,数字签名等用途,最近流行大火的区块链技术中在在很多地方用了不可逆算法的地方来保证安全性。
举个栗子
这几年我们时常听到某某互联网公司被脱库(就是数据库被黑客拷贝下来),然后发现密码是明文存储的,结果圈内人一阵震惊,破口大骂,吃瓜群众我看不懂,但是大受震撼。
为什么互联网从业者各种震惊呢。因为密码在互联网系统中,是不允许被明文存储的,这是一条铁律,铁到什么程度呢,就像葵花宝典第一句,欲练神功必先自宫。
这是因为随着大家的账户的增多,很多人可能都是用同一个密码的,然后呢,因为开发人员和数据库管理等问题,也是希望最大程度上保护用户而不存储用户的明文密码数据最大程度上的保护用户信息。下面举个常规状态下是怎么保存账户和密码登录这个过程给大家感受一下。
用户注册:用户输入手机号和密码,然后通过数据接口上报给服务器(合理有一层网络传输的SSL加密算法来打包保护数据在网络中传播的安全性,这里先不讲解,就是在数据包传输的时候的加解密保护),服务器系统在收到用户的手机号和密码之后,会对明文密码做一次不可逆的加密,一般来说都会用 sha1(md5(明文密码)),经过两次不可逆加密,然后把得到的密文,就是加密结果那堆乱七八糟的字符串,存储在数据库里面。
密码明文: abc123456cba
加密后密文:34758d201abdb25f4cb4f88900d67b7b4a4739b5
然后这个时候,其实大家都不知道这串字符串对应的是个啥东西,怎么校验用户密码呢。校验原理是这样的:
用户登录:用户输入手机号和密码,系统收到之后,先根据手机号找到这个用户,然后把收到的明文密码,按照原来的味道,原来的配方再加密一次,然后得到一个结果,把这个结果和数据库里面存储的密文做对比,这样就可以知道密码是正确是还是错误的。
这种技术还被广泛的防篡改上,我们的文件其实自创建开始就有一个MD5值,一旦文件内容被改动过,就等于原来加密的明文信息改变了,MD5值就会改变。所以当你拿到一个文件和MD5值,然后在你收到文件的时候,把你收到的文件和原来文件的MD5值做一下对比,就知道这个文件有没有被人动过手脚修改过内容了。
对称性加密和非对称性加密
在很多情况下,我们在加密完了之后,都希望能解密开明文信息知道说的是什么内容,所以这个时候我们就需要能解密出明文的算法了。所以可逆加密中,有这两种常用的加解密方式。
对称性加密
对称性加密简单来说,就像一个锁,然后有两把钥匙,两把都可以打开锁。这个是最早应用的加密方式,包括前文所说的凯撒密码也是这种。
首先把明文,就是我们前文说的abc,使用秘钥加密,这里的的秘钥就是凯撒密码中的向后偏移3位字母顺序的【3】,算法就是把明文偏移3位字母顺序后输出,得到的结果就是def,我们称为密文。
拿到密文之后,同时你拥有解密的秘钥,秘钥是【3】,解密算法是,密文里面的字母,向前退3为字母顺序,得到明文【abc】。
这我们能看到,秘钥是【3】,加密算法和解密算法,也存在些许区别。
对称性加密
但是渐渐地,大家发现这种方式不够用了,因为如果秘钥被人获取了之后,推算出加密方式,很容易就会被破解,而且大规模应用之后,加密算法可以被推算出来,然后秘钥一旦泄露风险性问题也是极高。当然,这个只是相对的,也有一些对称性加密算法会无线增加破解的难度,常见的AES,DES,3DES等。
DES 加密算法是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方 相同密钥的人才能解读由 DES加密算法加密的密文数据。
因此,破译 DES 加密算法实际上就是 搜索密钥的编码。对于 56 位长度的 密钥 来说,如果用 穷举法 来进行搜索的话,其运算次数为 2 ^ 56 次。
所以,一般现在不单独使用对称性加码,而是混合着非对称性加密一起使用,再混合时间戳,随机数等算法。
非对称性加密
非对称性加密稍微复杂一点,它是有两把钥匙的,一把成为公钥,一把成为秘钥。简单来说,就是一个锁,然后有两把对应的钥匙,这两把钥匙是匹配的,然后两把钥匙一次插入,才能打开得到明文信息。
一般是拿公钥来加密数据体,然后这个用公钥加密的密文,公钥自己也是是打不开的,要使用与公钥对应的私钥才能解密出来明文数据,所以只获取到公钥是解不开数据的,这在无形中大大提高了安全性。
非对称性有很多种加密算法,其中最普遍的是RSA加密算法。被普遍认为是目前最优秀的公钥方案之一。RSA 是第一个能同时用于加密和数字签名的算法,它能够抵抗目前已知的所有密码攻击,被 ISO推荐为公钥数据加密标准。
RSA 加密算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
RSA算法过程:
举个栗子
为了方便,p , q 的值取小一点,假设:p = 17,q = 19,
(1)求N:N = p * q = 323;
(2)求L:L = lcm(p-1, q-1)= lcm(16,18) = 144,144为16和18对最小公倍数;
(3)求E:1 < E < L ,gcd(E,L)=1,即1 < E < 144,gcd(E,144) = 1,E和144互为质数,E = 5满足上述2个条件,E = 5,此时公钥= (E,N)=(5,323);
(4)求D:求D也必须满足2个条件:1 < D < L,E*D mod L = 1,即1 < D < 144,5 * D mod 144 = 1,显然当D= 29 时满足上述两个条件。1 < 29 < 144,5*29 mod 144 = 145 mod 144 = 1,此时私钥=(D,N)=(29,323);
(5)加密:准备的明文必须是小于N的数,因为加密或者解密都要 mod N,其结果必须小于N。
假设明文 = 123,则 密文=(123的5次方)mod 323=225
(6)解密:明文=(225的29次方)mod 323 =123,所以解密后的明文为123。
鉴于RSA算法的应用非常的多,可以说只要要计算机的地方,就有RSA算法的存在,这里就不举出具体应用的,如果有兴趣的小伙伴可以留言,我们会找一期出来专门说一下这个算法的应用实例。
结语:
基于加密解密,保护信息安全,各路大佬都用各种手段斗智斗勇,法力无边。本文只是做了简单的概述,这里面设计了各种数学公式,算法,计算机设计等内容,本文尽量用大白话的语言让大家了解计算机科学的神秘的面纱和运行逻辑,如果想了解更多的内容,可以评论留言(我估计有耐心看到这里的人不多)。
鸣谢
互联网鼓励开源共享,但是也尊重版权。
【申明】RSA加解密部分算法部分素材图片来自于: