密码学入门之密码

最近在研读《图解密码技术》这本书,将有一系列的密码学学习笔记,涉及到密码的相关概念、对称加密、非对称加密、单向散列函数、消息认证码、数字签名、数字证书等内容,同时涉及到代码部分也会使用Golang进行展现,感兴趣的能够关注更新哦。好了,今天先讲讲密码学中的一些概念性的问题。程序员

发送者、接收者和窃听者

请想象一个Alice向Bob发送电子邮件的场景。在这个场景中,发出邮件的Alice称为 发送者(sender),而收到邮件的Bob则称为 接收者(receiver)算法

当某我的向另外一我的发送信息时,发出信息的人称为发送者,而收到信息的人称为接收者。另外,被发送的信息有时也统称为 消息(message)安全

邮件是经过互联网从Alice的计算机发送到Bob的计算机的。在发送邮件时,邮件会通过许多台计算机和通讯设备进行中转,在这个过程当中,就存在被恶意窃听者(eavesdropper)偷看到的可能性服务器

窃听者Eve并不必定是人类,有多是安装在通讯设备上的某种窃~听~器,也多是安装在邮件软件和邮件服务器上的某些程序。ide

尽管邮件内容本来应该只有发送者和接收者两我的知道,但若是不采起相应的对策,就存在被第三方知道的风险。函数

加密和解密

那么如何防止窃听者的窃听呢?Alice不想让别人看到邮件的内容,因而她决定将邮件进行**加密(encrypt)**后再发送出去。学习

加密以前的消息称为明文(plaintext),加密以后的消息称为密文(cipher-text)加密

  • 明文加密以后就会变成看不懂的密文

Bob收到了来自Alice的加密邮件,但做为接收者的Bob也是没法直接阅读密文的,因而 Bob须要对密文进行解密(decrypt)以后再阅读。解密就是将密文恢复成明文的过程。spa

  • 密文解密以后就变成了原来的明文

将消息加密后发送的话,即便消息被窃听,窃听者获得的也只是密文,而没法得知加密前的明文内容3d

  • 将消息加密后发送, 窃听者只能获得密文

    在上述场景中,Alice将邮件进行加密,而Bob则进行解密,这样作的目的,是为了避免让窃听者Eve读取邮件的内容Alice和Bob经过运用密码(cryptography)技术,保证了邮件的机密性(confidentiality)

    秘钥

    密码算法

    用于解决复杂问题的步骤,一般称为算法(algorithm)。从明文生成密文的步骤,也就是加密的步骤,称为“加密算法",而解密的步骤则称为“解密算法"。加密、解密的算法合在一块儿统称为密码算法

    秘钥

    密码算法中须要密钥(key)。现实世界中的“钥'',是像 :key: 这样的形状微妙而复杂的小金属片。然而,密码算法中的密钥,则是像203554728568477650354673080689430768这样的一串很是大的数字。

加密、解密与秘钥

不管是在加密时仍是在解密时,都须要知道密钥。

正如保险柜的钥匙能够保护保险柜中存放的贵重物品同样,密码中的密钥能够保护你的重要数据。即便保险箱再坚固,若是钥匙被盗, 里面的贵重物品也会被盗。一样地咱们也必须注意不要让密码的密钥被他人窃取。

凯撒密码

恺撒密码(Caesar cipher)是一种相传尤利乌斯·恺撒曾使用过的密码。恺撒于公元前100年左右诞生于古罗马,是一位著名的军事统帅。

恺撤密码是经过将明文中所使用的字母表按照必定的字数“平移”来进行加密的。好比在日语(例如平假名)或者汉语(例如汉语拼音)或者英文字母表中均可以用一样的思路来实现恺撒密码。

为了讲解方便,咱们用小写字母(a,b,c,…)来表小明文,用大写字母(A,B,C,...)来表示密文。

如今咱们将字母表平移3个字母,因而,明文中的a在加密后就变成了与其相隔3个字母的D,以此类推。b变成E,c变成F,d变成G......v变成Y,w变成Z,而x则会回到字母表的开头而变成A,相应地,y变成B,z变成C。经过下图咱们能够很容易地理解“平移"的具体工做方式。

凯撒密码的加密

这里,咱们假设要保密的信息为monkey d luffy这个男孩的名字。咱们暂且无论这个名字到底表明一位真实的男性,仍是只是一种暗号,只考虑将它在保密的状态下发送给接收者。

此时,明文包含下列12个字母:monkeydluffy, 接下来咱们对明文中的字母逐一加密:

m	--->	P				
                                o	--->	R
                                n	--->	Q
                                k	--->	N
                                e	--->	H
                                y	--->	B
                                d	--->	G
                                l	--->	O
                                u	--->	X
                                f	--->	I
                                f	--->	I
                                y	--->	B
复制代码

这样,明文 monkey d luffy 就被转换成了密文PRQNHB G OXIIB,monkey d luffy这个词咱们可以看懂,但

PRQNHB G OXIIB就看不懂了。

恺撒密码中,将字母表中的字母平移这个操做就是密码的算法,而平移的字母数量则至关于密钥。在上面的例子中,密钥为3(以下图)。

凯撒密码的解密

如今,假设接收者已经收到了密文PRQNHB G OXIIB,因为密文自己是看不懂的,所以必须将它解密成明文。

恺撒密码的解密过程是使用与加密时相同的密钥进行反向的平移操做。用刚才的例子来讲,只要反向平移3个字母就能够解密了。

P	--->	m				
                                R	--->	o
                                Q	--->	n
                                N	--->	k
                                H	--->	e
                                B	--->	y
                                G	--->	d
                                O	--->	l
                                X	--->	u
                                I	--->	f
                                I	--->	f
                                B	--->	y
复制代码

这样咱们就获得了明文monkeydluffy。

在这个场景中, 秘钥3必须由发送者和接收者事先约定好。

密码信息安全常识与威胁

密码信息安全常识

在继续下面的内容以前,咱们先来介绍一些关于密码的常识。刚刚开始学习密码的人经常会对如下这几条感到难以想象,由于它们有悖于咱们的通常性常识。

  • 不要使用保密的密码算法
  • 使用低强度的密码比不进行任何加密更危险
  • 任何密码总有一天都会被破解
  • 密码只是信息安全的一部分
不要使用保密的密码算法

不少企业都有下面这样的想法:

“由公司本身开发一种密码算法,并将这种算法保密,这样就能保证安全。然而,这样的想法倒是大错特错,使用保密的密码算法是没法得到高安全性的。咱们不该该制做或使用任何保密的密码算法,而是应该使用那些已经公开的、被公认为强度较高的密码算法。

这样作的缘由主要有如下两点:

  • 密码算法的秘密迟早会公诸于世

    从历史上看,密码算法的秘密最终无一例外地都会被暴露出来。例如: RSA公司开发的RC4密码算法曾经也是保密的,但最终仍是有一位匿名人士开发并公开了与其等效的程序。

    一旦密码算法的详细信息被暴露,依靠对密码算法自己进行保密来确保机密性的密码系统也就土崩瓦解了。反之,那些公开的算法从一开始就没有设想过要保密,所以算法的暴露丝绝不会削弱它们的强度。

  • 开发高强度的密码算法是很是困难的

    • 要比较密码算法的强弱是极其困难的,由于密码算法的强度并不像数学那样能够进行严密的证实。密码算法的强度只能经过事实来证实,若是专业密码破译者通过数年的尝试仍然没有破解某个密码算法,则说明这种算法的强度较高。
    • 稍微聪明一点的程序员很容易就可以编写出“本身的密码系统"。这样的密码在外行看来貌似牢不可破,但在专业密码破译者的眼里,要破解这样的密码几乎是手到擒来。
    • 如今世界上公开的被认为强度较高的密码算法,几乎都是通过密码破译者长期尝试破解未果而存活下来的。所以,若是认为“公司本身开发的密码系统比那些公开的密码系统更强”,那只能说是过于高估本身公司的能力了。
    • 试图经过对密码算法自己进行保密来确保安全性的行为,通常称为隐蔽式安全性(securitybyobscurity),这种行为是危险且愚蠢的。
    • 反过来讲,将密码算法的详细信息以及程序源代码所有交给专业密码破译者,而且为其提供大量的明文和密文样本,若是在这样的状况下破译一段新的密文依然须要花上至关长的时间,就说明这是高强度的密码。
使用低强度的密码比不进行任何加密更危险

通常人们会认为.就算密码的强度再低,也比彻底不加密要强吧?其实这样的想法是很是危险的。

**正确的想法应该是:**与其使用低强度的密码,还不如从一开始就不使用任何密码这主要是因为用户容易经过“密码”这个词得到一种“错误的安全感”。对于用户来讲,安全感与密码的强度无关,而只是由“信息已经被加密了”这一事实产生的,而这一般会致使用户在处理一些机密信息的时候麻痹大意。

任何密码总有一天会被破译

若是某种密码产品宣称“本产品使用了绝对不会被破解的密码算法”,那么你就要对这个产品的安全性打个问号了,这是由于绝对不会被破解的密码是不存在的。

不管使用任何密码算法所生成的密文,只要将全部可能的密钥所有尝试一遍,就总有一天能够破译出来。所以,破译密文所须要花费的时间,与要保密的明文的价值之间的权衡就显得很是重要。

密码只是信息安全的一部分

咱们仍是回到Alice给Bob发送加密邮件的例子。即使不去破解密码算法,也依然有不少方法可以知道Alice所发送的邮件内容, 例如:

攻击者能够不去试图破译通过加密的邮件,而是转而攻击Alice的电脑以获取加密以前的邮件明文。

上面提到的攻击手段,都与密码的强度毫无关系。要保证良好的安全性,就须要理解“系统”这一律念自己的性质复杂的系统就像一根由无数个环节相连组成的链条,若是用力拉,链条就会从其中最脆弱的环节处断开。所以,系统的强度取决于其中最脆弱的环节的强度。

最脆弱的环节并非密码,而是人类本身。

密码信息威胁

咱们将信息安全所面临的威胁与用来用对这些威胁的密码技术直接的关系用一张图标来表示出来。

欢迎与我交流