<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在專案開發中,我們經常會遇到需要使用對稱金鑰加密的場景,比如使用者端呼叫介面時,引數包含手機號、身份證號或銀行卡號等。
對稱金鑰加密是一種加密方式,其中只有一個金鑰用於加密和解密資料。通過對稱加密進行通訊的實體必須共用該金鑰,以便可以在解密過程中使用它。這種加密方法與非對稱加密不同,非對稱加密使用一對金鑰(一個公鑰和一個私鑰)來加密和解密資料。
常見的對稱金鑰加密演演算法有 AES (Advanced Encryption Standard),DES (Data Encryption Standard) 等,它們都屬於分組密碼。
因為基於目前計算機的處理能力,可以很快破解 DES 演演算法,所以 DES 目前已經很少被使用。
AES 是目前最常用的對稱金鑰加密演演算法,最初稱為 Rijndael。AES 密碼每個分組大小是 128 bits,但是它具有三種金鑰長度,分別是 AES-128、AES-192 和 AES-256。需要注意的是,在 Golang 標準庫提供的介面中,僅支援 AES-128(16 byte),實際上 AES-128 的加密強度已經足夠安全。
本文我們主要介紹 Golang 中怎麼使用 AES 演演算法的對稱金鑰加密。
AES 演演算法的分組模式包含 ECB、CBC、CFB、OFB 和 CTR,其中 ECB 和 CBC 使用比較多,雖然 ECB 比 CBC 簡單,效率高,但是它的密文有規律,比較容易破解,所以,更推薦大家使用 CBC,本文我們主要介紹使用最多的 CBC 分組模式。
需要注意的是,ECB 和 CBC 分組模式的最後一個分組,需要填充滿 16 byte,關於填充模式,限於篇幅,本文不展開介紹,但會提供填充資料和取消填充資料的程式碼。
Golang 實現 AES 對稱加密演演算法主要分為以下幾個步驟:
加密步驟:
範例程式碼:
func AESCbcEncrypt(secretKey, src string) string { key := []byte(secretKey) if len(key) > 16 { key = key[:16] } plaintext := []byte(src) block, err := aes.NewCipher(key) if err != nil { panic(err) } blockSize := block.BlockSize() plaintext = Padding(plaintext, blockSize) if len(plaintext)%aes.BlockSize != 0 { panic("plaintext is not a multiple of the block size") } ciphertext := make([]byte, aes.BlockSize+len(plaintext)) iv := ciphertext[:aes.BlockSize] if _, err := io.ReadFull(rand.Reader, iv); err != nil { panic(err) } mode := cipher.NewCBCEncrypter(block, iv) mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext) return base64.StdEncoding.EncodeToString(ciphertext) }
解密步驟:
範例程式碼:
func AESCbcDecrypt(secretKey, src string) string { key := []byte(secretKey) ciphertext, _ := base64.StdEncoding.DecodeString(src) block, err := aes.NewCipher(key) if err != nil { panic(err) } if len(ciphertext) < aes.BlockSize { panic("ciphertext too short") } iv := ciphertext[:aes.BlockSize] ciphertext = ciphertext[aes.BlockSize:] if len(ciphertext)%aes.BlockSize != 0 { panic("ciphertext is not a multiple of the block size") } mode := cipher.NewCBCDecrypter(block, iv) mode.CryptBlocks(ciphertext, ciphertext) ciphertext = UnPadding(ciphertext) return string(ciphertext) }
填充範例程式碼:
func Padding(plainText []byte, blockSize int) []byte { padding := blockSize - len(plainText)%blockSize char := []byte{byte(padding)} newPlain := bytes.Repeat(char, padding) return append(plainText, newPlain...) }
取消填充範例程式碼:
func UnPadding(plainText []byte) []byte { length := len(plainText) lastChar := plainText[length-1] padding := int(lastChar) return plainText[:length-padding] }
需要注意的是,初始化向量(IV)是隨機的,細心的讀者朋友們可能已經發現,使用隨機 IV ,同一份明文,每次加密得到的密文也都不同。但是,加密和解密使用的 IV 必須相同。
我們介紹了對稱金鑰加密的概念,並簡單介紹了 AES 演演算法,最終我們還提供了 Golang 怎麼使用 AES 演演算法的 CBC 分組模式實現對稱金鑰加密的範例程式碼,感興趣的讀者朋友,可以自行編寫其它分組模式的程式碼。
到此這篇關於Go語言使用對稱加密的範例詳解的文章就介紹到這了,更多相關Go語言對稱加密內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45