聊聊从古至今都是如何加密的~

今儿心血来潮想讲一下加密解密,因为这篇想发到微博上给麻瓜筒子门看所以主要是概念介绍用而不是代码~

1.古代保密技术

古希腊剃头,这个好像历史书上就有,把头发剃光光,然后写在头上,长出头发再去送信,到地方再剃头。

斯巴达人发明了“塞塔式密码”,即把长条纸螺旋形地斜绕在一个多棱棒上,将文字沿棒的水平方向从左到右书写,写一个字旋转一下,写完一行再另起一行从左到右写,直到写完。解下来后,纸条上的文字消息杂乱无章、无法理解,这就是密文,但将它绕在另一个同等尺寸的棒子上后,就能看到原始的消息。这是最早的密码技术。

封泥,在发出的公文上先盖上印,用绳子捆好公文竹简,再在绳子打结处粘上泥块,秦朝用这样的方式来防止公文伪造或泄密。后来发展成火漆封缄,一直流传至今。

皂囊重封,皂囊是一种双层口袋,黑布面、白布里。“皂囊重封”是指皇帝先对书简进行玺封,放入黑色布袋后,由尚书令或是御史中丞在布袋外再用自己的印在外面加封,实现了双重加密。

宋代建立了“实封”制,即官员呈奏的秘密文书,要将文件的封皮折角重封,两端盖印。官员在外地呈奏的秘密公文,只贴“系机密”或“急速”字样,并规定,若发现依例应该实封而未实封的公文,其主管官员将被严惩。

北宋时期出现真正意义上的密码用于军事。据曾公亮、丁度等编撰《武经总要》记载,字验是宋朝传递情报的密码,将各种情报内容,比如被贼围、将士叛等内容归纳为40项,编成40条短语,分别编码。将领带兵出发前,指挥部门与其约定一首40字(无重复)五言律诗作为解码密钥,诗中的每一字都对应一条短语;在战斗中,前后方就用该密码本进行通讯。

密折法,密折是将奏文写在折叠的白纸上,外加上特制皮匣的奏折,外人无从得知。密折制度始于康熙晚年,完备于雍正朝。

拆字法,其实就是字谜的一种使用方法。最有名的是武则天时期。公元683年,唐中宗即位。随后,武则天废唐中宗,立第四子李旦为皇帝,但朝政大事均由她自己专断。裴炎、徐敬业和骆宾王等人对此非常不满。徐敬业聚兵十万,在江苏扬州起兵。裴炎做内应,欲以拆字手段为其传递秘密信息。后因有人告密,裴炎被捕,未发出的密信落到武则天手中。这封密信上只有“青鹅”二字,群臣对此大惑不解。
“青”字拆开来就是“十二月”,而“鹅”字拆开来就是“我自与”。密信的意思是让徐敬业、骆宾王等率兵于十二月进发,裴炎在内部接应。“青鹅”破译后,裴炎被杀。接着,武则天派兵击败了徐敬业和骆宾王。

其他还有很多比如达芬奇密码中就有将文字反写再使用镜子查看的方法。还有类似藏头诗这样的,在一本书中按照一定规则找到关键字,再将这些字组合成完整的信息。这种规则可以是一串数字,每个数字代表哪一页哪一行哪个字。或者制作一个密码版,将对应字的位置镂空,再将密码版盖在对应的页数上,这样镂空的部分就是有效信息。又或利用化学反应,柠檬汁书写用火加热。利用物理特性,泡水显示等等。

2.摩尔斯码

电报的诞生推动了密码学蓬勃发展。二战中各个国家都在研究电报的破译与反破译。电报的发送使用的是莫尔斯码。摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。

标准摩尔斯电码对照表
在这里插入图片描述
电报的信号是由.(点)和_(划)组成的。要将这两个信号表示为人类使用的自然语言就需要有一个对照表。上方的标准摩尔斯电码对照表就是一种电报信号和英文字母的翻译规则。其实也可以认为这张表就是一个密码本,摩斯电码本身就是一种密码。但是如果使用这张表来收发电报则称为明文电报,因为这张表所有学习过摩斯电码的人都知道,所有人都知道的密码当然就成了明文~。
因此如果电报需要加密就不能使用这张对照表,需要自己设计一个新的对照表出来。谍战片中的密码本很多指的就是自定义的对照表,密码本被他人获得也就意味着他人可以通过你的对照表来翻译你的电报。二战时期各国都在研究研究电报的破译与反破译技术,基于26个英文字母的对照表太容易破译,通常都会进行多重加密,各种加密方式层出不穷。比如电影《风语者》讲述的就是美军为解决密电被日军破译而征召29名印第安纳瓦霍族人担任密码员的故事。当时纳瓦霍族人口不多,其语言没有外族能懂。因此使用纳瓦霍族人作为人肉密码本是一种很好的选择。

要注意一点前面说了基于26个字母的对照表非常容易被破译。除了明文码为了方便直接用字母或者笔画偏旁来作为单位,通常的密码都是直接用一段莫斯码来代表特定的意义。

我们程序员学习有句话叫做看100遍不如自己写一遍。为了直观介绍在这里我们自己设计一套密码本,当然只是举例,几个名词意思下就完了~

首先我们定义数字
前面是电报信号 -> 后面是表示的意思

信号数字
_ _ _ _ _ _0
. . . . . _1
_ . _ . _ .2
. _ . _ . _3
_ _ _ _ _ .4
_ . . . . .5
_ _ _ . . .6
_ _ _ _ . .7
. _ . _ _ _8
. _ _ _ . _9
信号名词
. _酒店
. _ .早餐
. . . .早晨
. . ._晚上
_ . . .芋头
. . . .
_ . . . . .
. . . . . _

我和你的信号和5与1一样,这是为了混淆,给破译增加难度,翻译的时候可以通过语境判断。
当然也可以使用多种信号表示同一种语义,同样增加破译难度。

信号动词
. _ . .
_ .
_起床

使用上述对照表

. . . .	  _ _ _ _ . .  . _	  . _ . .	 . . . .	

明早七点酒店拉屎

电报除了. _ 还有间隔,通过间隔时间可以表示词间隔和句间隔等。也可以设计一段信号为结束符用于分隔。

这是最初级的加密。

通常会对密文进行再次加密,这样就多出了一个密码本。由不同人掌握不同的密码本,A翻译密文得到的还是密文,再将翻译好的密文交给B来继续翻译。这样即使丢了一本密码本也不至于被人立刻破译。

还是用上面的例子举例。

假设我们对中文再加密

密文明文
拉屎
七点酒店
酒店
拉屎七楼

那么“明早七点酒店拉屎”就翻译成了“拉屎去酒店七楼”

还可以继续加密,比如我们约定从第二个词组开始读取一段数字,这段数字代表有效信息的顺序。

比如 2 34 54 65 23

把这串数字放在密文头

_ . _ . _ .	  . _ . _ . _ _ _ _ _ _ .	  _ . . . . . _ _ _ _ _ .	  _ _ _ . . .	 _ . . . . .	  _ . _ . _ .  . _ . _ . _	

插入之前的密文头,并且在最前面加上一组无意义信号。

收到密文后去除前面的无意义信号,就可以得到这个 2 34 54 65 23 数组

再将这个数组按从小到大顺序排列

2,23,34,54,65

在原有密文的基础上添加无效信号组,将有效的五个信号按照数组顺序藏在这些无效信号中。

我数字写太大了自己都晕了,就不写结果了,明白就好,反正我胡乱写一串信号你们也不会验证=。=

回到主题,我们加密了2次信息,并且将有效信息混淆到了无用信息中。看上去很复杂了,但是其实也并不是100%安全。要记住一点,世界上没有破译不了的密码,特别在现在计算机算力越来越强的情况下。但这也不代表加密就没有用了。密码的破译需要消耗资源(时间,算力),加密和破解付出的资源代价是天差地别的。比如,你破解一段密码需要2天,但是人一天换一次密码,你破解了也没用。保证安全不需要保证密码不能破译,只需要保证对方的在密码有效期内算不出来就成了~

3.数字加密

总算讲到我熟悉点的数字加密了…计算机可以使用数字表示任何东西(计算机编码,目前常用的有Utf-8,Unicode,GBK等),也就是说所有的东西都可以使用数字表示,成为数字也就代表着能够进行复杂的数学运算。这就代表着可以让对照表滚蛋了~我们只需要一段随机数字,然后用这个随机数和原信息进行运算就可以得到密文了,接收方用密钥反算就可以得到原信息了。

3.1对称加密

引用一哈百科,用常用的des来介绍
在这里插入图片描述
对称加密就是说加密解密使用同一个密钥。计算机加密通常都是使用几十位到上千位的数字作为密钥进行运算,这里我用最简单的运算来介绍对称加密的概念,为了好理解就不用十六进制表示了,直接用10进制。DES的密钥和算法要比我举得例子复杂的多。

假设有一段信息“你真是个带善人”,使用数字表示是20208976。创建一个密钥,就1024吧。

设计一个加密算法,比如(原数据 - 密钥)* 12 / 密钥,那么得出的加密数据就是
(20208976-1024)*12 / 1024 = 236,811.9375‬

ok,现在我们有了密文和密钥。算法是公开的,但是密钥只有双方知道。

网络上的通讯可以比作寄信。别人可以截获你的信件。

我们现在把236,811.9375‬放在信封里寄出去,半路被人截获,但是别人并不知道236,811.9375‬是什么意思,这串数字翻译成自然语言是乱码。这封信最后平安到达,收信人也知道密钥是1024,他把信上的数字反算,236,811.9375‬*1024/12+1024 = 20208976。转换为自然语言,收信人立刻知道了你是个狗粉丝~

以上就是一次对称加密解密的过程。发现什么问题没有?这种方式的缺点就是要求发信人和收信人都知道密钥是什么。如果对方不知道密钥,你需要把密钥也放在一封信里寄给收件人,这个过程中密钥就有可能被人截获。因此这种方式并不适合陌生设备之间加密通讯。在没有获取密钥的基础上,想要破解对称加密只能使用穷举法一个一个密钥去试,密钥越长耗费的算力需要的时间成本就越大,因此只要经常换密钥就成了。

哎我介绍一下POS机的加密机制吧,正好用的是对称加密。

3.1.1POS机加密机制

首先介绍下POS机相关的各种密钥:
1、加密机主密钥(MK)
加密机主密钥(Master Key - MK)是存入在HSM机内的由三个成分合成的一对最上层密钥。在HSM机器以外的地方不会以明文形式存放,它采用双倍标准DES密钥(长达112位)实现三重数据加密。
HSM投入运行时,必须先产生和装载MK。由于DES算法依靠某一个密钥进行加密,同时所有密钥和数据都经由MK进行加密,所以MK必须通过一种安全的方法生成和维护。
MK的产生需要银行三位主要的管理人员参与产生,在SJL06主机加密模块中采用MK(加密机主密钥)对BMK进行加密保护;
MK由三个成分(32位十六进制数)组成,由加密机使用单位通过行政手段分派专人管理和维护,一般由2~3人采用"背对背"形式进行输入;
MK以密文形式存储在加密机黑匣子中,且永远不以明文形式出现。
2、银行主密钥(BMK)
银行主密钥(BMK),是加密密钥用的密钥,适用于共享网络中,它可以在共享网络中两个(或多个)通讯网点之间以部分形式进行人工分配且保持双方的对称性,共享网络中任何两个通讯网点之间均共用不同的BMK。BMK用于加密底层需要传送的数据密钥,这样远地密钥就能自动进行交换(无须人工干预)。该密钥可以长期不更改,通常二年更新一次。本地存储时,BMK是通过MK进行加密的或以索引方式存储在加密机中。
3、区域PIN密钥(PIK)
区域PIN密钥PIK是一个数据加密密钥,适用于共享网络,它通过BMK加密在两个(或多个)通讯网点之间进行自动分配,PIK用于加密两个通讯网点之间需传输的PIN,这样就实现了PIN的保密。PIK需要经常性地定期更改,在本地存储时,它是通过BMK进行加密的。PIK需要经常性地定期更改,通常每天更换一次。
4、区域MAC密钥(MAK)
区域MAC密钥MAK是一个数据加密密钥,适用于共享网络,它通过BMK加密在两个(或多个)通讯网点之间进行自动分配。用于两个通讯网点之间传送信息时,生成和校验一个信息认证代码(Message Authentication Code),从而达到信息认证的目的。MAK需要经常性地定期更改,通常每天更换一次。
5、终端PIN密钥(TPK)
终端PIN密钥是一个数据加密用的密钥,适用于局域网络中,它是在局域网内通过TMK加密,由终端数据受理者自动分配到终端且保持通讯双方之间的对称性。TPK用于加密在局域网内终端和终端数据受理者之间传送的PIN。TPK在本地存储在加密机中通过索引的方式调用。TPK需要经常性地定期更换,通常每天更换一次。
6、终端认证密钥(TAK)
终端认证密钥是一个数据加密用的密钥,适用于局域网内。它在局域网内通过TMK加密由终端数据受理者自动分配到终端或通过BMK加密由终端数据受理者自动分配到交换中心。TAK用于局域网内终端与终端数据受理者之间传送信息时,生成和校验一个信息认证代码(Message Authentication Code),从而达到信息认证的目的。TAK需要经常性地更换,通常每天更换一次,TAK在本地存储在加密机中通过索引的方式调用。
7、PIN 校验密钥(PVK)
PIN 校验密钥是一个数据加密密钥,用于生成和校验PIN校验数据,同时校验一个PIN的可靠性。传送时PVK通过TMK或ZMK加密;存放本地时,它通过MK加密。
8、卡校验密钥(CVK)
卡校验密钥(CVK)类似于PIN校验密钥,仅仅是用卡的信息取代了PIN。
9、传输密钥(Key-encrypting key)
用于加解密主密钥

怎么样,看完是不是想说禁止套娃。银行系统弄出来这么一堆密钥互相加密解密主要是为了安全,这样分层可以防止密钥持有人监守自盗,降低密钥泄漏风险同时方便能够明确责任人。

对于POS机作为终端来说,其使用前需要到银行或者POS代理那里灌主密钥,主密钥也是被加密过的密钥。每天签到获取主密钥加密过的当天PIN密钥和MAC密钥,解密后使用MAC密钥再去加密交易信息PIN密钥加密密码键盘加密的密码信息,传给MIS系统后再去和银行校验加密信息,如果银行那边算的结果和POS机传的一致才算交易成功。有兴趣的可以去学习下金融系统使用的老掉牙8583报文协议。

3.2 非对称加密

非对称加密的出现可以说是密码学上的里程碑事件。1976 年,美国密码学家提出“公钥密码”概念。此类密码中加密和解密使用不同的密钥,其中,用于加密的叫做公钥,用于解密的为私钥。1977年,美国麻省理工学院提出第一个公钥加密算法RSA算法,之后ElGamal、椭圆曲线、双线性对等公钥密码相继被提出,密码学真正进入了一个新的发展时期。

非对称加密相比对称加密解决的最大一个问题就是密钥的传输问题。前面说到过,对称加密的密钥不能直接在网络上传输,如果被截获他人可以直接使用密钥解密。也正是因为这个原因银行加密机的主密钥绝对不会以明文存在与加密机外的地方。而非对称加密有一对两个密钥,使用公钥加密私钥解密。公钥无法解密信息,可以直接在网络上传输,被截获了对方也只能用它来加密无法解密。

HTTPS协议中就用到了非对称加密。

大家可能发现了现在的网址前缀通常都是https://开头了,http://开头的网站还会被浏览器标识为不安全的网页。http和https的主要区别就是http是明文传输而https是加密传输。网站要想使用https协议那么服务器中就必须有ca证书。
CA 是 PKI 系统中通信双方信任的实体,被称为可信第三方(Trusted Third Party,简称TTP)。 CA 证书,顾名思义,就是 CA 颁发的证书。

CA 的初始是为了解决上面非对称加密被劫持的情况,服务器申请 CA 证书时将服务器的“公钥”提供给 CA,CA 使用自己的“私钥”将“服务器的公钥”加密后(即:CA证书)返回给服务器,服务器再将“CA 证书”提供给客户端。一般系统或者浏览器会内置 CA 的根证书(公钥),

HTTPS 中 CA 证书的获取

在这里插入图片描述
上图步骤 2 之后,客户端获取到“CA 证书”会进行本地验证,即使用本地系统或者浏览器中的公钥进行解密,每个“CA 证书”都会有一个证书编号可用于解密后进行比对(具体验证算法请查阅相关资料)。

步骤 5 之前使用的是对称加密,之后将使用对称加密来提高通讯效率。

简单用文字梳理一下

  1. 服务器把公钥发送给客户端 (公钥可被截获)
  2. 客户端创建一个对称加密使用的密钥,我们知道密钥是不能直接在网络上传输的,因此要用服务器发来的公钥加密这个密钥,再把这个加密后的密钥发送给服务器。(可被截获,此时截获者手中只有公钥和加密后的密钥,无法解密)
  3. 服务器收到加密后的密钥,使用私钥解密,得到明文密钥。
  4. 服务器使用解密后的密钥对信息进行对称加密,发送给客户端。(还是可以被截获,截获者没有密钥无法解密)
  5. 客户端使用密钥解密,再次加密讯息和服务器通讯。
    … …

也就是说非对称加密可以用来加密对称加密的密钥,使其可以在网络上传输。

3.3 摘要

大家应该在下游戏的时候都看到过MD5校验这一步吧。MD5很多人都称它为加密算法,其实应该算为摘要算法。摘要的目的是为了验证数据是否被修改过。
还是用寄信打比方,你寄出一封信,半路有可能被人截获修改,如何保证收信人收到的信是你的原版信件呢?
假如你的信件有1000字,你按照一定规则从这1000个字中挑出100个字组成一段话,收件方也知道你挑选字的规则,那么他收到信件后也去按照这个规则从1000字中找出那100个字。如果信件没有被修改过,那么你们两挑选出来的100字一定相同,如果有人修改了信件那么就有很大的概率收件人挑选出来的100字和你写信时附上的那100字不一样。这就是摘要。
而计算机通过数字化信息运算出来的摘要结果,可以把这个很大概率提升到几乎100%。只要发送人把摘要结果放在数据包里,接收方做一下校验即可知道是否有人修改了数据。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值