最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言實(shí)現(xiàn)AES加密并編寫一個(gè)命令行應(yīng)用程序

 更新時(shí)間:2023年02月16日 11:23:15   作者:TtrOps  
密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),又稱Rijndael加密法,是經(jīng)常采用的一種區(qū)塊加密標(biāo)準(zhǔn)。本文就來用Go語言實(shí)現(xiàn)AES加密算法,需要的可以參考一下

什么是AES

關(guān)于AES更多的知識(shí),請(qǐng)自行腦補(bǔ),密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),又稱Rijndael加密法,是經(jīng)常采用的一種區(qū)塊加密標(biāo)準(zhǔn)。

go實(shí)現(xiàn)aes加密

在golang的標(biāo)準(zhǔn)庫(kù)aes可以實(shí)現(xiàn)AES加密,官方標(biāo)準(zhǔn)庫(kù)aes文檔鏈接:https://pkg.go.dev/crypto/aes

小案例需求

本篇分享出在實(shí)際工作中的實(shí)際需求,需求很簡(jiǎn)單,就是需要實(shí)現(xiàn)一個(gè)命令行應(yīng)用程序,可以對(duì)傳入的明文字符串進(jìn)行加密,傳入密文進(jìn)行解密。命令行應(yīng)用叫做passctl,并帶有幫助功能。實(shí)現(xiàn)命令行應(yīng)用程序有很多強(qiáng)大的第三方庫(kù),因?yàn)樾枨筮^于簡(jiǎn)單,那么本篇就用標(biāo)準(zhǔn)庫(kù)中os即可。

實(shí)戰(zhàn)

加密代碼

package?main

import?(
?"bytes"
?"crypto/aes"
?"crypto/cipher"
?"encoding/base64"
?"fmt"
)

var?EncKey?=?[]byte("QAZWSXEDCRFVTGBY")?//?16位密碼串

func?pkcs7Padding(data?[]byte,?blockSize?int)?[]byte?{
?padding?:=?blockSize?-?len(data)%blockSize
?padText?:=?bytes.Repeat([]byte{byte(padding)},?padding)
?return?append(data,?padText...)
}

func?AesEncrypt(data?[]byte,?key?[]byte)?([]byte,?error)?{
?block,?err?:=?aes.NewCipher(key)
?if?err?!=?nil?{
??return?nil,?err
?}
?blockSize?:=?block.BlockSize()
?encryptBytes?:=?pkcs7Padding(data,?blockSize)
?crypted?:=?make([]byte,?len(encryptBytes))
?blockMode?:=?cipher.NewCBCEncrypter(block,?key[:blockSize])
?blockMode.CryptBlocks(crypted,?encryptBytes)
?return?crypted,?nil
}

func?EncryptByAes(data?[]byte)?(string,?error)?{
?res,?err?:=?AesEncrypt(data,?EncKey)
?if?err?!=?nil?{
??return?"",?err
?}
?return?base64.StdEncoding.EncodeToString(res),?nil
}

func?main()?{
?plaintext?:=?"2wsx$RFV!Qaz"?//?假設(shè)這是明文密碼
?p?:=?[]byte(plaintext)
?newp,?_?:=?EncryptByAes(p)?//?開始加密
?fmt.Println(newp)
}

解密代碼

基于上述加密后的密碼,對(duì)其進(jìn)行解密。

package?main

import?(
?"crypto/aes"
?"crypto/cipher"
?"encoding/base64"
?"errors"
?"fmt"
)

var?EncKey?=?[]byte("QAZWSXEDCRFVTGBY")?//?16位密碼串

func?pkcs7UnPadding(data?[]byte)?([]byte,?error)?{
?length?:=?len(data)
?if?length?==?0?{
??return?nil,?errors.New("Sorry,?the?encryption?string?is?wrong.")
?}
?unPadding?:=?int(data[length-1])
?return?data[:(length?-?unPadding)],?nil
}

func?AesDecrypt(data?[]byte,?key?[]byte)?([]byte,?error)?{
?block,?err?:=?aes.NewCipher(key)
?if?err?!=?nil?{
??return?nil,?err
?}
?blockSize?:=?block.BlockSize()
?blockMode?:=?cipher.NewCBCDecrypter(block,?key[:blockSize])
?crypted?:=?make([]byte,?len(data))
?blockMode.CryptBlocks(crypted,?data)
?crypted,?err?=?pkcs7UnPadding(crypted)
?if?err?!=?nil?{
??return?nil,?err
?}
?return?crypted,?nil
}

func?DecryptByAes(data?string)?([]byte,?error)?{
?dataByte,?err?:=?base64.StdEncoding.DecodeString(data)
?if?err?!=?nil?{
??return?nil,?err
?}
?return?AesDecrypt(dataByte,?EncKey)
}

func?main()?{
?ciphertext?:=?"+LxjKS8N+Kpy/HNxsSJMIw=="?//?密文
?pwd,?_?:=?DecryptByAes(ciphertext)???????//?開始解密
?fmt.Println(string(pwd))
}

實(shí)現(xiàn)passctl命令行應(yīng)用

代碼

package?main

import?(
?"bytes"
?"crypto/aes"
?"crypto/cipher"
?"encoding/base64"
?"errors"
?"fmt"
?"os"
)

var?EncKey?=?[]byte("QAZWSXEDCRFVTGBY")?//?16位密碼串

func?pkcs7Padding(data?[]byte,?blockSize?int)?[]byte?{
?padding?:=?blockSize?-?len(data)%blockSize
?padText?:=?bytes.Repeat([]byte{byte(padding)},?padding)
?return?append(data,?padText...)
}

func?pkcs7UnPadding(data?[]byte)?([]byte,?error)?{
?length?:=?len(data)
?if?length?==?0?{
??return?nil,?errors.New("Sorry,?the?encryption?string?is?wrong.")
?}
?unPadding?:=?int(data[length-1])
?return?data[:(length?-?unPadding)],?nil
}

func?AesEncrypt(data?[]byte,?key?[]byte)?([]byte,?error)?{
?block,?err?:=?aes.NewCipher(key)
?if?err?!=?nil?{
??return?nil,?err
?}
?blockSize?:=?block.BlockSize()
?encryptBytes?:=?pkcs7Padding(data,?blockSize)
?crypted?:=?make([]byte,?len(encryptBytes))
?blockMode?:=?cipher.NewCBCEncrypter(block,?key[:blockSize])
?blockMode.CryptBlocks(crypted,?encryptBytes)
?return?crypted,?nil
}

func?AesDecrypt(data?[]byte,?key?[]byte)?([]byte,?error)?{
?block,?err?:=?aes.NewCipher(key)
?if?err?!=?nil?{
??return?nil,?err
?}
?blockSize?:=?block.BlockSize()
?blockMode?:=?cipher.NewCBCDecrypter(block,?key[:blockSize])
?crypted?:=?make([]byte,?len(data))
?blockMode.CryptBlocks(crypted,?data)
?crypted,?err?=?pkcs7UnPadding(crypted)
?if?err?!=?nil?{
??return?nil,?err
?}
?return?crypted,?nil
}

func?EncryptByAes(data?[]byte)?(string,?error)?{
?res,?err?:=?AesEncrypt(data,?EncKey)
?if?err?!=?nil?{
??return?"",?err
?}
?return?base64.StdEncoding.EncodeToString(res),?nil
}

func?DecryptByAes(data?string)?([]byte,?error)?{
?dataByte,?err?:=?base64.StdEncoding.DecodeString(data)
?if?err?!=?nil?{
??return?nil,?err
?}
?return?AesDecrypt(dataByte,?EncKey)
}

const?help?=?`
Help?description?of?encryption?and?decryption?command?line?application

-h?--help?[Display?help]
-e?--encryption?Plaintext?string?encryption
-d?--decrypt?Ciphertext?string?decryption

Example:

1.?encryption?example:
passctl?-e?"your?plaintext?password"

2.?decryption?example:
passctl?-d?"Your?ciphertext?string"

`

func?main()?{
?args?:=?os.Args[1]
?if?args?==?"-h"?||?args?==?"--help"?{
??fmt.Print(help)
?}?else?if?args?==?"-e"?||?args?==?"--encryption"?{
??plaintext?:=?os.Args[2]
??p?:=?[]byte(plaintext)
??newp,?_?:=?EncryptByAes(p)
??fmt.Println(newp)
?}?else?if?args?==?"-d"?||?args?==?"--decrypt"?{
??ciphertext?:=?os.Args[2]
??a,?_?:=?DecryptByAes(ciphertext)
??fmt.Println(string(a))
?}?else?{
??fmt.Println("Invalid?option")
?}
}

編譯成二進(jìn)制后使用

#?編譯
[root@devhost?encryptionDecryption]#?go?build?-o?passctl?main.go

#?查看幫助
[root@devhost?encryptionDecryption]#?./passctl?-h

Help?description?of?encryption?and?decryption?command?line?application

-h?--help?[Display?help]
-e?--encryption?Plaintext?string?encryption
-d?--decrypt?Ciphertext?string?decryption

Example:

1.?encryption?example:
passctl?-e?"your?plaintext?password"

2.?decryption?example:
passctl?-d?"Your?ciphertext?string"

#?加密
[root@devhost?encryptionDecryption]#?./passctl?-e?abc123456
nGi3ls+2yghdv7o8Ly2Z+A==

#?解密
[root@devhost?encryptionDecryption]#?./passctl?-d?nGi3ls+2yghdv7o8Ly2Z+A==
abc123456
[root@devhost?encryptionDecryption]#?

到此這篇關(guān)于Go語言實(shí)現(xiàn)AES加密并編寫一個(gè)命令行應(yīng)用程序的文章就介紹到這了,更多相關(guān)Go語言AES加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VsCode下開發(fā)Go語言的環(huán)境配置超詳細(xì)圖文詳解

    VsCode下開發(fā)Go語言的環(huán)境配置超詳細(xì)圖文詳解

    vscode是一款跨平臺(tái)、輕量級(jí)、插件多的開源IDE,在vscode不僅可以配置C/C++、Python、R、Ruby等語言的環(huán)境,還可以配置Go語言的環(huán)境,下面這篇文章主要給大家介紹了關(guān)于VsCode下開發(fā)Go語言的環(huán)境配置,需要的朋友可以參考下
    2024-03-03
  • Go Java算法最大單詞長(zhǎng)度乘積示例詳解

    Go Java算法最大單詞長(zhǎng)度乘積示例詳解

    這篇文章主要為大家介紹了Go Java算法最大單詞長(zhǎng)度乘積示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • go實(shí)現(xiàn)Redis讀寫分離示例詳解

    go實(shí)現(xiàn)Redis讀寫分離示例詳解

    本篇文章將介紹Redis通信協(xié)議RESP,?而后在使用go來編寫一個(gè)中間件,從而來完成Redis讀寫分離,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go語言Zap庫(kù)Logger的定制化和封裝使用詳解

    Go語言Zap庫(kù)Logger的定制化和封裝使用詳解

    這篇文章主要介紹了Go語言Zap庫(kù)Logger的定制化和封裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 詳解golang中的結(jié)構(gòu)體編解碼神器Mapstructure庫(kù)

    詳解golang中的結(jié)構(gòu)體編解碼神器Mapstructure庫(kù)

    mapstructure是GO字典(map[string]interface{})和Go結(jié)構(gòu)體之間轉(zhuǎn)換的編解碼工具,這篇文章主要為大家介紹一下Mapstructure庫(kù)的相關(guān)使用,希望對(duì)大家有所幫助
    2023-09-09
  • Go語言實(shí)現(xiàn)Base64、Base58編碼與解碼

    Go語言實(shí)現(xiàn)Base64、Base58編碼與解碼

    本文主要介紹了Base64、Base58編碼與解碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Go語言中日志的規(guī)范使用建議分享

    Go語言中日志的規(guī)范使用建議分享

    在任何服務(wù)端的語言項(xiàng)目中,日志是至關(guān)重要的組成部分,本文為大家整理了一些如何規(guī)范使用GO語言日志的建議,以及相應(yīng)的實(shí)際示例,希望對(duì)大家有事幫助
    2024-01-01
  • 使用Go語言生成二維碼并在命令行中輸出

    使用Go語言生成二維碼并在命令行中輸出

    二維碼(QR code)是一種矩陣條碼的標(biāo)準(zhǔn),廣泛應(yīng)用于商業(yè)、移動(dòng)支付和數(shù)據(jù)存儲(chǔ)等領(lǐng)域,在開發(fā)過程中,我們可能需要在命令行中顯示二維碼,這可以幫助我們快速生成和分享二維碼信息,本文將介紹如何使用Go語言生成二維碼并在命令行中輸出,需要的朋友可以參考下
    2023-11-11
  • 利用 Go 語言編寫一個(gè)簡(jiǎn)單的 WebSocket 推送服務(wù)

    利用 Go 語言編寫一個(gè)簡(jiǎn)單的 WebSocket 推送服務(wù)

    這篇文章主要介紹了利用 Go 語言編寫一個(gè)簡(jiǎn)單的 WebSocket 推送服務(wù),需要的朋友可以參考下
    2018-04-04
  • go依賴注入庫(kù)samber/do使用示例講解

    go依賴注入庫(kù)samber/do使用示例講解

    這篇文章主要介紹了go依賴注入庫(kù)samber/do使用,在本文中,我們學(xué)習(xí)了如何使用samber/do在?Go?中提供依賴注入,需要的朋友可以參考下
    2024-02-02

最新評(píng)論

格尔木市| 邹平县| 诸暨市| 江安县| 嘉鱼县| 桃园市| 恭城| 滨海县| 五华县| 梁平县| 青阳县| 汝州市| 石阡县| 宜宾市| 成安县| 明光市| 启东市| 卢龙县| 石柱| 临武县| 平湖市| 景谷| 昌宁县| 九龙城区| 麟游县| 安义县| 紫云| 泰兴市| 福鼎市| 新邵县| 徐州市| 砚山县| 平凉市| 常山县| 疏勒县| 镇赉县| 昆明市| 锦州市| 临湘市| 南溪县| 连江县|