日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-01-02 17:28:32 248觀看
導讀1.摘要在一個中型以上的項目中, 我們一般會在項目工程中開辟一個pkg文件夾用來存放一些基礎工具接口,比如:數據庫、中間件、加解密算法、基礎協議等等。在這篇文章中, 我主要分享一下在基于Go語言的項目中, 加解密算

1.摘要

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

gq228資訊網——每日最新資訊28at.com

2.工程文件結構

在一個正規項目中, 我們要封裝的文件主要添加在算法文件夾下, 目錄結構規劃如下:gq228資訊網——每日最新資訊28at.com

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

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

aes.go文件中主要實現AES算法的加解密過程, 并提供一個對外的初始化接口,方便應用層調用。gq228資訊網——每日最新資訊28at.com

aes_test.go是作為單元測試的文件, 在里面可以針對AES加密函數和解密函數寫測試用例, 不用編譯整個工程實現單元測試。gq228資訊網——每日最新資訊28at.com

如果后面有新的算法加入進來, 例如:des算法, 只需要添加一個des.go和des_test.go文件, 在里面實現函數功能即可。gq228資訊網——每日最新資訊28at.com

3.基礎接口實現

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

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

因為現在不知道項目默認需要使用什么算法,因此實現這兩個方法的空接口:gq228資訊網——每日最新資訊28at.com

type DefaultAlgorithm struct{}func (dal DefaultAlgorithm) Encrypt() {}func (dal DefaultAlgorithm) Decrypt() {}

考慮在應用層方便切換不同的算法, 這里需要設計一個管理接口的方法, 首先定義一個結構體:gq228資訊網——每日最新資訊28at.com

type AlgorithmManager struct {  algorithm IAlgorithm}

在這個結構體中, 成員是上面接口名稱的對象。gq228資訊網——每日最新資訊28at.com

然后我定義了兩個方法, 一個是設置算法對象的方法, 另一個是執行算法方式的方法。gq228資訊網——每日最新資訊28at.com

首先是設置算法對象的方法:gq228資訊網——每日最新資訊28at.com

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

這個方法會接收一個參數,這個參數就是用戶想要調用哪種算法的對象, 只有給接口賦對應算法的對象,接口才知道調用哪個算法的方法。gq228資訊網——每日最新資訊28at.com

其次是運行算法類型的方法:gq228資訊網——每日最新資訊28at.com

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, 則會執行加密函數,反之則執行解密函數。gq228資訊網——每日最新資訊28at.com

4.AES加解密算法實現

在AES加解密客戶端調用接口中, 我選擇了選項設計模式, 用戶可以根據加密算法和解密算法參數不同進行靈活的選項傳參。gq228資訊網——每日最新資訊28at.com

首先定義一個方法結構體:gq228資訊網——每日最新資訊28at.com

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

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

其次定義一個方便客戶端調用的接口, 并使用動態選項傳參,實現代碼如下:gq228資訊網——每日最新資訊28at.com

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}// 通過該選項函數傳入keyfunc 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  }}

下面我們還實現了兩個內部函數,分別是加密和解密過程中需要填充塊的實現方法,代碼如下:gq228資訊網——每日最新資訊28at.com

加密填充塊:gq228資訊網——每日最新資訊28at.com

func pkcs5Padding(cipherText []byte, blockSize int) []byte {  padding := blockSize - len(cipherText)%blockSize  padtext := bytes.Repeat([]byte{byte(padding)}, padding)  return append(cipherText, padtext...)}

解密填充塊:gq228資訊網——每日最新資訊28at.com

func pkcs5UnPadding(origData []byte) []byte {  length := len(origData)  unpadding := int(origData[length-1])  return origData[:(length - unpadding)]}

最后實現了加密接口函數和解密接口函數,代碼如下:gq228資訊網——每日最新資訊28at.com

加密接口函數實現:gq228資訊網——每日最新資訊28at.com

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)}

解密接口函數實現:gq228資訊網——每日最新資訊28at.com

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), 代碼如下:gq228資訊網——每日最新資訊28at.com

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加密,實際結果如下:gq228資訊網——每日最新資訊28at.com

gq228資訊網——每日最新資訊28at.com

6.AES解密函數驗證

同樣在aes_test.go中實現加密函數測試模塊:TestDecrypt(t *testing.T), 代碼如下:gq228資訊網——每日最新資訊28at.com

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解密,實際結果如下:gq228資訊網——每日最新資訊28at.com

gq228資訊網——每日最新資訊28at.com

可以看到,成功解密出密文且跟加密時傳入的明文一致,解密正確。gq228資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-56425-0.html在 Go 項目中封裝 AES 加解密客戶端接口

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Rust結構體的定義和實例化

下一篇: Go 語言為什么很少使用數組?

標簽:
  • 熱門焦點
  • 一加Ace2 Pro官宣:普及16G內存 引領24G

    一加官方今天繼續為本月發布的新機一加Ace2 Pro帶來預熱,公布了內存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領,還有呢?#一加Ace2Pro#,2023 年 8 月,敬請期待。”同時
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz“難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?”這一番話,出自百合網聯合創
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了“本地生活”入口,位置較深,位于首頁的“充值中心”內,目前主要售賣美食相關的
  • 疑似小米14外觀設計圖曝光:后置相機模組變化不大

    下半年的大幕已經開啟,而誰將成為下半年手機圈的主角就成為了大家關注的焦點,其中被傳有望拿下新一代驍龍8 Gen3旗艦芯片的小米14系列更是備受大家矚
  • 支持aptX Lossless無損傳輸 iQOO TWS 1賽道版發布限時優惠價369元

    2023年7月4日,“無損音質,聲動人心”iQOO TWS 1正式發布,支持aptX Lossless無損傳輸,限時優惠價369元。iQOO TWS 1耳機率先支持端到端aptX Lossless無
Top 主站蜘蛛池模板: 神木县| 普兰店市| 凤阳县| 吴桥县| 芮城县| 文安县| 富平县| 西华县| 禄劝| 南溪县| 石首市| 垣曲县| 海盐县| 黔江区| 札达县| 沽源县| 肇州县| 长泰县| 赫章县| 武威市| 周至县| 景宁| 新河县| 军事| 萨嘎县| 梧州市| 农安县| 保德县| 元谋县| 鄢陵县| 颍上县| 通州市| 秀山| 舞阳县| 临泽县| 台州市| 潮州市| 青冈县| 紫金县| 开江县| 沁源县|