密碼學(xué)
古典密碼學(xué) : 起源于古代戰(zhàn)爭,為了防止書信被截獲后重要信息泄漏铸鹰,人們開始對書信進(jìn)行加密
-
移位式加密 : 如密碼棒癌别,是用布條纏繞在木棒上的方式來對書信進(jìn)行加密
加密算法 : 纏繞木棒后書寫
密鑰 : 木棒的尺寸
-
替換式加密 : 按規(guī)則使用不同的文字替換原先的文字來進(jìn)行加密
碼表 :
原始字符 : ABCDEFGHIJKLMNOPQRSTUVWXYZ
加密字符 : BCDEFGHIJKLMNOPQRSTUVWXYZA
原始書信 : I love you
加密書信 : J mpwf zpv
解讀后 : I love you
加密算法 : 替換文字
密鑰 : 替換的碼表
現(xiàn)代密碼學(xué) :
不只可以用于文字加密,還可以加密任何二進(jìn)制數(shù)據(jù)
非對稱加密的出現(xiàn)使得密碼學(xué)有了更廣泛的用途 : 數(shù)字簽名
-
對稱加密 : 通信雙方使用同一個(gè)密鑰掉奄,使用加密算法配合密鑰來進(jìn)行加密规个,解密時(shí)使用加密過程的完全逆過程配合密鑰來進(jìn)行解密凤薛。
簡化模式即上面古典密碼學(xué)中替換式加密的模型 : 對文字進(jìn)行規(guī)則化替換來加密姓建,對密文進(jìn)行逆向的規(guī)則化替換來解密。
-
經(jīng)典算法
DES(56位密鑰缤苫,密鑰太短而逐漸被棄用)速兔、AES(128位、192位活玲、256位密鑰涣狗,現(xiàn)在最流行)
-
對稱加密作用
加密通信,防止信息在不安全網(wǎng)絡(luò)上被截獲后舒憾,信息被人讀取或篡改
-
對稱加密(如AES)的破解
破解思路
- 拿到一組或多組原文-密文對
- 設(shè)法找到一個(gè)密鑰镀钓,這個(gè)密鑰可以將這些原文-密文對中的原文加密為密文,以及將密文解密為原文的組合镀迂,即為成功破解
反破解
一種優(yōu)秀的對稱加密算法的標(biāo)準(zhǔn)是丁溅,讓破解者找不到比窮舉法(暴力破解法)更有效的破解手段,并且窮舉法的時(shí)間足夠長(例如幾千年)
-
對稱加密的缺點(diǎn)
密鑰泄漏 : 不能在不安全網(wǎng)絡(luò)上傳輸密鑰探遵,一旦密鑰泄漏則加密通信失敗
-
-
非對稱加密 : 使用公鑰對數(shù)據(jù)進(jìn)行加密得到密文窟赏;使用私鑰對數(shù)據(jù)進(jìn)行解密得到原數(shù)據(jù)
非對稱加密的使用的是復(fù)雜的數(shù)學(xué)技巧,在古典密碼學(xué)中沒有對應(yīng)的模型箱季。
使用非對稱加密通信涯穷,可以在不可信網(wǎng)絡(luò)上將雙方的公鑰傳給對方,然后在發(fā)消息前分別對消息使用使用對方的公鑰進(jìn)行加密和使用自己的私鑰來簽名藏雏,做到不可靠網(wǎng)絡(luò)上的可靠密鑰傳播及加密通信拷况。
由于私鑰和公鑰互相可解,因此非對稱加密還可以應(yīng)用于數(shù)字簽名技術(shù)掘殴。
通常會(huì)對原數(shù)據(jù)hash以后對hash簽名蝠嘉,然后附加在原數(shù)據(jù)的后面作為簽名,這是為了讓數(shù)據(jù)更小杯巨。
-
經(jīng)典算法
RSA(可用于加密和簽名)蚤告、DSA(僅用于簽名,但速度更快)
-
對稱加密作用
加密通信服爷,防止信息在不安全網(wǎng)絡(luò)上被截獲后杜恰,信息被人讀取或篡改
-
非對稱加密(如RSA获诈、ECDSA)的破解
破解思路
- 和對稱加密的不同之處在于,非對稱加密的公鑰很容易獲得心褐,因此制造原文-密文對是沒有困難的事
- 所以非對稱加密的關(guān)鍵只在于舔涎,如何找到一個(gè)正確的私鑰,可以解密所有經(jīng)過公鑰加密過的密文逗爹,找到這樣的私鑰即為成功破解
- 由于非對稱加密的自身特性亡嫌,怎樣通過公鑰來推斷出私鑰通常是一種思路(如RSA),但往往最佳手段依然是窮舉法掘而,只是和對稱加密破解的區(qū)別在于挟冠,對稱加密破解是不斷嘗試自己的新密鑰是否可以將自己拿到的原文-密文對進(jìn)行加密和解密,而非對稱加密是不斷嘗試自己的新私鑰是否和公鑰互相可解袍睡。
反破解
和對稱加密一樣知染,非對稱加密算法優(yōu)秀的的標(biāo)準(zhǔn)同樣在于,讓破解者找不到比窮舉法更有效的破解手段斑胜,并且窮舉法的破解時(shí)間足夠長
-
對稱加密的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn) : 可以在不安全網(wǎng)絡(luò)上傳輸密鑰
- 缺點(diǎn) : 計(jì)算復(fù)雜控淡,因此性能相比對稱加密差很多
密碼學(xué)密鑰與登錄密碼
- 密鑰 (key)
- 場景 : 用于加密和解密
- 目的 : 保證數(shù)據(jù)被盜時(shí)不會(huì)被人讀懂內(nèi)容
- 焦點(diǎn) : 數(shù)據(jù)
- 登錄密碼(password)
- 用戶進(jìn)入網(wǎng)站或游戲前的身份驗(yàn)證
- 目的 : 數(shù)據(jù)服務(wù)方或應(yīng)用服務(wù)方對賬戶擁有者數(shù)據(jù)的保護(hù),保證【你是你】的時(shí)候才提供權(quán)限
- 焦點(diǎn) : 身份
Base64
將二進(jìn)數(shù)數(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ù)每6位對應(yīng)成base64索引表中的一個(gè)字符編排成一個(gè)字符串(每個(gè)字符8位)
-
Base64索引表
編碼實(shí)例 : 把 [Man] 進(jìn)行base64編碼
編碼實(shí)例 : base64的末尾補(bǔ)足
-
Base64的用途
- 將二進(jìn)制數(shù)據(jù)擴(kuò)充了儲(chǔ)存和傳輸途徑(例如可以把數(shù)據(jù)保存到文本文件止潘、可以通過聊天對話框或短信形式發(fā)送二進(jìn)制數(shù)據(jù)掺炭、可以在URL中加入簡單的二進(jìn)制數(shù)據(jù))
- 普通的字符串在經(jīng)過base64的編碼后的結(jié)果會(huì)變得肉眼不可讀,因此可以適用于一定條件下的防偷窺(較少用)
-
Base64的缺點(diǎn)
因?yàn)樽陨淼脑恚?位變8位)凭戴,因此每次base64編碼之后涧狮,數(shù)據(jù)都會(huì)增大約1/3,所以會(huì)影響存儲(chǔ)和傳輸性能簇宽。
-
Base64加密圖片傳輸是否更安全和高效
并不是勋篓。首先,Base64并不是加密魏割;另外Base64會(huì)導(dǎo)致數(shù)據(jù)增大約1/3譬嚣,降低網(wǎng)絡(luò)性能,增大用戶流量開銷钞它,是畫蛇添足的手段
Base64對圖片進(jìn)行編碼的用途在于拜银,有時(shí)需要使用文本形式來傳輸圖片。除此之外遭垛,完全沒必要使用Base64來對圖片進(jìn)行額外處理
-
變種Base58
比特幣使用的編碼方式尼桶,去掉了Base64中的數(shù)字“0”,字母大寫“O”,字母大寫“I”和字母小寫“l(fā)”,以及“+”和“/”符合锯仪,用于比特幣地址的表示
Base58對于Base64的改動(dòng)泵督,主要目的在于用戶的便攜性。由于去掉了難以區(qū)分的字符庶喜,使得Base58對于
人工抄寫
更加方便小腊。另外救鲤,去掉了“+”和“/”號后也讓大多數(shù)的軟件可以方便雙擊選取
URL使用的百分號編碼
在URL的字符串中,對一些不用于特殊用途的保留字符秩冈,使用百分號“%”為前綴進(jìn)行單獨(dú)編碼本缠,以避免出現(xiàn)解析錯(cuò)誤。
例如入问,要在 http://hencoder.com/users 后面添加查詢字符串丹锹,查詢 name 為隱匿&偉大
的用戶,如果直接寫成 http://hencoder.com/user/?name=隱匿&偉大芬失,“&”符號就會(huì)被解析為分隔符號楣黍,因此需要對它進(jìn)行轉(zhuǎn)碼,轉(zhuǎn)碼后的 URL 為 http://hencoder.com/user/?name=隱匿%26偉大
這種編碼僅用于URL麸折,目的是避免解析錯(cuò)誤的出現(xiàn)
壓縮與解壓縮
-
含義
- 壓縮 : 將數(shù)據(jù)使用更具有存儲(chǔ)優(yōu)勢的編碼算法進(jìn)行編碼
- 壓縮 : 將壓縮數(shù)據(jù)解碼還原成原來的形式锡凝,以方便使用
目的 : 減小數(shù)據(jù)占用的存儲(chǔ)空間
-
粗暴算法舉例
將下面文本內(nèi)容壓縮
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
使用某種算法壓縮后的數(shù)據(jù)為:
compress:a:1062;b:105
具體的壓縮場景有很多粘昨,因此壓縮算法也會(huì)復(fù)雜得多垢啼,上面只是一個(gè)原型算法
-
壓縮是編碼嗎
是。所謂編碼即把數(shù)據(jù)從一種形式轉(zhuǎn)換成另一種形式张肾。壓縮過程屬于編碼過程芭析,解壓縮過程屬于解碼過程
-
常見壓縮算法
DEFLATE、JPEG吞瞪、MP3等
圖片與音頻馁启、視頻編解碼
-
含義
將圖片、音頻芍秆、視頻數(shù)據(jù)通過編碼形式來轉(zhuǎn)換成存檔形式(編碼)惯疙,以及從存檔形式轉(zhuǎn)換回來(解碼)
目的 : 存儲(chǔ)和壓縮媒體數(shù)據(jù)(大多數(shù)媒體編碼算法會(huì)壓縮數(shù)據(jù),但不是全部)
-
圖片壓縮粗暴算法舉例
一張純白(白色的16進(jìn)制數(shù)值為0xffffff)64 * 64 的不透明像素圖片,原始數(shù)據(jù)格式大致為 :
width:64;height:64;ffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.......f fffff
使用某種算法壓縮后的數(shù)據(jù)為:
width:64;height:64;ffffff:[0,0]-[63,63]
音頻與視頻的編碼與上面的圖片編碼同理
序列化
把數(shù)據(jù)對象(一般是內(nèi)存中的妖啥,如JVM中的對象)轉(zhuǎn)換成字節(jié)序列的過程霉颠。對象在程序內(nèi)存中的存放形式是散亂的(存放在不同的內(nèi)存區(qū)域,并且由引用來進(jìn)行連接)荆虱,通過序列化可以把內(nèi)存中的對象轉(zhuǎn)換成一個(gè)字節(jié)序列蒿偎,從而使用byte[]等形式進(jìn)行本地存儲(chǔ)、網(wǎng)絡(luò)傳輸怀读,在需要的時(shí)候重新組裝(反序列化)來使用
- 目的 : 讓內(nèi)存中的對象可以被儲(chǔ)存和傳輸
- 序列化是編碼嗎 : 不是
- 和編碼的區(qū)別 : 編碼是把數(shù)據(jù)由一種數(shù)據(jù)格式轉(zhuǎn)換成另一種數(shù)據(jù)格式诉位,而序列化是把數(shù)據(jù)由內(nèi)存中的對象(而不是某種具體的格式)轉(zhuǎn)換成字節(jié)序列
Hash
定義 : 把任意數(shù)據(jù)轉(zhuǎn)換成指定大小范圍(通常很小,例如256字節(jié)以內(nèi))的數(shù)據(jù)
作用 : 相當(dāng)于從數(shù)據(jù)中提出摘要信息菜枷,因此最主要用途是數(shù)字指紋
-
Hash的實(shí)際用途
-
唯一性驗(yàn)證苍糠,例如java中的hashCode()方法
如何重寫hashCode()方法 : 把equal()方法中每個(gè)用于判斷相等的變量都放進(jìn)hashCode()中,一期生成一個(gè)盡量不會(huì)碰裝的整數(shù)即可
為什么每次重寫equal()方法都需要啤誊,因?yàn)橐研碌呐袛鄺l件放進(jìn)hashCode()
-
數(shù)據(jù)完整性驗(yàn)證
從網(wǎng)絡(luò)上下載文件后岳瞭,通過比對文件的hash值(MD5歹袁、SHA1),可以確認(rèn)下載的文件是否有損壞寝优。如果下載的文件hash值和文件提供方給出的hash值一直条舔,則證明下載的文件是完好無損的
快速查找 : HashMap
-
隱私保護(hù)
當(dāng)重要數(shù)據(jù)必須暴露的時(shí)候,有時(shí)可以選擇暴露它的hash值(例如MD5)乏矾,以保證原數(shù)據(jù)的安全孟抗。例如網(wǎng)站登錄時(shí)可以只保存用戶密碼的hash值,每次登錄驗(yàn)證時(shí)只需要將輸入的密碼的hash值和數(shù)據(jù)庫中保存的hash值作對比就好钻心,網(wǎng)站無需知道用戶的密碼凄硼。這樣,當(dāng)網(wǎng)站數(shù)據(jù)失竊時(shí)捷沸,用戶不會(huì)因?yàn)樽约旱拿艽a被盜導(dǎo)致其它網(wǎng)站的安全也收到威脅摊沉。
注意 : 這不屬于加密
-
-
Hash是編碼嗎
不是,Hash是單向操作痒给,往往是不可逆的说墨,無法進(jìn)行逆向恢復(fù)操作,所以Hash不屬于編碼
-
Hash是加密嗎
不是苍柏,Hash是單向操作尼斧,無法進(jìn)行逆向恢復(fù)操作,所以Hash不屬于加密(記住试吁,MD5不是加密)
字符集 : 一個(gè)由整數(shù)向現(xiàn)實(shí)世界中的文字符號的Map
分支 :
- ASCII : 128個(gè)字符棺棵,1字節(jié)
- ISO-8859-1 : 對ASCII 進(jìn)行擴(kuò)充,1字節(jié)
- Unicode : 13萬個(gè)字符熄捍,多字節(jié)
- UTF-8 : Unicode的編碼分支
- UTF-16 : Unicode的編碼分支
- GBK/GB2312/GB18030 : 中國自研標(biāo)準(zhǔn)烛恤,多字節(jié),字符集 + 編碼