第一章 密码学
1.1 密码学的基本概念
密码学有数千年的历史,从最开始的替换法到如今的非对称加密算法,经历了古典密码学,近代密码学和现代密码学三个阶段。
(1)古典密码学
1.替换法
例子:例如将 b
替换成 w
,e
替换成p
,这样bee
单词就变换成了wpp。
2.移位法
例子:约定好向后移动2位(abcde - cdefg)
,这样 bee
单词就变换成了dgg
3.古典密码学的破译方式
使用频率分析法破解
(2)近代密码学
恩尼格玛机
(3)现代密码学
1.散列函数
MD5、SHA-1、SHA256
2.对称加密
对称密码应用了相同的加密密钥和解密密钥。
对称加密分为:序列密码(流密码)、分组密码(块密码)
3.非对称密码
非对称密码有两支密钥:公钥和私钥
1.2 ASCII编码
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)
案例:
(1)字符转换成Ascii码
(2)字符串转换成Ascii码
public class AsciiDeom { //(1)字符转换成Ascii码 @Test public void charToAsciiTest() { char a = 'A'; int b = a; System.out.println(b);//65 } //(2)字符串转换成Ascii码 @Test public void stringToAsciiTest(){ String str = "AaZ"; char[] chars = str.toCharArray(); for(char c : chars){ int d = c; System.out.println(d);//65 97 90 } } }
1.3 凯撒加密
(1)中国古代加密
解字
(2)外国加密
位移加密
(3)凯撒位移加密
案例:利用位移法,把Hello world向右移动3位
package com.atguigu.ascii; import org.junit.Test; public class KaiserDemo { //利用位移法,把Hello world向右移动3位 @Test public void KaiserDemo(){ String str = "Hello world"; char[] chars = str.toCharArray(); String str1 =""; for (char c : chars){ int a = c + 3; str1 += (char)a; } System.out.println("str1 = " + str1);//str1 = Khoor#zruog } }
(4)凯撒加密和解密
package com.atguigu.ascii; import org.junit.Test; public class KaiserDemo {//凯撒位移加密和解密 public static void main(String[] args) { String original = "Hello world"; int key = 3; //凯撒加密 String encryptKaiser = encryptKaiser(original, key); System.out.println("encryptKaiser = " + encryptKaiser);//encryptKaiser = Khoor#zruog //凯撒解密 String decryptkaiser = decryptKaiser(encryptKaiser,key); System.out.println("decryptkaiser = " + decryptkaiser); } //凯撒加密 public static String encryptKaiser(String encryptDate,int key){ StringBuilder sb = new StringBuilder(); char[] chars = encryptDate.toCharArray(); for (char c : chars){ int a = c + key; sb.append((char)a); } return sb.toString(); } //凯撒解密、 public static String decryptKaiser(String decryptKaiser,int key){ StringBuilder sb = new StringBuilder(); char[] chars = decryptKaiser.toCharArray(); for(char c : chars){ int a = c - key; sb.append((char)a); } return sb.toString(); } }