密码技术--国密SM4分组密码算法及Go语言应用
生活随笔
收集整理的這篇文章主要介紹了
密码技术--国密SM4分组密码算法及Go语言应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SM4對稱加密算法
SM4是我國采用的一種分組密碼標準,有國家密碼局與2012年3月21日發布,秘鑰長度和分組長度為128位。
go語言中應用
簡單版本:其函數接口中已實現分組密碼底層接口的調用
func sm4Sample(){src := []byte("這是對稱加密SM4的CBC模式加解密測試")key := []byte("1q2w3e4r5t6y7u8i")cipherText, err := sm4.Sm4Cbc(key, src, true)if err != nil {panic(err)}plainText, err := sm4.Sm4Cbc(key, cipherText, false)if err != nil {panic(err)}flag := bytes.Equal(src, plainText)fmt.Println("SM4快速實現加解密,數據填充標準為pksc7,是否解密成功:", flag) }復雜版本:自己實現數據填充和分組密碼底層接口的調用
package mainimport ("crypto/cipher""github.com/tjfoc/gmsm/sm4" )//明文數據填充 func paddingLastGroup(plainText []byte, blockSize int) []byte {//1.計算最后一個分組中明文后需要填充的字節數padNum := blockSize - len(plainText)%blockSize//2.將字節數轉換為byte類型char := []byte{byte(padNum)}//3.創建切片并初始化newPlain := bytes.Repeat(char, padNum)//4.將填充數據追加到原始數據后newText := append(plainText, newPlain...)return newText }//去掉明文后面的填充數據 func unpaddingLastGroup(plainText []byte) []byte {//1.拿到切片中的最后一個字節length := len(plainText)lastChar := plainText[length-1]//2.將最后一個數據轉換為整數number := int(lastChar)return plainText[:length-number] }func sm4Encrypt (plainText, key []byte) []byte {block, err := sm4.NewCipher(key)if err != nil {panic(err)}paddData := paddingLastGroup(plainText, block.BlockSize())iv := []byte("12345678qwertyui")blokMode := cipher.NewCBCEncrypter(block, iv)cipherText := make([]byte, len(paddData))blokMode.CryptBlocks(cipherText, paddData)return cipherText }func sm4Dectypt(cipherText, key []byte) []byte {block, err := sm4.NewCipher(key)if err != nil {panic(err)}iv := []byte("12345678qwertyui")blockMode := cipher.NewCBCDecrypter(block, iv)blockMode.CryptBlocks(cipherText, cipherText)plainText := unpaddingLastGroup(cipherText)return plainText }func main(){src := []byte("這是對稱加密SM4的CBC模式加解密測試")key := []byte("1q2w3e4r5t6y7u8i")cipherText := sm4Encrypt(src, key)plainText := sm4Dectypt(cipherText, key)flag := bytes.Equal(src, plainText)fmt.Println("解密是否成功:", flag) }總結
以上是生活随笔為你收集整理的密码技术--国密SM4分组密码算法及Go语言应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 密码技术--国密SM3哈希算法及Go语言
- 下一篇: 密码技术--证书及go语言生成自签证书