密码基础知识
引言:随着互联网的规模壮大,人们对网络安全的重视程度也日益增强,可是 internet设计之初并没有考虑太多安全问题,同时很多协议在设计的时候也没有考虑安全问题,导致信息的传递很容易被截取,篡改等。而加密技术让我们可以在非安全协议上进行安全的信息传输。
一、对称加密
简单说一下传统的加密技术:早在还没有计算机之前,就已经有了信息加密传递技术,应用在文档加密,电报报文加密等领域,基本都属于对称加密。虽然各种对称加密算法各有不同,但它们的基本原理都比较类似。我们从最简单的说起
1.1 替换密码
1.1.1 凯撒密码
用一个字母代替另一个字母,比如将一个字母利用字母表中该字母后的第k(下面称为偏移量)个字母来替代。比如k=3的时候
明文:i love you
密文:l oryh brx
1.1.2 单码替代密码
用字符映射关系来对明文进行替换,也可以理解是凯撒密码的另一种实现(升级)方式,例如
abcdefghijklmnopqrstuvwxyz映射为
gefcdbahjiknlmporqsvtuwzxy
按照上下对照的关系,明文加密为对应的密文,上面的对照关系为秘钥
明文:bob i love you
密文:epe j npud xpt
1.1.3 多码替代密码
和单码替代密码相似,多码替代密码只是在不同的明文位置使用不同的单码替代密码(或者不同的凯撒密码或者不同的偏移量k)例如
奇数位置使用
abcdefghijklmnopqrstuvwxyz映射为
gefcdbahjiknlmporqsvtuwzxy
偶数位使用另一套映射关系。或者技术位置使用偏移量K为3,偶数位偏移量为10;
1.2 换位密码
1.2.1 置换加密
将明文划分为固定宽度的组,然后按照置换规则重新排列明文中的字母。秘钥(d,f) 其中d为分组大小,f为置换规则。例如
d=4,f=(1->3, 2->1, 3->4, 4->2)
明文:i love you
分组:ilov eyou
密文:lvio yueo
注:其实这里还需要定义一个缺位补什么数据的问题。比如如果数据是11位,最后缺一位不能构成分组,需要补上一位。
1.2.2 列置换加密
将明文排列成固定列数的矩阵,然后按照列顺序进行输出。例如
秘钥:矩阵列数:k=4,输出顺序:(2,3,1,4)
明文:bob i love you
矩阵:
b o b i
l o v e
y o u x
密文:ooo bvu bly iex
解密:按照(2,3,1,4)这种顺序把字符写出来,吧ooo放到第二列,bvu放到第三列,bly放到第一列,iex放到第四列,就还原了
矩阵
b o b i
l o v e
y o u x
注:这里也可以用一个单词的形式来代表矩阵列数和顺序,比如单词eat可以表示长度为3列,顺序为(2,1,3),这里是认为字母表中是aet为原序列1,2,3。
1.3 流密码加密和分组密码加密
现代加密技术虽然算法各不先同,其基本操作仍然包含经典的替换和置换原则。主要有流密码加密,和分组密码加密(块密码加密)。对于计算机或者网络来说,其实是对字节流进行加密。
1.3.1 流密码加密
基本思想:先利用密钥生成一个密钥流(一般和数据流长度相同,使用伪随机字节生成器),数据流和密钥流进行按位异或,解密的时候也利用密钥生成相同的密钥流进行按位异或。使用的原理是两次异或不改变原值。
1.3.2 分组密码加密
基本思想:把明文分成长度为m的若干组,对每组明文进行加密。一般是秘钥长度n=m(可以不等)。然后通过feistel的设计原则来进行加密。
feistel简介:破解密码一般是基于统计分析来破解,因为代码一般利用的都是置换和替代方式,如果数据量足够,是可以进行统计分析解密的。而feistel分组密码设计结构,通过置换和替代的方式构造密码,达到了扩散和混淆的效果(多轮加密,每一轮加密的秘钥都利用上一次的密文和子密钥生成)。这里不再做详细的加密算法介绍。
1.4 常见的对称加密技术
1.4.1 DES(Data Encryption Standard)
IBM公司研发,1975年公布算法,1977年成为加密标准,1994年决定1998年12月后不再作为数据加密标准。
技术简介:16轮Feistel接口加密,分组长度64位(位数越大越安全,但是加密越慢),使用56位密钥,每一轮使用上面56位密钥生成48位子密钥配合上一轮密文进行下一次加密。
1.4.2 AES(Advanced Encryption Standard)
这个标准用来替代原先的DES,2001年发布,2002年成为标准。AES加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的区块加密标准。
2非对称加密
对于对称加密来说,秘钥是需要加密和解密双方都知道的。可是并不是所有情况下我们都可以在双方交流数据的时候提前商议好加密密钥。在如今网络通信规模如此庞大,网络安全需求日增的情况下,一些用于网络的非对称加密应运而生。
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用不同的密钥,所以这种算法叫作非对称加密算法。(区别于对称加密使用相同秘钥),一般来说其中公钥是公开的,私钥由发布方自己持有。
2.1 RSA
RSA加密算法是目前最常用的非对称加密算法,它基于一个十分简单的数学上的事实:将两个大素数相乘得出他们的积十分容易,但那时想要对其乘积进行因式分解成两个素数却极其困难,因此在公钥公开的情况下,想要破解获取私钥也及其困难。但是非对称加密算法是基于取模运算的,他的计算量相比较于对称加密要大很多,导致他并不能用于大量数据加密。聪明的前辈们用非对称加密算法交换对称秘钥,然后再用对称秘钥加密需要传输的数据。
3 不太像加密算法的算法
为什么说他们不太像是加密算法呢,比如MD5和SHA1,他们常用来做签名算法。而base64更像是个编码格式,虽然达到了使数据肉眼不可读的作用,但是任何人都可以解密,这叫他加密算法我觉得很不贴切。
3.1 MD5
MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性签名服务。对MD5加密算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成—个128位散列值。它的典型应用是对一段信息产生信息摘要(或者叫信息指纹)一般来说相同数据产生的散列值是相同的,不同的数据产生的散列值是不同的。信息发送方发送消息的时候,除了发送消息外,还会发送数据的散列值,接收方接收信息后同样对数据进行散列后对比散列值,如果相同就证明数据没有发生传输错误,是完整的数据。
这里说明一下:散列算法并不能保证两个不同数据的散列值一定不同,很多年前就已经证实MD5算法下,有两个64k的数据散列值是相同的,只不过这种概率相当小,所以MD5依然被广泛应用。
3.2 SHA1
SHA1和MD5类似。主要适用于数字签名和信息指纹提取,但是普遍认为SHA1的算法要比优秀,出现相同散列值的概率更低。
3.3 Base64
Base64算法是网络上最常见的用于传输8bit字节代码的编码方式之一,Base64编码可用于在HTTP环境下传递较长的标识信息。此时,采用Base64编码不仅比较简短,同时也具有一定的加密性(肉眼不可读)。