Go语言的DES加密(CBC模式, ECB模式) ---- 与java加密互通(转)
生活随笔
收集整理的這篇文章主要介紹了
Go语言的DES加密(CBC模式, ECB模式) ---- 与java加密互通(转)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
問題場(chǎng)景:
業(yè)務(wù)需要對(duì)接接口, 采用DES加密方式加密, 于是google一下go的DES加密方式,
go的DES的默認(rèn)隱藏了ECB模式, 因?yàn)間o認(rèn)為ECB不安全, 所以不建議使用,就隱藏了,
然而接口卻需要采用ECB模式(吐槽寫文檔的人, 并沒有寫明使用了ECB模式,
這讓我耗費(fèi)了大量的時(shí)間來猜測(cè)他的加密模式)
ECB
- 概念
ECB(電子密本方式)就是將數(shù)據(jù)按照8個(gè)字節(jié)一段進(jìn)行DES加密或解密得到一段8個(gè)字節(jié)的密文或者明文,最后一段不足8個(gè)字節(jié),按照需求補(bǔ)足8個(gè)字節(jié)進(jìn)行計(jì)算,之后按照順序?qū)⒂?jì)算所得的數(shù)據(jù)連在一起即可,各段數(shù)據(jù)之間互不影響。 - 特點(diǎn)
CBC
- 概念
CBC(密文分組鏈接方式)有向量的概念, 它的實(shí)現(xiàn)機(jī)制使加密的各段數(shù)據(jù)之間有了聯(lián)系。 - 加密步驟:
- 解密是加密的逆過程:
- 特點(diǎn)
每個(gè)密文塊依賴于所有的信息明文消息中一個(gè)改變會(huì)影響所有密文塊
代
碼 //ECB加密 func EncryptDES_ECB(src, key string) string {data := []byte(src)keyByte := []byte(key)block, err := des.NewCipher(keyByte)if err != nil {panic(err) }bs := block.BlockSize()//對(duì)明文數(shù)據(jù)進(jìn)行補(bǔ)碼data = PKCS5Padding(data, bs)if len(data)%bs != 0 {panic("Need a multiple of the blocksize")}out := make([]byte, len(data))dst := outfor len(data) > 0 {//對(duì)明文按照blocksize進(jìn)行分塊加密//必要時(shí)可以使用go關(guān)鍵字進(jìn)行并行加密block.Encrypt(dst, data[:bs])data = data[bs:]dst = dst[bs:]}return fmt.Sprintf("%X", out) }//ECB解密 func DecryptDES_ECB(src, key string) string {data, err := hex.DecodeString(src)if err != nil {panic(err)}keyByte := []byte(key)block, err := des.NewCipher(keyByte)if err != nil {panic(err)}bs := block.BlockSize()if len(data)%bs != 0 {panic("crypto/cipher: input not full blocks")}out := make([]byte, len(data))dst := outfor len(data) > 0 {block.Decrypt(dst, data[:bs])data = data[bs:]dst = dst[bs:]}out = PKCS5UnPadding(out)return string(out) }//CBC加密 func EncryptDES_CBC(src, key string) string {data := []byte(src)keyByte := []byte(key)block, err := des.NewCipher(keyByte )if err != nil {panic(err)}data = PKCS5Padding(data , block.BlockSize())//獲取CBC加密模式iv := keyByte //用密鑰作為向量(不建議這樣使用)mode := cipher.NewCBCEncrypter(block, iv)out := make([]byte, len(data))mode .CryptBlocks(out, data)return fmt.Sprintf("%X", out) }//CBC解密 func DecryptDES_CBC(src, key string) string {keyByte := []byte(key)data, err := hex.DecodeString(src)if err != nil {panic(err)}block, err := des.NewCipher(keyByte)if err != nil {panic(err)}iv := keyByte //用密鑰作為向量(不建議這樣使用)mode := cipher.NewCBCDecrypter(block, iv)plaintext := make([]byte, len(data))mode.CryptBlocks(plaintext, data)plaintext = PKCS5UnPadding(plaintext)return string(plaintext) }//明文補(bǔ)碼算法 func PKCS5Padding(ciphertext []byte, blockSize int) []byte {padding := blockSize - len(ciphertext)%blockSizepadtext := bytes.Repeat([]byte{byte(padding)}, padding)return append(ciphertext, padtext...) } //明文減碼算法 func PKCS5UnPadding(origData []byte) []byte {length := len(origData)unpadding := int(origData[length-1])return origData[:(length - unpadding)] }轉(zhuǎn)自https://my.oschina.net/imhuayi/blog/1541840
轉(zhuǎn)載于:https://www.cnblogs.com/leescre/p/10500808.html
總結(jié)
以上是生活随笔為你收集整理的Go语言的DES加密(CBC模式, ECB模式) ---- 与java加密互通(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 简易计算器(只能计算加减乘
- 下一篇: redis(nosql数据库)