精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在 Go 項目中封裝 AES 加解密客戶端接口

開發 后端 安全
在這篇文章中, 我主要分享一下在基于Go語言的項目中, 加解密算法中如何封裝一個通用的加解密接口, 并以使用比較廣泛的AES加解密算法實現為基礎進行講解, 最后模擬客戶端分別演示調用AES的加密接口和解密接口。

1.摘要

在一個中型以上的項目中, 我們一般會在項目工程中開辟一個pkg文件夾用來存放一些基礎工具接口,比如:數據庫、中間件、加解密算法、基礎協議等等。在這篇文章中, 我主要分享一下在基于Go語言的項目中, 加解密算法中如何封裝一個通用的加解密接口, 并以使用比較廣泛的AES加解密算法實現為基礎進行講解, 最后模擬客戶端分別演示調用AES的加密接口和解密接口。

2.工程文件結構

在一個正規項目中, 我們要封裝的文件主要添加在算法文件夾下, 目錄結構規劃如下:

pkg
 |
 ---- algorithm
        |
        ---- base.go        // 基礎接口函數定義
        |
        ---- aes.go         // aes加解密算法接口
        |
        ---- aes_test.go    // aes加解密算法接口函數測試

我在名為"algorithm"文件夾下新建了三個文件, 其中base.go為基礎接口函數定義, 因為以后可能要加入進來的算法會比較多,因此需要有一個基礎類文件來定義通用函數接口。

aes.go文件中主要實現AES算法的加解密過程, 并提供一個對外的初始化接口,方便應用層調用。

aes_test.go是作為單元測試的文件, 在里面可以針對AES加密函數和解密函數寫測試用例, 不用編譯整個工程實現單元測試。

如果后面有新的算法加入進來, 例如:des算法, 只需要添加一個des.go和des_test.go文件, 在里面實現函數功能即可。

3.基礎接口實現

基礎接口實現主要在base.go文件中, 因為對于所有加密算法來講, 都有兩個最基礎通用的方法:加密函數和解密函數,因此這里定義了兩個通用的方法接口:

type IAlgorithm interface {
  Encrypt() // 加密函數接口
  Decrypt() // 解密函數接口
}

因為現在不知道項目默認需要使用什么算法,因此實現這兩個方法的空接口:

type DefaultAlgorithm struct{}

func (dal DefaultAlgorithm) Encrypt() {}

func (dal DefaultAlgorithm) Decrypt() {}

考慮在應用層方便切換不同的算法, 這里需要設計一個管理接口的方法, 首先定義一個結構體:

type AlgorithmManager struct {
  algorithm IAlgorithm
}

在這個結構體中, 成員是上面接口名稱的對象。

然后我定義了兩個方法, 一個是設置算法對象的方法, 另一個是執行算法方式的方法。

首先是設置算法對象的方法:

func (gor *AlgorithmManager) SetAlgorithm(algorithm IAlgorithm) {
  gor.algorithm = algorithm
}

這個方法會接收一個參數,這個參數就是用戶想要調用哪種算法的對象, 只有給接口賦對應算法的對象,接口才知道調用哪個算法的方法。

其次是運行算法類型的方法:

const (
  encryptMode = "encrypt"
  decryptMode = "decrypt"
)

func (gor *AlgorithmManager) RunAlgorithm(runMode string) {
  switch runMode {
  case encryptMode:
    gor.algorithm.Encrypt()
    break
  case decryptMode:
    gor.algorithm.Decrypt()
    break
  }
}

這里我定義了兩個模式用來標識加密模式和解密模式, 當給RunAlgorithm傳參encryptMode, 則會執行加密函數,反之則執行解密函數。

4.AES加解密算法實現

在AES加解密客戶端調用接口中, 我選擇了選項設計模式, 用戶可以根據加密算法和解密算法參數不同進行靈活的選項傳參。

首先定義一個方法結構體:

type AesAlgorithm struct {
  AppAlg *AlgorithmManager
  EncryptKey string // 密鑰
  PlaintextContent string // 明文內容
  CiphertextContent string // 密文內容
}

在這個結構體中, 密鑰、明文內容、密文內容是我們在使用功能過程中必須傳入的參數, 其中還帶有一個結構對象指針: *AlgorithmManager, 方便我們將AES算法的對象傳給接口,讓其調用AES的加密方法或解密方法。

其次定義一個方便客戶端調用的接口, 并使用動態選項傳參,實現代碼如下:

type AesAlgorithmOption func(aes *AesAlgorithm)

// 用戶初始化調用并傳參
func NewAesAlgorithm(options ...AesAlgorithmOption) *AesAlgorithm {
  aesAlg := &AesAlgorithm{
    AppAlg: new(AlgorithmManager),
    EncryptKey: "",
    PlaintextContent: "",
    CiphertextContent: "",
  }
  for _, option := range options {
    option(aesAlg)
  }
  return aesAlg
}

// 通過該選項函數傳入key
func WithEncryptKey(key string) AesAlgorithmOption {
  return func(aes *AesAlgorithm) {
    aes.EncryptKey = key
  }
}

// 通過該選項函數傳入明文
func WithPlaintextContent(plainText string) AesAlgorithmOption {
  return func(aes *AesAlgorithm) {
    aes.PlaintextContent = plainText
  }
}

// 通過該選項函數傳入密文
func WithCiphertextContent(cipherContent string) AesAlgorithmOption {
  return func(aes *AesAlgorithm) {
    aes.CiphertextContent = cipherContent
  }
}

下面我們還實現了兩個內部函數,分別是加密和解密過程中需要填充塊的實現方法,代碼如下:

加密填充塊:

func pkcs5Padding(cipherText []byte, blockSize int) []byte {
  padding := blockSize - len(cipherText)%blockSize
  padtext := 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)]
}

最后實現了加密接口函數和解密接口函數,代碼如下:

加密接口函數實現:

func (aalg *AesAlgorithm) Encrypt() {
  tmpKeys := []byte(aalg.EncryptKey)
  tmpPlaintext := aalg.PlaintextContent
  block, err := aes.NewCipher(tmpKeys)
  if err != nil {
    fmt.Println("aes加密失敗,原因:" + err.Error())
    return
  }
  blockSize := block.BlockSize()
  origData := pkcs5Padding([]byte(tmpPlaintext), blockSize)

  blockMode := cipher.NewCBCEncrypter(block, tmpKeys[:blockSize])
  crypted := make([]byte, len(origData))
  blockMode.CryptBlocks(crypted, origData)
  aalg.CiphertextContent = hex.EncodeToString(crypted)
}

解密接口函數實現:

func (aalg *AesAlgorithm) Decrypt() {
  tmpKeys := []byte(aalg.EncryptKey)
  cryptedByte, _ := hex.DecodeString(aalg.CiphertextContent)
  block, err := aes.NewCipher(tmpKeys)
  if err != nil {
    fmt.Println("aes解密失敗,原因:" + err.Error())
    return
  }
  blockSize := block.BlockSize()
  blockMode := cipher.NewCBCDecrypter(block, tmpKeys[:blockSize])
  origin := make([]byte, len(cryptedByte))
  blockMode.CryptBlocks(origin, cryptedByte)
  decryptStrings := pkcs5UnPadding(origin)
  aalg.PlaintextContent = string(decryptStrings)
}

5.AES加密函數驗證

我在aes_test.go中實現加密函數測試模塊:TestEncrypt(t *testing.T), 代碼如下:

func TestEncrypt(t *testing.T) {
  aesAlg := NewAesAlgorithm(
    WithEncryptKey("ZEplYJFPLlhhMaJI"),
    WithPlaintextContent("qYWwo7!!Eq-TX3q"),
  )
  aesAlg.AppAlg.SetAlgorithm(aesAlg)
  aesAlg.AppAlg.RunAlgorithm("encrypt")
  fmt.Println(aesAlg.CiphertextContent)
}

在上面的代碼中, 我們調用了AES算法的對外統一接口函數:NewAesAlgorithm, 并分別調用WithEncryptKey和WithPlaintextContent傳入了Key內容和明文內容, 并調用接口管理方法:SetAlgorithm進行對象賦值, 最后調用RunAlgorithm("encrypt")方法進行AES加密,實際結果如下:

6.AES解密函數驗證

同樣在aes_test.go中實現加密函數測試模塊:TestDecrypt(t *testing.T), 代碼如下:

func TestDecrypt(t *testing.T) {
  aesAlg := NewAesAlgorithm(
    WithEncryptKey("ZEplYJFPLlhhMaJI"),
    WithCiphertextContent("31404e2eb60e2d16faae152106882f4b"),
  )
  aesAlg.AppAlg.SetAlgorithm(aesAlg)
  aesAlg.AppAlg.RunAlgorithm("decrypt")
  fmt.Println(aesAlg.PlaintextContent)
}

在上面的代碼中, 我們調用了AES算法的對外統一接口函數:NewAesAlgorithm, 并分別調用WithEncryptKey和WithCiphertextContent傳入了Key內容和上面加密的密文內容, 并調用接口管理方法:SetAlgorithm進行對象賦值, 最后調用RunAlgorithm("decrypt")方法進行AES解密,實際結果如下:

可以看到,成功解密出密文且跟加密時傳入的明文一致,解密正確。

責任編輯:趙寧寧 來源: 二進制空間安全
相關推薦

2010-10-28 14:21:52

2022-07-27 08:49:34

接口加密解密

2022-04-22 10:51:45

TSaxios前端

2024-09-27 15:24:15

Spring數據加解密

2025-06-27 10:12:15

Go封裝開發

2024-08-19 01:10:00

RedisGo代碼

2022-05-11 13:56:08

Java項目redis客戶端

2022-09-14 18:23:01

工具加解密接口

2022-12-14 09:06:58

接口Spring解密

2022-02-21 08:15:15

Go項目語言

2024-07-02 09:15:58

2012-10-11 17:02:02

IBMdw

2024-12-11 09:13:00

2017-12-07 10:25:55

LinuxGPG加密解密

2021-03-30 10:46:42

SpringBoot計數器漏桶算法

2009-03-04 10:27:50

客戶端組件桌面虛擬化Xendesktop

2024-10-17 08:58:31

2025-05-14 04:00:00

2022-01-26 07:25:09

PythonRSA加解密

2016-09-27 19:30:11

點贊
收藏

51CTO技術棧公眾號

日韩欧美一级视频| 捷克做爰xxxⅹ性视频| 欧美女优在线观看| 美女一区二区久久| 久久亚洲欧美日韩精品专区 | 欧美性video| 99精品视频免费在线观看| 国产精品影片在线观看| 免费毛片一区二区三区| 久久综合av| 日韩av在线免费播放| 国产乱女淫av麻豆国产| 在线视频cao| 亚洲最大成人综合| 亚洲成色www久久网站| 久久久国产影院| 手机av在线免费| √8天堂资源地址中文在线| 日本一区二区综合亚洲| 成人免费视频网站入口| 欧美成人精品网站| 亚洲精品一二| 欧美成人第一页| 亚洲精品91在线| 欧美一性一交| 日韩欧美国产wwwww| 麻豆一区二区三区视频| 欲香欲色天天天综合和网| 一区2区3区在线看| 宅男一区二区三区| 黄网在线免费| 91视频国产资源| 不卡一区二区三区视频| 亚洲手机在线观看| 任你操精品视频| 成人福利片在线| 欧美丝袜一区二区| 国产无限制自拍| 性网站在线观看| 国产精品国产三级国产aⅴ中文 | 国产精品国产成人国产三级 | 亚洲福利视频一区二区| 好色先生视频污| 五月婷婷在线视频| 国产日韩欧美激情| 免费成人看片网址| 青青草视频在线观看| k8久久久一区二区三区| 国产精品有限公司| 日本精品一二区| 国产91精品一区二区麻豆网站| 国产精品丝袜一区二区三区| 神马久久久久久久| 久久一二三四| 国产成人精品一区二区| 波多野结衣mp4| 久久精品主播| 国产精品美女午夜av| 国产精品高清无码| 免费观看在线综合| 国产精品视频一区国模私拍| 中文字幕日韩第一页| 卡一卡二国产精品| 成人性教育视频在线观看| 一区二区三区黄| 国产高清在线观看免费不卡| 91成人在线看| 天天干天天摸天天操| 99久久er热在这里只有精品66| 黑人另类av| 日本高清中文字幕二区在线| 国产人久久人人人人爽| 亚洲图色在线| av毛片在线播放| 亚洲成人免费av| 欧美牲交a欧美牲交aⅴ免费下载| 欧美一区久久久| 欧美日精品一区视频| 日本在线观看视频一区| 粉嫩的18在线观看极品精品| 亚洲女人被黑人巨大进入| 无码少妇精品一区二区免费动态| 国产精品国内免费一区二区三区| 色综合男人天堂| 九九热精品视频在线| 麻豆精品在线播放| 国产v亚洲v天堂无码| 国产免费a∨片在线观看不卡| 国产精品久久毛片| 欧美图片激情小说| 日本成人片在线| 日韩一二三四区| 亚洲自拍偷拍一区二区| 五月久久久综合一区二区小说| 国外成人在线直播| 中文字幕一区二区三区四区免费看| 国产在线视视频有精品| 欧美日韩国产高清视频| 黄色在线免费看| 狠狠色噜噜狠狠狠狠97| gai在线观看免费高清| 老汉色老汉首页av亚洲| 日韩中文av在线| 日产欧产va高清| 久久99热狠狠色一区二区| 国产精品乱子乱xxxx| 在线观看完整版免费| 婷婷综合五月天| 97超碰人人爽| 国产精品免费99久久久| 久久久久久久爱| 一级做a爱片性色毛片| 99riav久久精品riav| 欧美做受777cos| 成人免费一区| 精品亚洲一区二区三区| 久久精品一区二区三| 奇米色777欧美一区二区| 成人在线观看av| 免费在线观看黄色| 在线免费精品视频| 国产精品无码网站| 欧美另类亚洲| 91视频免费在线| a中文在线播放| 色综合久久久久| 久久久午夜精品福利内容| 亚洲精品成人| 国产精品自在线| 国产在线一二三| 一区二区三区精品视频在线| 免费黄色特级片| 久久香蕉网站| 欧美激情精品久久久久久蜜臀| 一级黄色片在线播放| 国产欧美精品一区二区色综合 | 精品国产在天天线2019| 丝袜美腿小色网| 久久激情五月婷婷| 亚洲一卡二卡三卡| 韩国精品视频在线观看 | 三级在线观看免费大全| 奇米精品一区二区三区在线观看| 欧美在线播放一区| 国产日韩另类视频一区| 亚洲欧美一区二区三区四区| 91av在线免费视频| 99精品一区二区| 免费av观看网址| 久久香蕉精品香蕉| 青青精品视频播放| 色猫av在线| 色婷婷精品久久二区二区蜜臂av| 加勒比综合在线| 久热综合在线亚洲精品| 特级西西444www大精品视频| 国产精品黄色片| 日韩中文在线中文网三级| 国产又粗又猛又爽又黄的视频一| 亚洲天堂网中文字| 免费看的av网站| 欧美日韩一区二区国产| 动漫3d精品一区二区三区| 丰满诱人av在线播放| 日韩av在线电影网| 国产一区二区视频网站| 国产精品久久久久久户外露出| 三区视频在线观看| 欧美日韩免费| 九九九九久久久久| 秋霞国产精品| 久久国产天堂福利天堂| 亚洲欧美黄色片| 色综合天天综合网天天狠天天| 亚洲自拍偷拍图| 久久99国产精品麻豆| 特级西西444| 亚州综合一区| 国产精品视频26uuu| 日韩欧美一起| 天堂av在线免费| 亚洲欧美乱综合| 亚洲乱妇老熟女爽到高潮的片 | 亚洲精品动漫100p| 久久精品国产成人av| 中文字幕av一区 二区| 日韩av片免费观看| 亚洲激情二区| 在线免费观看日本一区| 男男一级淫片免费播放| 久久久精品网| 好色先生视频污| 美女一区2区| 国产主播喷水一区二区| 蜜桃麻豆影像在线观看| 久久精品亚洲94久久精品| 天天干免费视频| 欧美精品一二三| 中文字幕第15页| 亚洲免费电影在线| 国产高清一区二区三区四区| 国产九色精品成人porny | 免费成人在线影院| 免费拍拍拍网站| 欧美成人milf| 麻豆传媒一区| 日韩欧美久久| 国产精品va在线播放我和闺蜜| 国产桃色电影在线播放| 日韩中文娱乐网| 国产高清视频在线播放| 亚洲福利视频网站| 99热这里只有精品在线观看| 在线观看国产日韩| 日本高清www免费视频| 亚洲免费在线观看视频| 五月婷婷婷婷婷| 久久五月婷婷丁香社区| 9.1在线观看免费| 精品一二三四区| 天天影视综合色| 欧美综合二区| 妞干网在线观看视频| 一区二区电影| av动漫免费观看| 日韩精品久久| 亚洲精品欧美精品| 国产探花在线精品一区二区| 久久综合一区二区三区| 精品人人人人| 99porn视频在线| 国产一区精品二区| 成人国产亚洲精品a区天堂华泰| 日韩大尺度黄色| 欧美制服第一页| 免费一二一二在线视频| 国内精品久久久久久影视8| 青草在线视频| 久久久久这里只有精品| 四虎影院观看视频在线观看| 欧美成年人视频网站欧美| a毛片在线看免费观看| 美女福利精品视频| 国产欧美黑人| 欧美肥老妇视频| 秋霞在线视频| 97视频在线看| 亚洲美女久久精品| 国产高清在线不卡| 成人网ww555视频免费看| 国产精品视频导航| 伊人久久一区| 91嫩草免费看| 六月丁香久久丫| 久久久久久久久久久一区 | 国产视频精品免费播放| 黄色毛片在线看| 在线播放国产一区二区三区| 香蕉视频在线看| 欧美成人久久久| av在线不卡免费| 日本午夜人人精品| 玖玖精品在线| 成人av男人的天堂| 欧美电影在线观看完整版| 欧美大香线蕉线伊人久久国产精品| 亚洲免费专区| 亚洲国产精品日韩| 午夜久久tv| 精品国产一二三四区| 秋霞午夜av一区二区三区| 亚洲一区二区在线视频观看| 国产成人在线观看| 中文精品在线观看| 中文欧美字幕免费| 免费人成在线观看| 狠狠躁夜夜躁人人爽天天天天97 | 日韩午夜电影在线观看| 国产小视频一区| 亚洲天堂日韩电影| 色呦呦在线播放| 日本精品免费观看| 国产一区二区三区视频在线| 久久精品国产精品青草色艺| 欧美少妇性xxxx| 成人一级生活片| 日本在线观看不卡视频| 国偷自产av一区二区三区麻豆| 久久久久久夜精品精品免费| 熟女少妇a性色生活片毛片| 亚洲国产精品天堂| 中文字幕永久在线观看| 亚洲电影天堂av| 色哟哟免费在线观看| 91精品国产色综合久久不卡98口| 精品176极品一区| 精品午夜一区二区| 66视频精品| 成人在线免费在线观看| 国产精品18久久久久久vr| 久久亚洲无码视频| 五月天激情综合| 国产成人精品免费看视频| 国产亚洲欧美另类中文| 51精品在线| 91免费版网站入口| 国产中文精品久高清在线不| 999一区二区三区| 久久成人免费网站| 蜜桃av免费看| 亚洲第一久久影院| 国产精品羞羞答答在线| 亚洲欧美日韩久久久久久| 成人超碰在线| 99久久无色码| 久久久久亚洲| 亚洲欧美久久久久| 久久久欧美精品sm网站| 日本一级黄色大片| 日韩午夜激情电影| 激情在线小视频| 91精品久久久久久久久久另类| 沈樵精品国产成av片| 成人午夜精品久久久久久久蜜臀| 国产精品中文有码| 国产喷水在线观看| 欧美日韩一区二区三区高清| 免费动漫网站在线观看| 91高清视频免费| 老司机精品视频在线播放| 成人免费观看在线| 大胆亚洲人体视频| 免费一级肉体全黄毛片| 欧美一级片免费看| av片在线观看| 999国产视频| 欧美午夜影院| 精品人妻一区二区免费| 亚洲一级二级三级| 国产综合视频在线| 久久久免费av| 人人精品视频| 日本三级免费观看| 国产性天天综合网| 中文字幕欧美人妻精品| 色伦专区97中文字幕| 欧美激情三区| 中文字幕の友人北条麻妃| 国产成人综合在线观看| 精品亚洲永久免费| 亚洲国产欧美一区二区丝袜黑人 | 中文字幕在线观看的网站| 午夜精品123| 欧美日韩在线精品一区二区三区激情综| 91豆花精品一区| 国产精品一区二区99| 9l视频白拍9色9l视频| 国产精品少妇自拍| 国产精品永久久久久久久久久| 欧美大成色www永久网站婷| 在线日韩成人| 日韩在线综合网| 国产午夜久久久久| 一级黄色大片网站| 麻豆乱码国产一区二区三区| 综合激情网...| 成人免费在线小视频| 欧美国产激情二区三区| 国产三级漂亮女教师| 久久久久久久久网站| 在线成人动漫av| 57pao国产成永久免费视频| 亚洲在线观看免费视频| 亚洲av片一区二区三区| 国产精品久久久久久一区二区| 亚洲91精品| 国产吞精囗交久久久| 欧美日韩三级在线| 免费在线观看av电影| 日本免费高清一区| 国产精品一区二区男女羞羞无遮挡 | 又色又爽又高潮免费视频国产| 国产精品久久一级| 黄色成人一级片| 国产ts一区二区| 色综合咪咪久久网| 秘密基地免费观看完整版中文| 色中色一区二区| av观看在线| 欧美日韩最好看的视频| 国产成人一级电影| 国产日韩久久久| 久久露脸国产精品| 久久在线视频| 国产精品无码午夜福利| 欧美一级一区二区| 欧美aaa视频| 18禁免费观看网站| 亚洲日本青草视频在线怡红院 | 91综合精品国产丝袜长腿久久|