對(duì)稱加密一:DES&go實(shí)現(xiàn)

密碼技術(shù)###

1. 介紹

1.1 加密/解密三要素: 明文/ 密文, 秘鑰, 密碼算法
  • 明文/密文:
    加密之前的消息稱為明文(plaintext)用押,加密之后的消息稱為密文(cipher-text)。
  • 秘鑰 :

密碼算法中需要密鑰(key)。現(xiàn)實(shí)世界中的“鑰'',是像 :key: 這樣的形狀微妙而復(fù)雜的小金屬片旭寿。然而警绩,密碼算法中的密鑰,則是像203554728568477650354673080689430768這樣的一串非常大的數(shù)字盅称。

  • 密碼算法 :

用于解決復(fù)雜問題的步驟肩祥,通常稱為算法(algorithm)后室。從明文生成密文的步驟,也就是加密的步驟混狠,稱為“加密算法"岸霹,而解密的步驟則稱為“解密算法"。加密将饺、解密的算法合在一起統(tǒng)稱為密碼算法贡避。

1.2密碼信息威脅

我們將信息安全所面臨的威脅與用來用對(duì)這些威脅的密碼技術(shù)直接的關(guān)系用一張圖標(biāo)來表示出來。


2. 對(duì)稱加密

對(duì)稱加密: 也稱為對(duì)稱密碼, 是指在加密和解碼時(shí)使用同一秘鑰的加密方式

2.1 DES:

DES(Data Encryption Standard)是1977年美國(guó)聯(lián)邦信息處理標(biāo)準(zhǔn)(FIPS)中所采用的一種對(duì)稱密碼(FIPS46.3)予弧。DES一直以來被美國(guó)以及其他國(guó)家的政府和銀行等廣泛使用刮吧。然而,隨著計(jì)算機(jī)的進(jìn)步掖蛤,現(xiàn)在DES已經(jīng)能夠被暴力破解杀捻,強(qiáng)度大不如前了(不建議使用)

  • DES加密解密

DES是一種將64比特的明文加密成64比特的密文的對(duì)稱密碼算法,==它的密鑰長(zhǎng)度是56比特==蚓庭。盡管從規(guī)格上來說致讥,DES的密鑰長(zhǎng)度是64比特,但由于每隔7比特會(huì)設(shè)置一個(gè)用于錯(cuò)誤檢查的比特器赞,因此實(shí)質(zhì)上其密鑰長(zhǎng)度是56比特垢袱。

DES是以64比特的明文(比特序列)為一個(gè)單位來進(jìn)行加密的,這個(gè)64比特的單位稱為分組拳魁。一般來說惶桐,以分組為單位進(jìn)行處理的密碼算法稱為分組密碼(blockcipher),DES就是分組密碼的一種潘懊。

DES每次只能加密64比特的數(shù)據(jù)姚糊,如果要加密的明文比較長(zhǎng),就需要對(duì)DES加密進(jìn)行迭代(反復(fù))授舟,而迭代的具體方式就稱為模式(mode)救恨。

秘鑰長(zhǎng)度(56bit + 8bit)/8 = 8byte


DES圖例
  • 三重DES加密

現(xiàn)在DES已經(jīng)可以在現(xiàn)實(shí)的時(shí)間內(nèi)被暴力破解,三重DES(triple-DES)是為了增加DES的強(qiáng)度释树,==將DES重復(fù)3次所得到的一種密碼算法==肠槽,通常縮寫為3DES

3DES

明文經(jīng)過三次DES處理才能變成最后的密文奢啥,由于DES密鑰的長(zhǎng)度實(shí)質(zhì)上是56比特秸仙,因此三重DES的密鑰長(zhǎng)度就是56×3=168比特, 加上用于錯(cuò)誤檢測(cè)的標(biāo)志位8x3, 共192bit。

從上圖我們可以發(fā)現(xiàn)桩盲,三重DES并不是進(jìn)行三次DES加密(加密-->加密-->加密)寂纪,而是加密-->解密-->加密的過程。在加密算法中加人解密操作讓人感覺很不可思議,實(shí)際上這個(gè)方法是IBM公司設(shè)計(jì)出來的捞蛋,目的是為了讓三重DES能夠兼容普通的DES孝冒。

當(dāng)三重DES中所有的密鑰都相同時(shí),三重DES也就等同于普通的DES了拟杉。這是因?yàn)樵谇皟刹郊用?->解密之后庄涡,得到的就是最初的明文。因此搬设,以前用DES加密的密文穴店,就可以通過這種方式用三重DES來進(jìn)行解密。也就是說焕梅,三重DES對(duì)DES具備向下兼容性迹鹅。

如果密鑰1和密鑰3使用相同的密鑰,而密鑰2使用不同的密鑰(也就是只使用兩個(gè)DES密鑰)贞言,這種三重DES就稱為DES-EDE2斜棚。EDE表示的是加密(Encryption) -->解密(Decryption)-->加密(Encryption)這個(gè)流程。

密鑰1该窗、密鑰2弟蚀、密鑰3全部使用不同的比特序列的三重DES稱為DES-EDE3。

盡管三重DES目前還被銀行等機(jī)構(gòu)使用酗失,但其處理速度不高义钉,而且在安全性方面也逐漸顯現(xiàn)出了一些問題

2. Go實(shí)現(xiàn)對(duì)稱加密

2.1 DES 實(shí)現(xiàn):
  • CBC 分組模式:

加密:

  1. 創(chuàng)建并返回一個(gè)使用DES算法的cipher.Block接口 秘鑰長(zhǎng)度為64bit, 即 64/8 = 8字節(jié)(byte)
  2. 對(duì)最后一個(gè)明文分組進(jìn)行數(shù)據(jù)填充
    DES是以64比特的明文(比特序列)為一個(gè)單位來進(jìn)行加密的
    最后一組不夠64bit, 則需要進(jìn)行數(shù)據(jù)填充( 參考第三章)
  3. 創(chuàng)建一個(gè)密碼分組為鏈接模式的, 底層使用DES加密的BlockMode接口
  4. 加密連續(xù)的數(shù)據(jù)塊

解密

  1. 創(chuàng)建并返回一個(gè)使用DES算法的cipher.Block接口
  2. 創(chuàng)建一個(gè)密碼分組為鏈接模式的, 底層使用DES解密的BlockMode接口
  3. 數(shù)據(jù)塊解密
  4. 去掉最后一組的填充數(shù)據(jù)

代碼實(shí)現(xiàn)
1.明文/密文分組填充與移除

// 分組填充--填充對(duì)應(yīng)長(zhǎng)度的相同數(shù)字(1, 22规肴, 333....)
//data: 待分組數(shù)據(jù), blockSize: 每組的長(zhǎng)度
func PKCS7Padding(date []byte, blockSize int)(PaddingResult[]byte){
    // 獲取數(shù)據(jù)長(zhǎng)度
    length:=len(date)
    // 獲取待填充數(shù)據(jù)長(zhǎng)度
    count:=length%blockSize
    PaddingCount:=blockSize-count
    // 在數(shù)據(jù)后填充數(shù)據(jù)
    PaddingDate:=bytes.Repeat([]byte{byte(PaddingCount)},PaddingCount)
    PaddingResult=append(date,PaddingDate...)
    return
}

//  分組移除
 func PKCS7Unpadding(date []byte, blockSize int)(UnpaddingResult[]byte){
    length:=len(date)
    temp:=int(date[length-1])
    UnpaddingResult=date[:length-temp]
    return
 }
  1. DES加密與解密:
//src:           --明文/密文捶闸,需要分組填充,每組8byte
//key:           --秘鑰   8byte
//iv:            --初始化向量  8byte  長(zhǎng)度必須與key相同
--------------------------------------------------------------
//加密
func Des_CBC_Encrypt(src []byte, key []byte, iv []byte) []byte {
    // 創(chuàng)建并返回一個(gè)使用DES算法的cipher.Block接口
    block, err := des.NewCipher(key)
    // 判斷是否創(chuàng)建成功
    if err != nil {
        panic(err)
    }
    // 明文組數(shù)據(jù)填充
    paddingText := PKCS7Padding_Unpadding.PKCS7Padding(src, block.BlockSize())
    // 創(chuàng)建一個(gè)密碼分組為鏈接模式的, 底層使用DES加密的BlockMode接口
    blockMode := cipher.NewCBCEncrypter(block, iv)
    // 加密
    dst := make([]byte, len(paddingText))
    blockMode.CryptBlocks(dst, paddingText)
    return dst
}

---------------------------------------------------------

// 解密:
func Des_CBC_Decrypt(src []byte, key []byte, iv []byte) []byte {
    // 創(chuàng)建并返回一個(gè)使用DES算法的cipher.Block接口
    block, err := des.NewCipher(key)
    if err != nil {
        panic(err)
    }
    // 創(chuàng)建一個(gè)密碼分組為鏈接模式的, 底層使用DES解密的BlockMode接口
    blockMode := cipher.NewCBCDecrypter(block, iv)
    // 解密
    dst := make([]byte, len(src))
    blockMode.CryptBlocks(dst, src)
    // 分組移除
    dst = PKCS7Padding_Unpadding.PKCS7Unpadding(dst, block.BlockSize())
    return dst
}
  • CTR 分組模式:

加密:

  1. 創(chuàng)建并返回一個(gè)使用DES算法的cipher.Block接口 秘鑰長(zhǎng)度為64bit, 即 64/8 = 8字節(jié)(byte)
  2. 創(chuàng)建一個(gè)CTR密碼分組為鏈接模式的, 底層使用DES加密的BlockMode接口
  3. 加密連續(xù)的數(shù)據(jù)塊

解密

與加密算法完全一致

代碼實(shí)現(xiàn)

/*
DES CTR 加密解密函數(shù)
參數(shù):
    src:           --明文/密文 分組不需要填充
    key:           --秘鑰   8byte
    iv:            --初始化向量  8byte  長(zhǎng)度必須與key相同
 */
//加密
func Des_CTR_Encrypt(src []byte, key []byte, iv []byte) []byte {
    // 創(chuàng)建并返回一個(gè)使用DES算法的cipher.Block接口
    block, err := des.NewCipher(key)
    // 判斷是否創(chuàng)建成功
    if err != nil {
        panic(err)
    }

    // 創(chuàng)建一個(gè)密碼分組為鏈接模式的, 底層使用DES加密的stream接口
    stream := cipher.NewCTR(block,iv)
    // 加密
    dst := make([]byte, len(src))
    stream.XORKeyStream(dst,src)
    return dst
}
// 解密 直接調(diào)用加密函數(shù)
func Des_CTR_Decrypt(src []byte, key []byte, iv []byte) []byte {
    return Des_CTR_Encrypt(src,key,iv)
}
2.2 3DES 實(shí)現(xiàn):

與DES 基本一致拖刃, 唯一不同點(diǎn):
key 長(zhǎng)度:3*8=24byte

代碼實(shí)現(xiàn)

/*
3DES CBC 加密解密函數(shù)
Des3_CBC_Encrypt()  --加密
Des3_CBC_Decrypt()  --解密
參數(shù):
    src:           --明文/密文删壮,需要分組填充,每組8byte
    key:           --秘鑰   3*8=24byte
    iv:            --初始化向量  8byte
 */

func Des3_CBC_Encrypt(src []byte, key []byte, iv []byte) []byte {
    // 創(chuàng)建并返回一個(gè)使用3DES算法的cipher.Block接口
    block, err := des.NewTripleDESCipher(key)
    // 判斷是否創(chuàng)建成功
    if err != nil {
        panic(err)
    }
    // 明文組數(shù)據(jù)填充
    paddingText := PKCS7Padding_Unpadding.PKCS7Padding(src, block.BlockSize())
    // 創(chuàng)建一個(gè)密碼分組為鏈接模式的, 底層使用DES加密的BlockMode接口
    blockMode := cipher.NewCBCEncrypter(block, iv)
    // 加密
    dst := make([]byte, len(paddingText))
    blockMode.CryptBlocks(dst, paddingText)
    return dst
}

func Des3_CBC_Decrypt(src []byte, key []byte, iv []byte) []byte {
    // 創(chuàng)建并返回一個(gè)使用3DES算法的cipher.Block接口
    block, err := des.NewTripleDESCipher(key)
    if err != nil {
        panic(err)
    }
    // 創(chuàng)建一個(gè)密碼分組為鏈接模式的, 底層使用3DES解密的BlockMode接口
    blockMode := cipher.NewCBCDecrypter(block, iv)
    // 解密
    dst := make([]byte, len(src))
    blockMode.CryptBlocks(dst, src)
    // 分組移除
    dst = PKCS7Padding_Unpadding.PKCS7Unpadding(dst, block.BlockSize())
    return dst
}
--------------------------------------------------------------
/*
3DES CTR 加密解密函數(shù)
Des3_CTR_Encrypt()  --加密
Des3_CTR_Decrypt()  --解密
參數(shù):
    src:           --明文/密文 分組不需要填充
    key:           --秘鑰   3*8=24byte
    iv:            --初始化向量  8byte
 */

func Des3_CTR_Encrypt(src []byte, key []byte, iv []byte) []byte {
    // 創(chuàng)建并返回一個(gè)使用3DES算法的cipher.Block接口
    block, err := des.NewTripleDESCipher(key)
    // 判斷是否創(chuàng)建成功
    if err != nil {
        panic(err)
    }

    // 創(chuàng)建一個(gè)密碼分組為鏈接模式的, 底層使用DES加密的stream接口
    stream := cipher.NewCTR(block,iv)
    // 加密
    dst := make([]byte, len(src))
    stream.XORKeyStream(dst,src)
    return dst
}

func Des3_CTR_Decrypt(src []byte, key []byte, iv []byte) []byte {
    return Des3_CTR_Encrypt(src,key,iv)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兑牡,一起剝皮案震驚了整個(gè)濱河市央碟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌均函,老刑警劉巖亿虽,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異苞也,居然都是意外死亡洛勉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門如迟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來收毫,“玉大人,你說我怎么就攤上這事∨2福” “怎么了君仆?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瓶籽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我宗弯,道長(zhǎng)痒玩,這世上最難降的妖魔是什么淳附? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蠢古,結(jié)果婚禮上奴曙,老公的妹妹穿的比我還像新娘。我一直安慰自己草讶,他們只是感情好洽糟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堕战,像睡著了一般坤溃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘱丢,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天薪介,我揣著相機(jī)與錄音,去河邊找鬼越驻。 笑死汁政,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缀旁。 我是一名探鬼主播记劈,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼诵棵!你這毒婦竟也來了抠蚣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤履澳,失蹤者是張志新(化名)和其女友劉穎嘶窄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體距贷,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柄冲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忠蝗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片现横。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戒祠,到底是詐尸還是另有隱情骇两,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布姜盈,位于F島的核電站低千,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏馏颂。R本人自食惡果不足惜示血,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望救拉。 院中可真熱鬧难审,春花似錦、人聲如沸亿絮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壹无。三九已至葱绒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斗锭,已是汗流浹背地淀。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岖是,地道東北人帮毁。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像豺撑,于是被迫代替她去往敵國(guó)和親烈疚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 1. 什么是DES DES(Data Encryption Standard)是1977年美國(guó)聯(lián)邦信息處理標(biāo)準(zhǔn)(F...
    泡泡龍吐泡泡閱讀 1,107評(píng)論 0 1
  • 本文主要介紹移動(dòng)端的加解密算法的分類聪轿、其優(yōu)缺點(diǎn)特性及應(yīng)用爷肝,幫助讀者由淺入深地了解和選擇加解密算法。文中會(huì)包含算法的...
    蘋果粉閱讀 11,505評(píng)論 5 29
  • 加密的原因:保證數(shù)據(jù)安全 加密必備要素:1陆错、明文/密文 2灯抛、秘鑰 3、算法 秘鑰:在密碼學(xué)中是一個(gè)定長(zhǎng)的字符串...
    Winnifred_閱讀 13,070評(píng)論 0 3
  • 在介紹加密算法之前, 先介紹一下 base64: 0. base64 Base64要求把每三個(gè)8Bit的字節(jié)轉(zhuǎn)換為...
    reboot_q閱讀 12,907評(píng)論 3 8
  • 前期推廣運(yùn)營(yíng)音瓷,公司定位 單店還是加盟推廣 一对嚼,客戶定位 二,客戶資源數(shù)據(jù)來源绳慎, 1小海豚介紹纵竖。2網(wǎng)絡(luò)漠烧。3醫(yī)院。4學(xué)...
    ganweif閱讀 84評(píng)論 0 0