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

golang中使用aes加密的過程

 更新時間:2025年11月11日 10:07:38   作者:WTDhOZM3W  
AES(Advanced Encryption Standard)是一種對稱加密算法,適用于加密敏感數(shù)據(jù),本文給大家介紹golang中使用aes加密的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧

AES 加密基礎(chǔ)

AES(Advanced Encryption Standard)是一種對稱加密算法,適用于加密敏感數(shù)據(jù)。Golang 的 crypto/aes 包提供了 AES 加密的實現(xiàn),通常結(jié)合 crypto/cipher 包使用。

生成密鑰

AES 密鑰長度需為 16(AES-128)、24(AES-192)或 32(AES-256)字節(jié)。

key := []byte("32-byte-long-key-here-1234567890") // AES-256 密鑰

加密數(shù)據(jù)

使用 CBC 模式(需填充)和隨機 IV(初始化向量):

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "io"
)
func encrypt(plaintext []byte, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    // 填充數(shù)據(jù)到塊大小
    plaintext = pkcs7Pad(plaintext, aes.BlockSize)
    // 生成隨機 IV
    ciphertext := make([]byte, aes.BlockSize+len(plaintext))
    iv := ciphertext[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return nil, err
    }
    // 加密
    mode := cipher.NewCBCEncrypter(block, iv)
    mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)
    return ciphertext, nil
}
// PKCS7 填充
func pkcs7Pad(data []byte, blockSize int) []byte {
    padding := blockSize - len(data)%blockSize
    padText := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(data, padText...)
}

解密數(shù)據(jù)

解密時需提取 IV 并移除填充:

func decrypt(ciphertext []byte, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    if len(ciphertext) < aes.BlockSize {
        return nil, fmt.Errorf("ciphertext too short")
    }
    iv := ciphertext[:aes.BlockSize]
    ciphertext = ciphertext[aes.BlockSize:]
    // 解密
    mode := cipher.NewCBCDecrypter(block, iv)
    mode.CryptBlocks(ciphertext, ciphertext)
    // 移除填充
    ciphertext = pkcs7Unpad(ciphertext)
    return ciphertext, nil
}
// PKCS7 去填充
func pkcs7Unpad(data []byte) []byte {
    length := len(data)
    unpadding := int(data[length-1])
    return data[:(length - unpadding)]
}

使用 GCM 模式(推薦)

GCM(Galois/Counter Mode)提供認(rèn)證加密,無需手動填充:

func encryptGCM(plaintext []byte, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    gcm, err := cipher.NewGCM(block)
    if err != nil {
        return nil, err
    }
    nonce := make([]byte, gcm.NonceSize())
    if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
        return nil, err
    }
    return gcm.Seal(nonce, nonce, plaintext, nil), nil
}
func decryptGCM(ciphertext []byte, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    gcm, err := cipher.NewGCM(block)
    if err != nil {
        return nil, err
    }
    nonceSize := gcm.NonceSize()
    if len(ciphertext) < nonceSize {
        return nil, fmt.Errorf("ciphertext too short")
    }
    nonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:]
    return gcm.Open(nil, nonce, ciphertext, nil)
}

注意事項

  • 密鑰管理:密鑰需安全存儲,避免硬編碼。
  • IV/Nonce:每次加密需生成隨機 IV 或 Nonce,禁止重復(fù)使用。
  • 性能:GCM 模式適合高性能場景,CBC 需手動處理填充。

通過上述方法,可在 Golang 中實現(xiàn) AES 加密/解密功能,根據(jù)需求選擇 CBC 或 GCM 模式。

到此這篇關(guān)于golang中使用aes加密的文章就介紹到這了,更多相關(guān)golang使用aes加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言的方法接受者類型用值類型還是指針類型?

    Go語言的方法接受者類型用值類型還是指針類型?

    這篇文章主要介紹了Go語言的方法接受者類型用值類型還是指針類型?本文還同時講解了關(guān)于接受者的命名方式,需要的朋友可以參考下
    2014-10-10
  • Go語言中常見的坑以及高性能編程技巧分享

    Go語言中常見的坑以及高性能編程技巧分享

    代碼的穩(wěn)健性、高性能、可讀性是我們每一位coder必須去追求的目標(biāo),本文結(jié)合Go語言的特性做了相關(guān)總結(jié),感興趣的小伙伴可以了解一下
    2023-06-06
  • Golang sync.Pool的源碼解析

    Golang sync.Pool的源碼解析

    Pool是用于存放臨時對象的集合,這些對象是為了后續(xù)的使用,以達(dá)到復(fù)用對象的效果,本文將詳解解析sync.Pool 源碼,需要的朋友可以參考下
    2023-05-05
  • Go 高效截取字符串的一些思考

    Go 高效截取字符串的一些思考

    這篇文章主要介紹了Go 高效截取字符串的一些思考,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 淺析Golang切片截取功能與C++的vector區(qū)別

    淺析Golang切片截取功能與C++的vector區(qū)別

    這篇文章主要介紹了Golang中切片的截取功能與C++中的vector有什么區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • Golang 如何解析和生成json

    Golang 如何解析和生成json

    這篇文章主要介紹了Golang 如何解析和生成json,幫助大家更好的理解和學(xué)習(xí)golang,感興趣的朋友可以了解下
    2020-09-09
  • Go語言中范圍range的使用小結(jié)

    Go語言中范圍range的使用小結(jié)

    range是Go里用于遍歷數(shù)據(jù)結(jié)構(gòu)的語法糖,本文主要介紹了Go語言的范圍range的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • 淺談Go Channel 高級實踐

    淺談Go Channel 高級實踐

    這篇文章主要介紹了淺談Go Channel 高級實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Go語言Seeker接口與文件斷點續(xù)傳實戰(zhàn)教程

    Go語言Seeker接口與文件斷點續(xù)傳實戰(zhàn)教程

    Go語言的io包中Seeker接口為大文件處理或需要隨機訪問的場景提供了強大的支持,本文通過具體案例詳細(xì)介紹了Seeker接口的應(yīng)用,包括隨機訪問大文件、斷點續(xù)傳等場景,以及如何使用Seeker接口進行有效的文件讀寫操作
    2024-10-10
  • go?mod的使用方法小結(jié)

    go?mod的使用方法小結(jié)

    本文主要介紹了go?mod的使用方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論

漳平市| 密山市| 林州市| 黑水县| 新闻| 广德县| 崇阳县| 九龙城区| 深泽县| 汤原县| 南溪县| 万安县| 陆丰市| 凌源市| 临夏县| 鲜城| 江城| 买车| 海口市| 合江县| 宁武县| 名山县| 常山县| 大埔区| 莆田市| 弥勒县| 四平市| 陆川县| 颍上县| 五台县| 阜阳市| 威信县| 清河县| 镇巴县| 耒阳市| 盐城市| 安康市| 壶关县| 茶陵县| 扎兰屯市| 韩城市|