GO語言實(shí)現(xiàn)AES-CFB加密的操作方法
這里為了使用方便,實(shí)現(xiàn)代碼不作為一個(gè)函數(shù)而是作為一個(gè)包,這樣在后面的代碼中也可以進(jìn)行復(fù)用。
包和導(dǎo)入
package encrypt import ( "crypto/aes" // 提供 AES 加密算法實(shí)現(xiàn) "crypto/cipher" // 提供加密算法接口和模式(如 CFB) "crypto/rand" // 提供生成隨機(jī)數(shù)功能 "encoding/base64" // 提供 Base64 編碼和解碼 "fmt" // 格式化 I/O "io" // 基本 I/O 接口 )
package encrypt: 定義該文件屬于 encrypt 包。
各種導(dǎo)入用于提供不同功能,如 AES 算法、CFB 模式、Base64 編碼等。
Encrypt 函數(shù)
// Encrypt 對(duì)明文進(jìn)行AES-CFB加密 func Encrypt(plaintext []byte, key string) (string, error) { block, err := aes.NewCipher([]byte(key)) if err != nil { return "", err } iv := make([]byte, aes.BlockSize) if _, err := io.ReadFull(rand.Reader, iv); err != nil { return "", err } stream := cipher.NewCFBEncrypter(block, iv) ciphertext := make([]byte, len(plaintext)) stream.XORKeyStream(ciphertext, plaintext) // 合并 IV 和密文 result := append(iv, ciphertext...) // 使用 Base64 編碼返回 return base64.StdEncoding.EncodeToString(result), nil }
- Encrypt 函數(shù)接收明文和用于 AES 加密的密鑰。
- aes.NewCipher([]byte(key)): 利用提供的密鑰生成一個(gè) AES 塊密碼。
- iv(初始化向量)是 AES 塊大小(16 字節(jié))的隨機(jī)數(shù),確保同樣的明文每次加密結(jié)果不同。
- 使用 cipher.NewCFBEncrypter 創(chuàng)建 CFB 加密
- stream.XORKeyStream(ciphertext, plaintext): 用流加密對(duì)明文進(jìn)行加密,結(jié)果保存在 ciphertext 中。
- 將 iv 和 ciphertext 合并為一個(gè)切片,然后使用 Base64 編碼生成字符串
Decrypt 函數(shù)
// Decrypt 對(duì)密文進(jìn)行AES-CFB解密 func Decrypt(ciphertextBase64 string, key string) ([]byte, error) { ciphertext, err := base64.StdEncoding.DecodeString(ciphertextBase64) if err != nil { return nil, err } block, err := aes.NewCipher([]byte(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:] stream := cipher.NewCFBDecrypter(block, iv) plaintext := make([]byte, len(ciphertext)) stream.XORKeyStream(plaintext, ciphertext) return plaintext, nil }
- Decrypt 函數(shù)接收 Base64 編碼的密文和密鑰。 將 Base64 密文解碼成字節(jié)切片。 類似加密過程,生成 AES 塊密碼。
- 驗(yàn)證密文長(zhǎng)度,確保其大于 AES 塊大小。 從解碼后的密文中提取 iv,其余部分為實(shí)際密文。 使用cipher.NewCFBDecrypter 函數(shù)創(chuàng)建 CFB 解密流。 解密密文,得出明文。
注意事項(xiàng)
- 使用 CFB 模式不需要明文填充。 密鑰長(zhǎng)度應(yīng)為 16, 24 或 32 字節(jié),以匹配 AES-128, AES-192 或AES-256。 隨機(jī) iv 很重要,每次加密都使用新的 iv 增強(qiáng)安全性。
到此這篇關(guān)于GO語言實(shí)現(xiàn)AES-CFB加密的文章就介紹到這了,更多相關(guān)GO語言 AES-CFB加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總
這篇文章主要8為大家介紹了夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-10-10Go語言sync包與鎖實(shí)現(xiàn)限制線程對(duì)變量的訪問
本文主要介紹了Go語言sync包與鎖實(shí)現(xiàn)限制線程對(duì)變量的訪問,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04go通過編碼縮短字符串的長(zhǎng)度實(shí)現(xiàn)方法步驟
這篇文章主要為大家介紹了go通過編碼縮短字符串的長(zhǎng)度實(shí)現(xiàn)方法步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01