Golang實現ECB模式3DES演算法

2021-09-18 07:18:35 字數 2607 閱讀 9207

因專案需要使用ecb模式下的3des演算法加解密資訊,golang預設只提供cbc模式,只能自己實現ecb模式。

參考文章對ecb模式的des有解釋,並實現了部分des演算法樣例。這裡把演算法補全,提供3des演算法實現。

3des

3des演算法就是採用乙個長度為24位元組的金鑰,將金鑰分成各8位元組的3份子金鑰:k1、k2、k3。使用這3個金鑰對明文進行加密、解密處理,如下:

e(k,d)、d(k,d)分別表示使用金鑰k對資料d進行加密或解密,返回加密或解密後的資料。

3des加密過程:

e(k3,d(k2,e(k1,d)))

意思為:將明文d先用k1加密,得到密文d1;對d1再用k2做解密處理,得到密文d2;再對d2用k3做加密處理,得到最終密文。

3des解密過程與加密相反:

d(k1,e(k2,d(k3,d)))

意思為:將密文d先用k3解密,得到密文d1;對d1再用k2做加密處理,得到密文d2;再對d2用k1做解密處理,得到最終明文。

填充

填充方式採用pkcs5padding,**照搬如下:

func pkcs5padding(ciphertext byte, blocksize int) byte , padding)

}func pkcs5unpadding(origdata byte) byte

填充過程就是要把明文長度湊成8的整數倍,少幾個就填充幾個對應的數字。如少4個位元組才滿8的倍數,那就填充4個0x04;如果明文剛好是8的倍數,就要再填充8個0x08。

解密後,要把填充的資料刪除,就取最後乙個位元組的值,按值刪掉最後幾個位元組。(設計的很巧妙)

完整的**:

package tripledesecb

import (

"bytes"

"crypto/des"

"errors"

"fmt"

"golang.org/x/crypto/pbkdf2"

)//ecb pkcs5padding

func pkcs5padding(ciphertext byte, blocksize int) byte , padding)

}//ecb pkcs5unpadding

func pkcs5unpadding(origdata byte) byte

//des加密

func encrypt(origdata, key byte) (byte, error)

block, err := des.newcipher(key)

if err != nil

bs := block.blocksize()

if len(origdata)%bs != 0

out := make(byte, len(origdata))

dst := out

for len(origdata) > 0

return out, nil

}//des解密

func decrypt(crypted, key byte) (byte, error)

block, err := des.newcipher(key)

if err != nil

out := make(byte, len(crypted))

dst := out

bs := block.blocksize()

if len(crypted)%bs != 0

for len(crypted) > 0

return out, nil

}//[golang ecb 3des encrypt]

func tripleecbdesencrypt(origdata, key byte) (byte, error)

bs := block.blocksize()

origdata = pkcs5padding(origdata, bs)

buf1, err := encrypt(origdata, k1)

if err != nil

buf2, err := decrypt(buf1, k2)

if err != nil

out, err := encrypt(buf2, k3)

if err != nil

return out, nil

}//[golang ecb 3des decrypt]

func tripleecbdesdecrypt(crypted, key byte) (byte, error)

buf2, err := encrypt(buf1, k2)

if err != nil

out, err := decrypt(buf2, k1)

if err != nil

out = pkcs5unpadding(out)

return out, nil

}

上面的**,稍微改一下就可以開放出ecb模式的des演算法,我用不上,就沒放出來。

剛開始用golang,也是第一次在segmentfault上發文,輕拍!

iOS實現3D旋轉

最近看到了乙個3d旋轉的動畫,就想著自己去實現以下。那麼,接下來就通過這邊文章記錄以下學習過程,慢慢深入了解以下3d旋轉。一 如何旋轉 每個view都在系統的座標系中,就手機螢幕來說,左上角為 0 0 向右橫向的為x軸正方向,向下縱向的為y軸正方向,垂直於手機螢幕的方向既z軸方向。所以z軸的旋轉屬於...

css js實現3D盒子

話不多說,直接上 lang en charset utf 8 rel shortcut icon href fk.png css3d盒子title html box keyframes xuanzhuan 100 box div front back left right top bottom st...

UITableViewCell實現3D縮放動畫

gif效果圖 部分 import uikit class tableviewcontroller uitableviewcontroller mark table view data source override func tableview tableview uitableview,numbe...