加密
古典密碼學(xué)
起源于古代戰(zhàn)爭(zhēng):在戰(zhàn)爭(zhēng)中為了防止書(shū)信被截獲后重要信息泄露,人們開(kāi)始對(duì)書(shū)信進(jìn)行加密
移位式加密
如密碼棒,使用布條纏繞在木棒上的方式來(lái)對(duì)書(shū)信進(jìn)行加密。
image加密算法:纏繞后書(shū)寫(xiě)
密鑰:木棒的尺寸
替換式加密
按照規(guī)則使用不同的文字來(lái)替換掉原先的文字來(lái)進(jìn)行加密
碼表:
原始字符:ABCDEFGHIJKLMNOPQRESTUVWXXYZ
密碼字符:BCDEFGHIJKLMNOPQRESTUVWXXYZA原始書(shū)信:I love you
加密書(shū)信:j mpwf zpv
解讀后:I love you加密算法:替換文字
密鑰:替換的碼表
現(xiàn)代密碼學(xué)
- 可以加密任何二進(jìn)制數(shù)據(jù)
- 非對(duì)稱加密的出現(xiàn)使得密碼學(xué)有了更廣泛的用途:數(shù)字簽名
對(duì)稱加密
原理
通信雙方使用同一密鑰,使用加密算法配合上密鑰來(lái)加密,解密時(shí)使用加密過(guò)程的完全逆過(guò)程配合密鑰來(lái)進(jìn)行解密
簡(jiǎn)化模型即上面古典密碼學(xué)中的替換式加密模型:對(duì)文字進(jìn)行規(guī)則化替換來(lái)加密,對(duì)密文進(jìn)行逆向的規(guī)則化替換來(lái)解密
image經(jīng)典算法:
DES(56位密鑰) AES(128位,192位,256位)
現(xiàn)在最流行AES加密,DES因密鑰太短而被逐漸棄用對(duì)稱加密的作用:
加密通信,防止信息在不安全網(wǎng)絡(luò)上被截獲后,信息被人讀取或篡改
對(duì)稱加密(如AES)的破解
破解思路:
1.拿到一組或多組原文-密文對(duì)
2.設(shè)法找到一個(gè)密鑰,這個(gè)密鑰可以將這些原文-密文對(duì)中的原文加密為密文,以及將密文解密為原文的組合,即為成功破解
反破解:
一種優(yōu)秀的對(duì)稱加密算法的標(biāo)準(zhǔn)是:讓破解者找不到比窮舉法更有效的破解手段,并且窮舉法的破解時(shí)間足夠長(zhǎng)(例如數(shù)千年)對(duì)稱加密的缺點(diǎn)
密鑰泄露:由于密鑰需要傳輸給對(duì)方,所以密鑰有泄露風(fēng)險(xiǎn);一旦密鑰泄露,則加密通信失敗
非對(duì)稱加密
原理
使用公鑰對(duì)數(shù)據(jù)進(jìn)行加密得到密文;使用私鑰對(duì)數(shù)據(jù)進(jìn)行解密得到原數(shù)據(jù)
非對(duì)稱加密使用的是復(fù)雜的數(shù)學(xué)技巧,在古典密碼學(xué)中沒(méi)有對(duì)應(yīng)的原型
image使用非對(duì)稱加密通信,可以在不可信網(wǎng)絡(luò)上將雙方的公鑰傳給對(duì)方,然后在發(fā)消息前分別對(duì)消息使用對(duì)方的公鑰來(lái)加密和使用自己的私鑰來(lái)簽名,做到不可信網(wǎng)絡(luò)上的可靠密鑰傳播及加密通信
image由于公鑰和私鑰相互可解(不是解出公鑰和私鑰,而是解出對(duì)方加密的數(shù)據(jù)),因此非對(duì)稱加密還可以應(yīng)用于數(shù)字簽名技術(shù)
image通常會(huì)對(duì)原數(shù)據(jù)hash以后對(duì)hash簽名,然后附加在元數(shù)據(jù)的后面作為簽名。這是為了讓數(shù)據(jù)更小
imageA使用A的私鑰對(duì)原數(shù)據(jù)的hash簽名,B使用A的公鑰對(duì)簽名進(jìn)行驗(yàn)證
A使用B的公鑰對(duì)原數(shù)據(jù)進(jìn)行加密,B使用B的私鑰對(duì)密文進(jìn)行解密經(jīng)典算法:
RSA(可用于加密和簽名)
DSA(僅用于簽名,速度更快)優(yōu)缺點(diǎn):
- 優(yōu)點(diǎn):可以在不安全網(wǎng)絡(luò)上傳輸密鑰
- 缺點(diǎn):計(jì)算復(fù)雜,因此性能相比對(duì)稱加密差很多
非對(duì)稱加密的破解
破解思路:
1.和對(duì)稱加密不同的是,非對(duì)稱加密的公鑰很容易獲得,因此制造原文-密文對(duì)是沒(méi)有困難的
2.所以,非對(duì)稱加密的關(guān)鍵只在于,如何找到一個(gè)正確的私鑰,可以解密所有經(jīng)過(guò)公鑰加密的密文。找到這樣的私鑰即為成功破解
3.由于非對(duì)稱加密自身的特性,怎樣通過(guò)公鑰來(lái)推斷出私鑰通常是一種思路(如RSA),但往往最佳手段依然是窮舉法;只是和對(duì)稱加密破解的區(qū)別在于:對(duì)稱加密破解是不斷嘗試自己的新私鑰是否可以將自己拿到的原文-密文對(duì)進(jìn)行加密和解密,而非對(duì)稱加密是不斷嘗試自己的新私鑰是否和公鑰互相可解
反破解:
和對(duì)稱加密一樣非對(duì)稱加密算法優(yōu)秀的標(biāo)準(zhǔn)同樣在于,讓破解者找不到比窮舉法更有效的破解手段,并且窮舉法的破解時(shí)間足夠長(zhǎng)
密碼學(xué)密鑰和登錄密碼
-
密鑰(key)
場(chǎng)景:用于加密和解密
目的:保證數(shù)據(jù)盜取時(shí)不會(huì)被人讀懂內(nèi)容
焦點(diǎn):數(shù)據(jù)
-
登錄密碼(password)
場(chǎng)景:用戶進(jìn)入網(wǎng)站或游戲前的身份驗(yàn)證
目的:數(shù)據(jù)提供方或應(yīng)用服務(wù)方對(duì)賬戶擁有者數(shù)據(jù)的保護(hù),保證你是你的時(shí)候才提供權(quán)限
焦點(diǎn):身份
編碼
Base64
定義
將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換由64個(gè)字符組成的字符串編碼算法
什么是二進(jìn)制數(shù)據(jù)?
- 廣義:所有計(jì)算機(jī)數(shù)據(jù)都是二進(jìn)制數(shù)據(jù)
- 狹義:非文本數(shù)據(jù)即為二進(jìn)制數(shù)據(jù)
算法
將原數(shù)據(jù)的ASCII碼使用二進(jìn)制(8位)表示,每6位對(duì)應(yīng)成Base64索引表中的一個(gè)字符,然后編排成一個(gè)字符串,若原數(shù)據(jù)長(zhǎng)度不是3的倍數(shù)時(shí)且剩下1個(gè)輸入數(shù)據(jù),則在編碼結(jié)果后加2個(gè)=;若剩下2個(gè)輸入數(shù)據(jù),則在編碼結(jié)果后加1個(gè)=;每三位原字符轉(zhuǎn)換成4位Base64編碼字符,數(shù)據(jù)會(huì)增加1/3
索引表:
image編碼示例:把Man進(jìn)行Base64編碼
image編碼示例:Base的末尾補(bǔ)足
image
如果要編碼的字節(jié)數(shù)不能被3整除,最后會(huì)多出1個(gè)或2個(gè)字節(jié),那么可以使用下面的方法進(jìn)行處理:先使用0字節(jié)值在末尾補(bǔ)足,使其能夠被3整除,然后再進(jìn)行Base64的編碼。在編碼后的Base64文本后加上一個(gè)或兩個(gè)=號(hào),代表補(bǔ)足的字節(jié)數(shù)。也就是說(shuō),當(dāng)最后剩余兩個(gè)八位(待補(bǔ)足)字節(jié)(2個(gè)byte)時(shí),最后一個(gè)6位的Base64字節(jié)塊有四位是0值,最后附加上兩個(gè)等號(hào);如果最后剩余一個(gè)八位(待補(bǔ)足)字節(jié)(1個(gè)byte)時(shí),最后一個(gè)6位的base字節(jié)塊有兩位是0值,最后附加一個(gè)等號(hào)。
Base64的用途
- 將二進(jìn)制數(shù)據(jù)擴(kuò)充了存儲(chǔ)和傳輸途徑(例如:可以把數(shù)據(jù)保存到本地文件,可以通過(guò)聊天對(duì)話框或短信形式發(fā)送二進(jìn)制數(shù)據(jù),可以在URL中加入簡(jiǎn)單的二進(jìn)制數(shù)據(jù))
- 普通的字符串在經(jīng)過(guò)Base64編碼后的結(jié)果會(huì)變得肉眼不可讀,因此可以適用于一定條件下的防偷窺(較少用)
Base64的缺點(diǎn)
因?yàn)樽陨淼脑?6位變8位),因此每次Base64編碼之后,數(shù)據(jù)都會(huì)增大約1/3,所以會(huì)影響存儲(chǔ)和傳輸性能
Base64 加密圖片傳輸更安全和?效?
這種說(shuō)法不對(duì),首先,Base64并不是加密;另外,Base64會(huì)導(dǎo)致數(shù)據(jù)增大1/3,降低網(wǎng)絡(luò)性能,增大用戶流量開(kāi)銷,是畫(huà)蛇添足的表現(xiàn)
Base對(duì)圖片進(jìn)行編碼的用處在于,有時(shí)需要用文本形式來(lái)傳輸圖片。除此之外,完全沒(méi)有必要使用Base64對(duì)圖片進(jìn)行額外處理
變種:Base58
比特幣使用的編碼方式,去掉了Base64中的數(shù)字
0,大寫(xiě)字母O,大寫(xiě)字母I,小寫(xiě)字母l,以及+,/,用于比特幣地址的表示Base58對(duì)于Base64的改動(dòng),主要目的在于用戶的便捷性。由于去掉了難以區(qū)分的字符,使得Base58對(duì)于人工抄寫(xiě)更加方便。另外,去掉
+,/后也讓大多數(shù)的軟件可以方便雙擊選取
URL使用的百分號(hào)編碼
在URL的字符串中,對(duì)一些不用于特殊用途的保留字符,使用
%為前綴進(jìn)行單獨(dú)編碼,以避免出現(xiàn)解析錯(cuò)誤。例如:要在
http://hencoder.com/users后面添加查詢字符串,查詢name為隱匿&偉大的用戶,如果直接寫(xiě)成http://hencoder.com/users/?name=隱匿&偉大,&符號(hào)會(huì)被解析為分隔符號(hào),因此需要對(duì)它進(jìn)行轉(zhuǎn)碼,轉(zhuǎn)碼后的URL為http://hencoder.com/users/?name=隱匿%26偉大。這種編碼僅用于URL,目的是避免解析錯(cuò)誤的出現(xiàn)
壓縮和解壓縮
含義
- 壓縮:將數(shù)據(jù)使用更具有存儲(chǔ)優(yōu)勢(shì)的編碼算法進(jìn)行編碼
- 解壓縮:將壓縮數(shù)據(jù)解碼還原成原來(lái)的形式,以方便使用
目的
減少數(shù)據(jù)占用的存儲(chǔ)空間
粗暴算法舉例:
將下面文本內(nèi)容壓縮:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
使用某種算法壓縮后的數(shù)據(jù)為:compress:a:1062;b:105注意:具體的壓縮場(chǎng)景有許多,因此壓縮算法也會(huì)復(fù)雜得多,上面只是一個(gè)原型算法壓縮是編碼么?
是,所謂編碼,即把數(shù)據(jù)從一種形式轉(zhuǎn)換為另一種形式。壓縮過(guò)程屬于編碼過(guò)程,解壓縮過(guò)程屬于解碼過(guò)程
常見(jiàn)壓縮算法
DEFLATE,JPEG,MP3等
圖片與音頻,視頻編解碼
含義
將圖片,音頻,視頻數(shù)據(jù)通過(guò)編碼來(lái)轉(zhuǎn)換成存檔形式(編碼),以及從存檔形式轉(zhuǎn)換回來(lái)(解碼)
目的
存儲(chǔ)和壓縮媒體數(shù)據(jù)(大多數(shù)媒體編碼算法會(huì)壓縮數(shù)據(jù),但不是全部)
圖片壓縮粗暴算法舉例
一張純白(白色的16進(jìn)制數(shù)值為0xffffff)的64×64不透明像素圖片,原數(shù)據(jù)格式大致為:
width:64;height:64;ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.......ffffff
使用某種算法壓縮后的數(shù)據(jù)為:width:64;height:64;ffffff:[0,0]-[63,63]注意:具體的壓縮場(chǎng)景有許多,因此壓縮算法也會(huì)復(fù)雜得多,上面只是一個(gè)原型算法?頻與視頻的編碼與上面的圖片編碼同理。
序列化
把數(shù)據(jù)對(duì)象(一般是內(nèi)存中的,例如JVM中的對(duì)象)轉(zhuǎn)換成字節(jié)序列的過(guò)程。對(duì)象在程序內(nèi)存里的存放形式是散亂的(存放在不同的內(nèi)存區(qū)域,并且由引用進(jìn)行連接),通過(guò)序列化可以把內(nèi)存中的對(duì)象轉(zhuǎn)換成一個(gè)字節(jié)序列,從而使用
byte[]等形式進(jìn)行本地存儲(chǔ)或網(wǎng)絡(luò)傳輸,在需要的時(shí)候重新組裝(反序列化)來(lái)使用目的
讓內(nèi)存中的對(duì)象可以被存儲(chǔ)和傳輸
序列化是編碼么?
不是,編碼是把數(shù)據(jù)由一種數(shù)據(jù)格式轉(zhuǎn)換成另一種數(shù)據(jù)格式;而序列化是把數(shù)據(jù)由內(nèi)存中的對(duì)象(而不是某種具體的數(shù)據(jù)格式)轉(zhuǎn)換成字節(jié)序列
Hash
定義
把任意數(shù)據(jù)轉(zhuǎn)換成指定大小范圍(通常很小,例如256字節(jié)以內(nèi))的數(shù)據(jù)
作用
相當(dāng)于從數(shù)據(jù)中提取出摘要信息,因此最主要用途是數(shù)字指紋
用途
1. 唯一性驗(yàn)證 例如Java中的hashCode方法
怎么重寫(xiě)hashCode方法?
把equals方法中每個(gè)用于判斷相等的變量都放進(jìn)hashCode()中,一起生成一個(gè)盡量不會(huì)碰撞的整數(shù)即可
為什么每次重寫(xiě)equals()都需要重寫(xiě)hashCode()?
因?yàn)橐研碌呐袛鄺l件放進(jìn)hashCode()中2.數(shù)據(jù)完整性驗(yàn)證
從網(wǎng)絡(luò)上下載文件后,通過(guò)對(duì)比文件的hash值(如MD5,SHA1),可以確認(rèn)下載的文件是否有損壞。如果下載文件的hash值和文件提供方給出的hash值一致,則證明下載的文件是完好無(wú)損的3.快速查找
HashMap 會(huì)先用hashCode()進(jìn)行判斷,如果相同,再調(diào)用equals()進(jìn)行判斷4.隱私保護(hù)
當(dāng)重要數(shù)據(jù)需要暴露時(shí),有時(shí)可以選擇暴露它的hash值(例如MD5),以保障原數(shù)據(jù)的安全。例如網(wǎng)站登錄時(shí),可以只保存用戶密碼的hash值,在每次登錄驗(yàn)證時(shí)只需要將輸入的密碼的hash值和數(shù)據(jù)庫(kù)中保存的Hash值做比較就好,網(wǎng)站無(wú)需知道用戶的密碼。這樣,當(dāng)網(wǎng)站數(shù)據(jù)失竊時(shí),用戶不會(huì)因?yàn)樽约旱拿艽a被盜導(dǎo)致其它網(wǎng)站的安全也會(huì)受到威脅Hash是編碼么?
不是,Hash是單向過(guò)程,往往是不可逆的,無(wú)法進(jìn)行逆向恢復(fù)操作,因此Hash不屬于編碼
Hash是加密嗎?
不是,Hash是單向過(guò)程,無(wú)法進(jìn)行逆向恢復(fù)操作,因此Hash不屬于加密。(MD5不是加密)
字符集
含義
一個(gè)由整數(shù)向現(xiàn)實(shí)世界中的文字符號(hào)的Map
分支
- ASCII:128個(gè)字符
- ISO-8859-1:對(duì)ASCII進(jìn)行擴(kuò)充
- Unicode:13萬(wàn)個(gè)字符集
- UTF-8:Unicode編碼分支
- UTF-16:Unicode編碼分支
- GBK/GB2312/GB18030:中國(guó)自研標(biāo)準(zhǔn),多字節(jié),字符集+編碼








