密码学
密码学上之各类密码的介绍
密码学是研究编制密码和破译密码的科学,在众多的科学领域都有涉及和应用。尤其在军事方面,在一定程度上军事促进了计算机的发展,同时也促进了一些计算机技术的发展。从一开始的凯撒密码(公元前405年)到现在RSA算法(1977年)等一系列非对称加密,中间密码学的发展经历很长一段时间。从一开始只是用来保密的的方法,逐步形成了一门完整的学科。密码学在计算机的学习过程起着至关重要的作用。现在加密的方式主要分为两种:对称加密和非对称加密。除了一些加密,还出现了一些编码方案,如Base64、Unicode等。下面就分三点分别介绍一下对称加密、非对称加密以及各类编码方案。
对称加密
对称加密采用单密钥密码系统的加密方法,同时使用一个密钥对信息进行加密和解密。举个简单的例子。甲乙两人异地恋,他们经常互相之间邮寄信件。为了防止信件安全,不被其他人看到,于是他们商定使用一个保险盒,将信件放入其中。他们打造了同一把钥匙,以便在邮寄信件时将保险盒锁上,以及对方包裹收到时,将保险盒打开。最终心满意足的看到对方的思念,甚是幸福。那么同样的,在数据加密也是同样的道理,信件就相当于明文;将信件放入到保险盒中就相当于用密钥把原始数据(明文)加密;保险盒就是密文;对方用手中的钥匙打开保险盒就相当于用密钥解密密文。所以发收双方都使用这个密钥进行加密和解密。常用的对称加密算法有:
- DES(Date Encryption Standard)数据加密标准,又被称为美国数据加密标准。加密方式是:明文按64为分组,密钥长64位,密钥事实上是56位参与了DES运算。分组后的明文组和56位的密钥按位替代或交换的的方法形成密文组的加密方式。
- 3DES(Tripe DES),是DES的改进版。它相当于每个数据块应用三次DES加密算法,因为现代计算机的计算能力越来越强了,原版的DES密码的密钥长度很容易被暴力破解。此算法通过增加DES密钥的长度来避免类似的攻击。
- 当然还有一些其它的置换密码如: 凯撒密码、Enigma、简单替换密码等一些置换密码密码。
非对称加密
非对称加密和对称加密有着很大的不同,非对称加密采用双密钥密码系统的加密方法。非对称加密是这样有私钥和公钥,明文和密文。加密方案是这样的:公钥对明文加密后,只能用私钥进行解密;用私钥对明文加密,只用公钥进行解密(公钥和私钥是相对的)。 所以使用非对称算法加密可靠性应该要高一点。常见的非对称算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。
常见的编码方案
在实际使用时,对数据有很多编码方案,如对URL进行Base64编码,有利于数据的保护。常li见的编码方案有:Base64编码、Unicode编码、Ascii编码、UTF-8、gtk编码。下面分来介绍一下这些编码方案。
-
Ascii编码 美国信息交换标准代码(American Standard Code for Information Interchange),要明白在计算机中所有的数据,在存储或运算时都采用二进制表示。具体在用哪些二进制表示那些字符,每个人都可以有自己的约定。所以避免大家通信混乱,American National Standard Institute(ANSI)制定了Ascii码。Ascii码使用的是指定的7位或8位二进制数进行编码,组成了128或256种可能的字符。使用7位二进制数来表示所有的大小写字母,数字0到9,标点符号。128-256共128个字符称为扩展Ascii码,用来支持特殊符号、外来语字母和图形符号。
-
Unicode编码 创造Unicode编码的原因是,面对不同地区的不同语言,Ascii编码明显是不够的,那么必须扩展出新的编码方式去解决这一问题。Unicode采用的是使用两个字节来编码一个字符,而Ascii编码采用的是一个字节编码一个字符。Unicode占用的空间是是Ascii的两倍,但是Unicode所能表示的字符个数是2的16次方等于65536。目前Unicode编码采用的是UCS-2,所以Unicode编码从0到127的字符与Ascii编码是一致的。
-
UTF-8编码 UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码互联网的普及,强烈要求出现一种统一的编码方式,UTF-8就是互联网上使用最广的一种Unicode的实现方式。
如上表我们就可以得出UTF-8的编码方式:1)对于单字节的符号,字节的第一位是0,后面7位为Unicode码,所以对于英文字符,UTF-8编码与Ascii编码是一致的。2)对于有n(n>1)字节的符号,第一个字符前n位都是1,第n+1位是0,后面的字节的前两位一律为10,剩下的没有提及的是由原Unicode编码补充的位。根据上表可以知,解读为如果是一个字节,那么该字节的第一位是0,后面的位数表示该字符。如果第一个字节的第一位是1,那么往后有多少连续的1,就代表该字符用了多少个字节。下面以一个汉字为例,“严”的Unicode编码是0x4E25(0100111000100101),根据上表,该字符应该第三行,所以“严”字的UTF-8编码格式应该是1110X 10XXXXXX 10XXXXXX。然后从“严”最后的二进制位开始,依次从后向前替换格式中X,多处的位补0,这样就能得到UTF-8编码为11100100 10111000 10100101,最后转换为16进制为E4B8A5。所以UTF-8编码的特点就是:它是一种可变长的编码方式。可以使用1-4个字节表示一个符号,根据不同的符号而变化长度。 -
Base64编码 Base64编码也是相应的,采用不同的规则,对字符进行编码。可以对任意的二进制数据进行编码,编码组成为65种字符组成的文本文件。范围是数字0-9,大小写字母a-z、A-Z,“+”,“/”,“=”(位数不足时补齐)。那么它所采用的编码规则是,如下例子
通过上表很容易发现,Ascii是每8bit为一组,而Base64编码采用的是6位为一组。那么当字符数不是3的倍数时,可能对应的Base64位就不满,所以后面用“=”补齐,防止和“0000000”冲突。所以往后要是见到一串字符后面跟着“=”多半是Base64编码。
。
同时附上base64的编码索引:
到此,虽然还有很多编码方式,但是这里只做一个抛砖引玉的作用,就不一一介绍了。涉及的知识点还是很多。下面一篇就要介绍哈希函数之信息摘要相关的知识。敬请期待。
参考文献:
https://baike.baidu.com
https://blog.csdn.net/qq_20545367/article/details/79538530
https://blog.csdn.net/Deft_MKJing/article/details/79460485