安全密碼學,主要研究的是編制密碼和破譯密碼。
安全密碼學的發展歷史分為:
古典密碼學 ——> 近代密碼學 ——> 現代密碼學
一、古典密碼學
核心: 替換法加密、移位法加密。
1.替換法
替換法就是使用固定的信息,將原文替換成密文。
例如:bee, 將b替換成w,e替換成p,那單詞就變為wpp。
替換法的加密方式有兩種,分別為:單表替換、多表替換。
- 單表替換:原文和密文使用的是同一張表(簡單)。
- 多表替換:又多張表,原文和密文進行對比。
表單1:abcde - swtrp、表單2:abcde-chfhk、表單3:abcde-jftou
原文:bee 密鑰:312 密文:fpk
2.移位法
移位法:按照字母,在字母表上面的位置進行移動。其中:最著名的是凱撒加密。
凱撒加密:
例子:abcde ——> 移2位 ——> cdefg
3.古典密碼學破譯方式:
使用頻度分析法破譯密碼:在不知道密碼的規則前提下,進行破譯密碼。
頻率分析基於如下原理:在任何一種書面語言中,不同的字母或字母組合出現的頻率各不相同。而且,對於以這種語言書寫的任意一段文本,都具有大致相同的特征字母分布。
比如,在英語中,字母E出現的頻率很高,而X則出現得較少。類似地,ST、NG、TH,以及QU等雙字母組合出現的頻率非常高,NZ、QJ組合則極少。英語中出現頻率最高的12個字母可以簡記為“ETAOIN SHRDLU”。在一個簡單的替換密碼中,明文中的每一個字母都被另一個字母替換,而且且明文中相同的字母在轉換為密文時總是被同一個字母所替換。比如,所有的e都會被替換成 X.一個含有大量X的密文消息會向密碼破譯者暗示X替換e.
二、近代密碼學
概率論出現后,古典密碼學的安全性大大降低,為了保證密碼的安全,在古典密碼學的基礎上進行了完善和優化,就有了近代密碼學。
核心: 替換法加密、移位法加密
代表:恩尼格瑪密碼機:流加密,使用的也是移位法和替換法。 后面被圖靈破解了。
三、現代密碼學
1. 散列函數
MD5,SHA-1,SHA-256,SHA-512
2. 對稱加密
對稱加密,加密和解密時,使用的同一把密鑰,所以一般也成為單密鑰加密。
主流的加密方式有:DES加密、AES加密。
對稱加密的核心原理:流加密、塊加密
- 流加密:對信息流中的每一個元素(字母或者比特)作為基本的處理單元進行加密。
- 塊加密:先對信息流分塊,然后對每塊進行加密。
這里需要提一下:古典密碼學加密都是屬於流加密的范疇。
對稱加密的特點:
- 加密速度塊,可以加密大文件。
- 密文不可逆。但是如果密鑰文件泄露,會導致數據暴露。
- 加密后編碼Ascii表找不到對應的字符,出現亂碼。
- 一般結合Base64使用。
3. 加密模式
加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html
ECB : Electronic codebook, 電子密碼本. 需要加密的消息按照塊密碼的塊大小被分為數個塊,並對每個塊進行獨立加密
- 優點 : 可以並行處理數據
- 缺點 : 同樣的原文生成同樣的密文, 不能很好的保護數據
- 同時加密,原文是一樣的,加密出來的密文也是一樣的
CBC : Cipher-block chaining, 密碼塊鏈接. 每個明文塊先與前一個密文塊進行異或后,再進行加密。在這種方法中,每個密文塊都依賴於它前面的所有明文塊.
- 優點 : 同樣的原文生成的密文不一樣
- 缺點 : 串行處理數據,加密耗時長.
4. 填充模式
當需要按塊處理的數據, 數據長度不符合塊處理需求時, 按照一定的方法填充滿塊長的規則。填充模式分為:NoPadding、PKCS5padding。
NoPadding:不填充
在DES加密算法下, 要求原文長度必須是8byte的整數倍
在AES加密算法下, 要求原文長度必須是16byte的整數倍
PKCS5Padding:數據塊的大小為8位, 不夠就補足
需要特別指出的是:
1. 默認情況下, 加密模式和填充模式為 : ECB/PKCS5Padding。
2. 如果使用CBC模式, 在初始化Cipher對象時, 需要增加參數, 初始化向量IV : IvParameterSpec iv = new IvParameterSpec(key.getBytes());
四、非對稱加密
非對稱加密,有兩把密鑰,公鑰和私鑰。
使用公鑰加密,必須使用私鑰解密。或者使用私鑰加密,必須使用公鑰解密。
常見的非對稱加密算法為:RSA算法和ECC算法
對稱加密和非對稱加密的比較:
一般在使用的時候,會通過非對稱加密傳輸密鑰,對稱加密傳輸數據,數據摘要算法保證數據的完整性。而這樣的方式正是Https的密碼套件的基本原理:
五、安全加密相關概念解析
1. Base64
Base64 不是加密算法,而是可讀性算法,目的不是為了保護我們的數據,目的是為了可讀性。
Base64 是由64個字符組成,A-Z,a-z,0-9, + 和 /
Base58 一般用在比特幣的編碼。在Base58里面沒有字母o,大寫字母I和小寫字母i,也沒有+ / 也沒有數字0
Base64 的原理
Base64的,是三個字節為一組,一個字節是8位,一共是24位。Base64會把三個字節轉換為4組,每組6位。
一個字節,應該是8位,那么分組后會缺少兩位,在高位補0,這樣做的好處是,Base64取后面6位,前面的2位去掉后就能夠把Base64控制在0-63之間。
Base 64 需要設置三個字節為一組,輸出的時候,如果不夠三個字節,就需要使用=進行補齊。
2. toString 和 newString()的核心原理和區別.
- toString 方法:實際調用的是 object.toString 的方法,一般在 object 的 toString 方法中,返回的是哈希值。
- new String 方法:是根據傳的參數,如果參數是一個字節數組,就會使用 java 虛擬機默認的編碼格式,把這個字節數組進行decode,找到對應的字符,如果虛擬機的編碼格式是ISO-8859-1,那么就回去ASCII編碼表里進行參照,找到對應的字符。
那么什么時候使用new String, 什么時候使用 toString ?
- 在進行數據轉碼的時候,使用new String
- 打印對象或者得到地址的時候,可以使用 toString。
3.消息摘要
概念:消息摘要(Message Digest)又稱為數字摘要(Digital Digest)。它是一個唯一對應一個消息或文本的固定長度的值,它由一個單向Hash加密函數對消息進行作用而產生。使用數字摘要生成的值是不可以篡改的,為了保證文件或者值的安全
特點:無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。例如應用MD5算法摘要的消息有128個比特位,用SHA-1算法摘要的消息最終有160比特位的輸出。只要輸入的消息不同,對其進行摘要以后產生的摘要消息也必不相同;但相同的輸入必會產生相同的輸出。消息摘要是單向、不可逆的。
常見算法 : MD5、SHA1、SHA256、SHA512
4.數字簽名
數字簽名(又稱公鑰數字簽名)是只有信息的發送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。它是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術來實現的,用於鑒別數字信息的方法。
一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證。數字簽名是非對稱密鑰加密技術與數字摘要技術的應用。而數字簽名呢?其實也是同樣的道理,他的含義是:在網絡中傳輸數據時候,給數據添加一個數字簽名,表示是誰發的數據,而且還能證明數據沒有被篡改。數字簽名的主要作用就是保證了數據的有效性(驗證是誰發的)和完整性(證明信息沒有被篡改)。
數字簽名的過程:
對信息做摘要,用私鑰加密摘要。密文即簽名。數字簽名一般會和信息一起發送。
驗證時數字簽名,會用同樣的算法對消息做摘要,然后用公鑰解密密文,對比結果,來判斷數據是否被篡改。