對(duì)稱加密算法和分組密碼的模式

  • 對(duì)稱加密算法,即加密和解密使用一樣的密鑰的加解密算法播掷。
  • 分組密碼(block cipher)些阅,是每次只能處理特定長(zhǎng)度的一塊(block)數(shù)據(jù)的一類加解密算法檩咱。
  • 目前常見(jiàn)的對(duì)稱加密算法DES拒啰、3DES驯绎、AES都是屬于分組密碼。

DES

  • DES谋旦,全稱Data Encryption Standard条篷,是上一代標(biāo)準(zhǔn)對(duì)稱加密算法骗随,現(xiàn)已不推薦使用
  • 密鑰:DES是一種將64bit的明文加密成64bit的密文的對(duì)稱密碼算法赴叹,它的密鑰長(zhǎng)度是64bit(每隔7bit會(huì)設(shè)置一個(gè)用于錯(cuò)誤檢查的bit,因此實(shí)際使用密鑰長(zhǎng)度56bit)指蚜。
  • 分組:DES是以64bit的明文作為一個(gè)單位來(lái)進(jìn)行加密的乞巧,這64bit的單位稱為分組。一般來(lái)說(shuō)摊鸡,以分組為單位進(jìn)行處理的密碼算法稱為分組密碼(block cipher)绽媒,DES就是分組密碼中的一種。DES每次只能加密64比特的數(shù)據(jù)免猾,如果要加密的明文比較長(zhǎng)是辕,就需要對(duì)DES加密進(jìn)行迭代。
DES加密
DES解密

3DES

  • 3DES猎提,即triple-DES获三,簡(jiǎn)單地說(shuō)就是3次DES加解密的組合。現(xiàn)已不推薦使用锨苏。
  • 加密:cipthertext = E(k3, D(k2, E(k1, plaintext)))
  • 解密:plaintext = D(k1, E(k2, D(k3, ciphertext)))
  • 特點(diǎn):如果三個(gè)密鑰都一樣疙教,拿剛好和DES一樣。

注:E表示Encrypt伞租,D表示Decrypt贞谓。

3DES加密
3DES解密

AES

  • AES, Advanced Encryption Standard,是現(xiàn)行的對(duì)稱加密標(biāo)準(zhǔn)葵诈。目前(2017)如果使用對(duì)稱加密裸弦,應(yīng)該使用AES。當(dāng)然作喘,只能說(shuō)當(dāng)前AES算法是安全的理疙,不能保證AES永遠(yuǎn)都是安全的。
  • 分組:128bit徊都。
  • 密鑰:128bit沪斟、192bit、256bit暇矫。

分組密碼的模式

分組密碼簡(jiǎn)介

  • 分組密碼(block cipher)主之,是每次只能處理特定長(zhǎng)度的一塊數(shù)據(jù)的一類密碼算法,這里的“一塊”就稱為分組(block)李根。一個(gè)分組的比特?cái)?shù)就稱為分組長(zhǎng)度(block length)槽奕。
  • 流密碼(stream cipher),是對(duì)數(shù)據(jù)流進(jìn)行連續(xù)處理的一類密碼算法房轿。
  • DES粤攒、3DES所森、AES等大多數(shù)對(duì)稱密碼算法都屬于分組密碼。

ECB模式

  • 全稱Electronic CodeBook mode夯接,電子密碼本模式焕济。
  • 分組方式:將明文分組加密之后的結(jié)果直接稱為密文分組。
  • 優(yōu)點(diǎn):
    • 一個(gè)分組損壞不影響其它分組盔几。
    • 可以并行加解密晴弃。
  • 缺點(diǎn):
    • 相同的明文分組會(huì)轉(zhuǎn)換為相同的密文分組。
    • 無(wú)需破譯密碼就能操縱明文(每個(gè)分組獨(dú)立且前后文無(wú)關(guān)逊拍,直接增加或刪除一個(gè)分組不影響其它分組解密過(guò)程的正確性)上鞠。
ECB加密
ECB解密

CBC模式

  • 全稱Cipher Block Chaining mode,密碼分組鏈接模式芯丧。
  • 分組方式:將明文分組與前一個(gè)密文分組進(jìn)行XOR運(yùn)算芍阎,然后再進(jìn)行加密。每個(gè)分組的加解密都依賴于前一個(gè)分組缨恒。而第一個(gè)分組沒(méi)有前一個(gè)分組谴咸,因此需要一個(gè)初始化向量(initialization vector)。
  • 優(yōu)點(diǎn):
    • 加密結(jié)果與前文相關(guān)肿轨,有利于提高加密結(jié)果的隨機(jī)性寿冕。
    • 可并行解密。
  • 缺點(diǎn)
    • 無(wú)法并行加密椒袍。
    • 一個(gè)分組損壞驼唱,如果密文長(zhǎng)度不變,則兩個(gè)分組受影響驹暑。
    • 一個(gè)分組損壞玫恳,如果密文長(zhǎng)度改變,則后面所有分組受影響优俘。
CBC加密
CBC解密

CFB模式

  • 全稱Cipher FeedBack mode京办,密文反饋模式。
  • 分組方式:前一個(gè)密文分組會(huì)被送回到密碼算法的輸入端(具體見(jiàn)下圖)帆焕。
  • 在CBC和EBC模式中惭婿,明文分組都是通過(guò)密碼算法進(jìn)行加密的。而在CFB模式中叶雹,明文分組并沒(méi)有通過(guò)加密算法直接進(jìn)行加密财饥,明文分組和密文分組之間只有一個(gè)XOR。
  • CFB模式是通過(guò)將“明文分組”與“密碼算法的輸出”進(jìn)行XOR運(yùn)行生成“密文分組”折晦。CFB模式中由密碼算法生成的比特序列稱為密鑰流(key stream)钥星。密碼算法相當(dāng)于密鑰流的偽隨機(jī)數(shù)生成器,而初始化向量相當(dāng)于偽隨機(jī)數(shù)生成器的種子满着。(CFB模式有點(diǎn)類似一次性密碼本谦炒。)
  • 優(yōu)點(diǎn):
    • 支持并行解密贯莺。
    • 不需要填充(padding)。
  • 缺點(diǎn):
    • 不能抵御重放攻擊(replay attack)宁改。
    • 不支持并行加密缕探。
CFB加密
CFB解密

OFB模式

  • Output FeedBack mode 輸出反饋模式
  • 密碼算法的輸出會(huì)反饋到密碼算法的輸入中(具體見(jiàn)下圖)。
  • OFB模式中还蹲,XOR所需的比特序列(密鑰流)可以事先通過(guò)密碼算法生成撕蔼,和明文分組無(wú)關(guān)。只需要提前準(zhǔn)備好所需的密鑰流秽誊,然后進(jìn)行XOR運(yùn)算就可以了。
OFB加密
OFB解密

分組模式小結(jié)

推薦使用CBC模式琳骡。

填充

  • 為什么要填充锅论?
    ECB和CBC模式要求明文數(shù)據(jù)必須填充至長(zhǎng)度為分組長(zhǎng)度的整數(shù)倍。

  • 填充的兩個(gè)問(wèn)題楣号。

    • 填充多少字節(jié)最易?
    • 填充什么內(nèi)容?
  • 填充多少字節(jié)炫狱?
    需要填充的字節(jié)數(shù)為:paddingSize = blockSize - textLength % blockSize

  • 填充什么內(nèi)容藻懒?(這里列舉的三種方式本質(zhì)上是一致的)

    • ANSI X.923:填充序列的最后一個(gè)字節(jié)填paddingSize,其它填0视译。
    • ISO 10126:填充序列的最后一個(gè)字節(jié)填paddingSize嬉荆, 其它填隨機(jī)數(shù)。
    • PKCS7:填充序列的每個(gè)字節(jié)都填paddingSize酷含。

示例

這里用golang寫一個(gè)AES加密的例子鄙早。

由于加密出來(lái)的數(shù)據(jù)很可能有很多不可見(jiàn)字符,因此這里會(huì)將加密后的結(jié)果進(jìn)行一次Base64Encode椅亚。

這里采用CBC模式+PKCS7填充方式限番。

package main

import (
    "bytes"
    "crypto/cipher"
    "crypto/aes"
    "encoding/base64"
    "fmt"
)

func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext) % blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

func PKCS7UnPadding(origData []byte) []byte {
    length := len(origData)
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}

func AesEncrypt(origData, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    blockSize := block.BlockSize()
    origData = PKCS7Padding(origData, blockSize)
    blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
    crypted := make([]byte, len(origData))
    blockMode.CryptBlocks(crypted, origData)
    return crypted, nil
}

func AesDecrypt(crypted, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    blockSize := block.BlockSize()
    blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
    origData := make([]byte, len(crypted))
    blockMode.CryptBlocks(origData, crypted)
    origData = PKCS7UnPadding(origData)
    return origData, nil
}

func main() {
    key := []byte("0123456789abcdef")
    result, err := AesEncrypt([]byte("hello world"), key)
    if err != nil {
        panic(err)
    }
    fmt.Println(base64.StdEncoding.EncodeToString(result))
    origData, err := AesDecrypt(result, key)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(origData))
}

參考文檔

  • 《圖解密碼學(xué)》
  • 維基百科
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市呀舔,隨后出現(xiàn)的幾起案子弥虐,更是在濱河造成了極大的恐慌,老刑警劉巖媚赖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霜瘪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡省古,警方通過(guò)查閱死者的電腦和手機(jī)粥庄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)豺妓,“玉大人惜互,你說(shuō)我怎么就攤上這事布讹。” “怎么了训堆?”我有些...
    開(kāi)封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵描验,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我坑鱼,道長(zhǎng)膘流,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任鲁沥,我火速辦了婚禮呼股,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘画恰。我一直安慰自己彭谁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布允扇。 她就那樣靜靜地躺著缠局,像睡著了一般。 火紅的嫁衣襯著肌膚如雪考润。 梳的紋絲不亂的頭發(fā)上狭园,一...
    開(kāi)封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音糊治,去河邊找鬼唱矛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛俊戳,可吹牛的內(nèi)容都是我干的揖赴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼抑胎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼燥滑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起阿逃,我...
    開(kāi)封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铭拧,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后恃锉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體搀菩,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年破托,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肪跋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡土砂,死狀恐怖州既,靈堂內(nèi)的尸體忽然破棺而出谜洽,到底是詐尸還是另有隱情,我是刑警寧澤吴叶,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布阐虚,位于F島的核電站,受9級(jí)特大地震影響蚌卤,放射性物質(zhì)發(fā)生泄漏实束。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一咸灿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侮叮,春花似錦、人聲如沸签赃。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)箩绍。三九已至,卻和暖如春材蛛,著一層夾襖步出監(jiān)牢的瞬間圆到,已是汗流浹背卑吭。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豆赏,地道東北人挣菲。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像掷邦,于是被迫代替她去往敵國(guó)和親白胀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開(kāi)發(fā)過(guò)程中抚岗,在網(wǎng)絡(luò)通信或杠、數(shù)據(jù)存儲(chǔ)、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹(shù)閱讀 2,436評(píng)論 0 6
  • 本文主要介紹移動(dòng)端的加解密算法的分類宣蔚、其優(yōu)缺點(diǎn)特性及應(yīng)用向抢,幫助讀者由淺入深地了解和選擇加解密算法认境。文中會(huì)包含算法的...
    蘋果粉閱讀 11,509評(píng)論 5 29
  • 概述 什么是模式 第三章介紹的對(duì)稱密碼算法DES、AES都屬于分組密碼笋额,分組密碼的特點(diǎn)是分組的長(zhǎng)度是固定的元暴。但是由...
    JMasche閱讀 3,088評(píng)論 0 4
  • 前言 本文章是對(duì)《圖解密碼技術(shù)》一書第一部分的一個(gè)總結(jié)。 密碼分類 密碼算法需要密鑰兄猩,根據(jù)密鑰的使用方法茉盏,可以將密...
    發(fā)仔很忙閱讀 1,422評(píng)論 1 2
  • 昨天和男朋友談心,我說(shuō)感覺(jué)自己進(jìn)入了職業(yè)倦怠期枢冤,時(shí)常好像一眼就能看到自己職業(yè)生涯的盡頭鸠姨,幾次有想拔腿走人的沖動(dòng)⊙驼妫可...
    NJ晨曦閱讀 395評(píng)論 0 0