AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

在 Go 項(xiàng)目中封裝 AES 加解密客戶端接口

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

1.摘要

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

d3z28資訊網(wǎng)——每日最新資訊28at.com

2.工程文件結(jié)構(gòu)

在一個(gè)正規(guī)項(xiàng)目中, 我們要封裝的文件主要添加在算法文件夾下, 目錄結(jié)構(gòu)規(guī)劃如下:d3z28資訊網(wǎng)——每日最新資訊28at.com

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

我在名為"algorithm"文件夾下新建了三個(gè)文件, 其中base.go為基礎(chǔ)接口函數(shù)定義, 因?yàn)橐院罂赡芤尤脒M(jìn)來的算法會比較多,因此需要有一個(gè)基礎(chǔ)類文件來定義通用函數(shù)接口。d3z28資訊網(wǎng)——每日最新資訊28at.com

aes.go文件中主要實(shí)現(xiàn)AES算法的加解密過程, 并提供一個(gè)對外的初始化接口,方便應(yīng)用層調(diào)用。d3z28資訊網(wǎng)——每日最新資訊28at.com

aes_test.go是作為單元測試的文件, 在里面可以針對AES加密函數(shù)和解密函數(shù)寫測試用例, 不用編譯整個(gè)工程實(shí)現(xiàn)單元測試。d3z28資訊網(wǎng)——每日最新資訊28at.com

如果后面有新的算法加入進(jìn)來, 例如:des算法, 只需要添加一個(gè)des.go和des_test.go文件, 在里面實(shí)現(xiàn)函數(shù)功能即可。d3z28資訊網(wǎng)——每日最新資訊28at.com

3.基礎(chǔ)接口實(shí)現(xiàn)

基礎(chǔ)接口實(shí)現(xiàn)主要在base.go文件中, 因?yàn)閷τ谒屑用芩惴▉碇v, 都有兩個(gè)最基礎(chǔ)通用的方法:加密函數(shù)和解密函數(shù),因此這里定義了兩個(gè)通用的方法接口:d3z28資訊網(wǎng)——每日最新資訊28at.com

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

因?yàn)楝F(xiàn)在不知道項(xiàng)目默認(rèn)需要使用什么算法,因此實(shí)現(xiàn)這兩個(gè)方法的空接口:d3z28資訊網(wǎng)——每日最新資訊28at.com

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

考慮在應(yīng)用層方便切換不同的算法, 這里需要設(shè)計(jì)一個(gè)管理接口的方法, 首先定義一個(gè)結(jié)構(gòu)體:d3z28資訊網(wǎng)——每日最新資訊28at.com

type AlgorithmManager struct {  algorithm IAlgorithm}

在這個(gè)結(jié)構(gòu)體中, 成員是上面接口名稱的對象。d3z28資訊網(wǎng)——每日最新資訊28at.com

然后我定義了兩個(gè)方法, 一個(gè)是設(shè)置算法對象的方法, 另一個(gè)是執(zhí)行算法方式的方法。d3z28資訊網(wǎng)——每日最新資訊28at.com

首先是設(shè)置算法對象的方法:d3z28資訊網(wǎng)——每日最新資訊28at.com

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

這個(gè)方法會接收一個(gè)參數(shù),這個(gè)參數(shù)就是用戶想要調(diào)用哪種算法的對象, 只有給接口賦對應(yīng)算法的對象,接口才知道調(diào)用哪個(gè)算法的方法。d3z28資訊網(wǎng)——每日最新資訊28at.com

其次是運(yùn)行算法類型的方法:d3z28資訊網(wǎng)——每日最新資訊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  }}

這里我定義了兩個(gè)模式用來標(biāo)識加密模式和解密模式, 當(dāng)給RunAlgorithm傳參encryptMode, 則會執(zhí)行加密函數(shù),反之則執(zhí)行解密函數(shù)。d3z28資訊網(wǎng)——每日最新資訊28at.com

4.AES加解密算法實(shí)現(xiàn)

在AES加解密客戶端調(diào)用接口中, 我選擇了選項(xiàng)設(shè)計(jì)模式, 用戶可以根據(jù)加密算法和解密算法參數(shù)不同進(jìn)行靈活的選項(xiàng)傳參。d3z28資訊網(wǎng)——每日最新資訊28at.com

首先定義一個(gè)方法結(jié)構(gòu)體:d3z28資訊網(wǎng)——每日最新資訊28at.com

type AesAlgorithm struct {  AppAlg *AlgorithmManager  EncryptKey string // 密鑰  PlaintextContent string // 明文內(nèi)容  CiphertextContent string // 密文內(nèi)容}

在這個(gè)結(jié)構(gòu)體中, 密鑰、明文內(nèi)容、密文內(nèi)容是我們在使用功能過程中必須傳入的參數(shù), 其中還帶有一個(gè)結(jié)構(gòu)對象指針: *AlgorithmManager, 方便我們將AES算法的對象傳給接口,讓其調(diào)用AES的加密方法或解密方法。d3z28資訊網(wǎng)——每日最新資訊28at.com

其次定義一個(gè)方便客戶端調(diào)用的接口, 并使用動(dòng)態(tài)選項(xiàng)傳參,實(shí)現(xiàn)代碼如下:d3z28資訊網(wǎng)——每日最新資訊28at.com

type AesAlgorithmOption func(aes *AesAlgorithm)// 用戶初始化調(diào)用并傳參func NewAesAlgorithm(options ...AesAlgorithmOption) *AesAlgorithm {  aesAlg := &AesAlgorithm{    AppAlg: new(AlgorithmManager),    EncryptKey: "",    PlaintextContent: "",    CiphertextContent: "",  }  for _, option := range options {    option(aesAlg)  }  return aesAlg}// 通過該選項(xiàng)函數(shù)傳入keyfunc WithEncryptKey(key string) AesAlgorithmOption {  return func(aes *AesAlgorithm) {    aes.EncryptKey = key  }}// 通過該選項(xiàng)函數(shù)傳入明文func WithPlaintextContent(plainText string) AesAlgorithmOption {  return func(aes *AesAlgorithm) {    aes.PlaintextContent = plainText  }}// 通過該選項(xiàng)函數(shù)傳入密文func WithCiphertextContent(cipherContent string) AesAlgorithmOption {  return func(aes *AesAlgorithm) {    aes.CiphertextContent = cipherContent  }}

下面我們還實(shí)現(xiàn)了兩個(gè)內(nèi)部函數(shù),分別是加密和解密過程中需要填充塊的實(shí)現(xiàn)方法,代碼如下:d3z28資訊網(wǎng)——每日最新資訊28at.com

加密填充塊:d3z28資訊網(wǎng)——每日最新資訊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...)}

解密填充塊:d3z28資訊網(wǎng)——每日最新資訊28at.com

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

最后實(shí)現(xiàn)了加密接口函數(shù)和解密接口函數(shù),代碼如下:d3z28資訊網(wǎng)——每日最新資訊28at.com

加密接口函數(shù)實(shí)現(xiàn):d3z28資訊網(wǎng)——每日最新資訊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)}

解密接口函數(shù)實(shí)現(xiàn):d3z28資訊網(wǎng)——每日最新資訊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加密函數(shù)驗(yàn)證

我在aes_test.go中實(shí)現(xiàn)加密函數(shù)測試模塊:TestEncrypt(t *testing.T), 代碼如下:d3z28資訊網(wǎng)——每日最新資訊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)}

在上面的代碼中, 我們調(diào)用了AES算法的對外統(tǒng)一接口函數(shù):NewAesAlgorithm, 并分別調(diào)用WithEncryptKey和WithPlaintextContent傳入了Key內(nèi)容和明文內(nèi)容, 并調(diào)用接口管理方法:SetAlgorithm進(jìn)行對象賦值, 最后調(diào)用RunAlgorithm("encrypt")方法進(jìn)行AES加密,實(shí)際結(jié)果如下:d3z28資訊網(wǎng)——每日最新資訊28at.com

d3z28資訊網(wǎng)——每日最新資訊28at.com

6.AES解密函數(shù)驗(yàn)證

同樣在aes_test.go中實(shí)現(xiàn)加密函數(shù)測試模塊:TestDecrypt(t *testing.T), 代碼如下:d3z28資訊網(wǎng)——每日最新資訊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)}

在上面的代碼中, 我們調(diào)用了AES算法的對外統(tǒng)一接口函數(shù):NewAesAlgorithm, 并分別調(diào)用WithEncryptKey和WithCiphertextContent傳入了Key內(nèi)容和上面加密的密文內(nèi)容, 并調(diào)用接口管理方法:SetAlgorithm進(jìn)行對象賦值, 最后調(diào)用RunAlgorithm("decrypt")方法進(jìn)行AES解密,實(shí)際結(jié)果如下:d3z28資訊網(wǎng)——每日最新資訊28at.com

d3z28資訊網(wǎng)——每日最新資訊28at.com

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

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

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Rust結(jié)構(gòu)體的定義和實(shí)例化

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

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 石頭自清潔掃拖機(jī)器人G10S評測:多年黑科技集大成之作 懶人終極福音

    科技圈經(jīng)常能看到一個(gè)詞叫“縫合怪”,用來形容那些把好多功能或者外觀結(jié)合在一起的產(chǎn)品,通常這樣的詞是貶義詞,但如果真的是產(chǎn)品縫合的好、縫合的實(shí)用的話,那它就成了中性詞,今
  • 六大權(quán)益!華為8月服務(wù)日開啟:手機(jī)免費(fèi)貼膜、維修免人工費(fèi)

    8月5日消息,一年一度的華為開發(fā)者大會2023(Together)日前在松山湖拉開帷幕,與此同時(shí),華為8月服務(wù)日也式開啟,到店可享六大專屬權(quán)益。華為用戶可在華為商城Ap
  • Flowable工作流引擎的科普與實(shí)踐

    一.引言當(dāng)我們在日常工作和業(yè)務(wù)中需要進(jìn)行各種審批流程時(shí),可能會面臨一系列技術(shù)和業(yè)務(wù)上的挑戰(zhàn)。手動(dòng)處理這些審批流程可能會導(dǎo)致開發(fā)成本的增加以及業(yè)務(wù)復(fù)雜度的上升。在這
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數(shù)據(jù)的地方,是數(shù)據(jù)源的一種,比如大家經(jīng)常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數(shù)據(jù),它既可以保
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術(shù),可以幫助我們寫出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實(shí)現(xiàn)原理和應(yīng)用
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個(gè)大新聞是Meta AI推出了新的開源授權(quán)的大型語言模型Llama 2。這是一項(xiàng)非常重要的進(jìn)展:Llama 2可免費(fèi)用于研究和商業(yè)用途。(幾小時(shí)前,swyy發(fā)現(xiàn)它已從LLaMA 2更名為Lla
  • 小紅書1周漲粉49W+,我總結(jié)了小白可以用的N條漲粉筆記

    作者:黃河懂運(yùn)營一條性教育視頻,被54萬人“珍藏”是什么體驗(yàn)?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點(diǎn)贊!更瘋狂的是,這
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網(wǎng)消息,據(jù)彭博社報(bào)道,在8月3日印度突然禁止在沒有許可證的情況下向印度進(jìn)口電腦/平板及顯示器等產(chǎn)品后,蘋果、三星電子和惠普等大公司暫停向印度
  • 聯(lián)想小新Pad Pro 12.6將要推出,搭載高通驍龍 870 處理器

    聯(lián)想小新Pad Pro 12.6將于秋季新品會上推出,官方按照慣例直接在發(fā)布會前給出了機(jī)型的所有參數(shù)。聯(lián)想小新 Pad Pro 12.6 將搭載高通驍龍 870 處理器,重量為 5
Top