當前位置:編程學習大全網 - 源碼下載 - 什麽是3DES對稱加密算法?

什麽是3DES對稱加密算法?

DES加密經過下面的步驟

1、提供明文和密鑰,將明文按照64bit分塊(對應8個字節),不足8個字節的可以進行填充(填充方式多種),密鑰必須為8個字節***64bit

填充方式:

當明文長度不為分組長度的整數倍時,需要在最後壹個分組中填充壹些數據使其湊滿壹個分組長度。

* NoPadding

API或算法本身不對數據進行處理,加密數據由加密雙方約定填補算法。例如若對字符串數據進行加解密,可以補充\0或者空格,然後trim

* PKCS5Padding

加密前:數據字節長度對8取余,余數為m,若m>0,則補足8-m個字節,字節數值為8-m,即差幾個字節就補幾個字節,字節數值即為補充的字節數,若為0則補充8個字節的8

解密後:取最後壹個字節,值為m,則從數據尾部刪除m個字節,剩余數據即為加密前的原文。

例如:加密字符串為為AAA,則補位為AAA55555;加密字符串為BBBBBB,則補位為BBBBBB22;加密字符串為CCCCCCCC,則補位為CCCCCCCC88888888。

* PKCS7Padding

PKCS7Padding 的填充方式和PKCS5Padding 填充方式壹樣。只是加密塊的字節數不同。PKCS5Padding明確定義了加密塊是8字節,PKCS7Padding加密快可以是1-255之間。

2、選擇加密模式

**ECB模式** 全稱Electronic Codebook模式,譯為電子密碼本模式

**CBC模式** 全稱Cipher Block Chaining模式,譯為密文分組鏈接模式

**CFB模式** 全稱Cipher FeedBack模式,譯為密文反饋模式

**OFB模式** 全稱Output Feedback模式,譯為輸出反饋模式。

**CTR模式** 全稱Counter模式,譯為計數器模式。

3、開始加密明文(內部原理--加密步驟,加密算法實現不做講解)

image

1、將分塊的64bit壹組組加密,示列其中壹組:將此組進行初始置換(IP置換),目的是將輸入的64位數據塊按位重新組合,並把輸出分為L0、R0兩部分,每部分各長32位。

2、開始Feistel結構的16次轉換,第壹次轉換為:右側數據R0和子密鑰經過輪函數f生成用於加密左側數據的比特序列,與左側數據L0異或運算,

運算結果輸出為加密後的左側L0,右側數據則直接輸出為右側R0。由於壹次Feistel輪並不會加密右側,因此需要將上壹輪輸出後的左右兩側對調後才正式完成壹次Feistel加密,

3、DES算法***計進行16次Feistel輪,最後壹輪輸出後左右兩側無需對調,每次加密的子密鑰不相同,子密鑰是通過秘鑰計算得到的。

4、末置換是初始置換的逆過程,DES最後壹輪後,左、右兩半部分並未進行交換,而是兩部分合並形成壹個分組做為末置換的輸入

DES解密經過下面的步驟

1、拿到密文和加密的密鑰

2、解密:DES加密和解密的過程壹致,均使用Feistel網絡實現,區別僅在於解密時,密文作為輸入,並逆序使用子密鑰。

3、講解密後的明文去填充 (padding)得到的即為明文

Golang實現DES加密解密

package main

import (

"fmt"

"crypto/des"

"bytes"

"crypto/cipher"

)

func main() {

var miwen,_= DESEncode([]byte("hello world"),[]byte("12345678"))

fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最後5位是補碼

var txt,_ = DESDecode(miwen,[]byte("12345678"))

fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明碼

fmt.Printf("%s",txt) // hello world

}

// 加密函數

func DESEncode(orignData, key []byte)([]byte,error){

// 建立密碼塊

block ,err:=des.NewCipher(key)

if err!=nil{ return nil,err}

// 明文分組,不足的部分加padding

txt := PKCS5Padding(orignData,block.BlockSize())

// 設定加密模式,為了方便,初始向量直接使用key充當了(實際項目中,最好別這麽做)

blockMode := cipher.NewCBCEncrypter(block,key)

// 創建密文長度的切片,用來存放密文字節

crypted :=make([]byte,len(txt))

// 開始加密,將txt作為源,crypted作為目的切片輸入

blockMode.CryptBlocks(crypted,txt)

// 將加密後的切片返回

return crypted,nil

}

// 加密所需padding

func PKCS5Padding(ciphertext []byte,size int)[]byte{

padding := size - len(ciphertext)%size

padTex := bytes.Repeat([]byte{byte(padding)},padding)

return append(ciphertext,padTex...)

}

// 解密函數

func DESDecode(cripter, key []byte) ([]byte,error) {

// 建立密碼塊

block ,err:=des.NewCipher(key)

if err!=nil{ return nil,err}

// 設置解密模式,加密模式和解密模式要壹樣

blockMode := cipher.NewCBCDecrypter(block,key)

// 設置切片長度,用來存放明文字節

originData := make([]byte,len(cripter))

// 使用解密模式解密,將解密後的明文字節放入originData 切片中

blockMode.CryptBlocks(originData,cripter)

// 去除加密的padding部分

strByt := UnPKCS5Padding(origenData)

return strByt,nil

}

// 解密所需要的Unpadding

func UnPKCS5Padding(origin []byte) []byte{

// 獲取最後壹位轉為整型,然後根據這個整型截取掉整型數量的長度

// 若此數為5,則減掉轉換明文後的最後5位,即為我們輸入的明文

var last = int(origin[len(origin)-1])

return origin[:len(origin)-last]

}

註意:在設置加密模式為CBC的時候,我們需要設置壹個初始化向量,這個量的意思 在對稱加密算法中,如果只有壹個密鑰來加密數據的話,明文中的相同文字就會也會被加密成相同的密文,這樣密文和明文就有完全相同的結構,容易破解,如果給壹個初始化向量,第壹個明文使用初始化向量混合並加密,第二個明文用第壹個明文的加密後的密文與第二個明文混合加密,這樣加密出來的密文的結構則完全與明文不同,更加安全可靠。CBC模式圖如下

CBC

3DES

DES 的常見變體是三重 DES,使用 168 位的密鑰對資料進行三次加密的壹種機制;它通常(但非始終)提供極其強大的安全性。如果三個 56 位的子元素都相同,則三重 DES 向後兼容 DES。

對比DES,發現只是換了NewTripleDESCipher。不過,需要註意的是,密鑰長度必須24byte,否則直接返回錯誤。關於這壹點,PHP中卻不是這樣的,只要是8byte以上就行;而Java中,要求必須是24byte以上,內部會取前24byte(相當於就是24byte)。另外,初始化向量長度是8byte(目前各個語言都是如此,不是8byte會有問題)

  • 上一篇:有那些小眾的、有趣的、值得推薦的小程序?
  • 下一篇:短線抄底技巧有哪些
  • copyright 2024編程學習大全網