第一章 密碼學
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(); } }
1.5 Byte和bit
(1)中文對應的byte和bit
(2)英文對應的byte和bit
package com.atguigu.bytebit; import org.junit.Test; public class ByteBit { //中文對應的byte和bit @Test public void getByte02() { String a = "商"; byte[] bytes = a.getBytes(); for (byte b : bytes) { //對應字節 int c = b; //對應位 String s = Integer.toBinaryString(c); System.out.println(c + " " + s); /** * -27 11111111111111111111111111100101 * -107 11111111111111111111111110010101 * -122 11111111111111111111111110000110 * */ } } //英文對應的byte和bit @Test public void getByte03() { String a = "a"; byte[] bytes = a.getBytes(); for (byte b : bytes) { //對應字節 int c = b; //對應位 String s = Integer.toBinaryString(c); System.out.println(c + " " + s);//97 1100001 } } }