高清视频在线观看免费播放器-伊人日本-色九月综合-18禁止看的免费污网站-免费观看性行为视频的网站-天天碰天天操-久久精品国产欧美日韩99热-中文字幕在线视频不卡-国产偷人妻精品一区二区在线-国内精品久-伊人影院在线看-密臀av一区-久久综合五月丁香久久激情-福利一区福利二区-gg国产精品国内免费观看-国产精品 高清 尿 小便 嘘嘘

當前位置: 首頁 >推薦 > 正文

保護數據隱私:深入探索Golang中的SM4加密解密算法

2023-06-28 01:42:33 來源:程序員升職加薪之旅
前言

最近做的項目對安全性要求比較高,特別強調:系統不能涉及MD5、SHA1、RSA1024、DES高風險算法。

那用什么嘞?甲方:建議用國產密碼算法SM4。


(資料圖)

擅長敏捷開發(CV大法)的我,先去GitHub找了開源項目、又去網絡上找了一些教程,但是或多或少都有些問題:

比如golang.org/x/crypto/sm4無法安裝編譯比如C站爛大街的SM4教程,不能解決數據填充的問題,超過16位就解密失敗了比如如何封裝成通用的方法,供系統進行調用更多就是復制粘貼了SM4的定義,很抽象。

于是我花了2天時間研究SM4的原理和應用,解決了上面這些問題,整理這篇文章分享給大家,讓大家能少踩坑。

我會按照下面的順序分享這篇文章,方便大家更好的理解,如果你就是喜歡拿來主義(敏捷開發),可以直接copy底部的示例代碼,快速上手使用即可。

文章目錄SM4的優勢IV是什么?SM4加密的方式和原理SM4的各種工作模式對比直接可用的「代碼示例」核心方法的源碼解析總結回顧1. SM4的優勢

相比于其他加密算法,SM4加密算法具有以下幾個優勢:

高安全性:SM4是一種對稱加密算法,采用128位密鑰長度,具有較高的安全性和抗攻擊性。它經過了廣泛的安全性分析和評估,并通過了多個密碼學標準的驗證。高效性:SM4算法的加密和解密速度較快,適用于對大量數據進行加密和解密的場景。它在硬件和軟件實現上都具有高效性能。簡單性:SM4算法的實現相對簡單,代碼量較小,易于理解和使用。它的設計目標之一是提供一種易于實現和部署的加密算法。標準化:SM4算法是中國國家密碼管理局發布的密碼算法標準,得到了廣泛的應用和認可。它已成為國際上公認的密碼算法之一。廣泛支持:SM4算法在各種平臺和編程語言中都有支持和實現,包括Go、Java、C/C++等。它可以在不同的系統和環境中進行跨平臺的應用和部署。可擴展性:SM4算法支持不同的工作模式和填充方式,可以根據具體需求進行靈活配置。它可以與其他密碼算法結合使用,提供更高級別的安全保護。

小小的總結一下:SM4加密算法在安全性、高效性、簡單性、標準化和廣泛支持等方面具有優勢,適用于各種數據保護和加密應用場景。它是一種可靠的加密算法選擇。

2.IV是什么?

我在學習的時候看到IV就蒙了,所以有必要先說清楚IV的概念:

Initialization Vector(IV)是一種在密碼學中使用的初始值。它是一個固定長度的隨機數或者隨機生成的值,用于在加密算法中初始化密碼算法的狀態。

在加密過程中,IV的作用是引入隨機性和唯一性,以增加加密的安全性。它與密鑰一起用于初始化密碼算法的內部狀態,確保每次加密操作都產生不同的輸出,即使相同的明文使用相同的密鑰進行加密。

IV的長度和使用方式取決于具體的加密算法和應用場景。在使用加密算法時,IV通常需要與密文一起傳輸給解密方,以便解密方能夠正確還原明文。

需要注意的是:IV本身不需要保密,可以與密文一起傳輸。然而,為了確保加密的安全性,IV應該是隨機生成的,并且每次加密操作都應該使用不同的IV。這樣可以防止密碼分析者通過觀察加密結果的模式來破解密鑰或者明文。

3. SM4加密的方式和原理

SM4加密算法是一種對稱加密算法,采用分組密碼的方式對數據進行加密。

下面是SM4加密的方式和原理的簡要說明:

密鑰擴展:SM4使用128位的密鑰,首先對密鑰進行擴展,生成32個子密鑰,用于后續的加密輪操作。初始輪:將明文分為4個字節的分組,與第一個子密鑰進行異或操作。加密輪:SM4加密算法共進行32輪加密操作。每輪操作包括以下步驟:

字節替換:使用S盒進行字節替換。

行移位:對每個分組進行行移位操作。

列混淆:對每個分組進行列混淆操作。

輪密鑰加:將當前輪的子密鑰與分組進行異或操作。

最終輪:在最后一輪加密操作中,不進行列混淆操作,只進行字節替換、行移位和輪密鑰加操作。輸出:經過32輪加密操作后,得到加密后的密文。

SM4加密算法的安全性和強度主要來自于其復雜的輪函數和密鑰擴展過程。它具有較高的安全性和抗攻擊性,并且在實際應用中得到了廣泛的應用和認可。

需要注意的是:SM4加密算法的安全性還依賴于密鑰的保密性和隨機性。在使用SM4進行加密時,應確保使用足夠強度的密鑰,并采取適當的密鑰管理和保護措施。

4.SM4的各種工作模式對比

SM4加密算法可以使用不同的工作模式,其中包括CBC(Cipher Block Chaining)模式。

我使用的是CBC模式,下面和大家分享一下CBC模式與其他模式的對比:

CBC模式(Cipher Block Chaining):特點:每個明文塊與前一個密文塊進行異或操作,然后再進行加密。初始塊使用初始化向量(IV)。優點:具有較好的安全性,能夠隱藏明文的模式和重復性。缺點:加密過程是串行的,不適合并行處理。ECB模式(Electronic Codebook):特點:將每個明文塊獨立加密,相同的明文塊會得到相同的密文塊。優點:簡單、并行處理效率高。缺點:不能隱藏明文的模式和重復性,不適合加密大量重復的數據。CFB模式(Cipher Feedback):特點:將前一個密文塊作為輸入來加密當前的明文塊,可以實現流密碼的功能。優點:能夠處理不定長的數據流,適用于實時加密和流式傳輸。缺點:加密過程是串行的,不適合并行處理。OFB模式(Output Feedback):特點:將前一個密文塊作為輸入來生成密鑰流,然后與明文塊進行異或操作,可以實現流密碼的功能。優點:能夠處理不定長的數據流,適用于實時加密和流式傳輸。缺點:加密過程是串行的,不適合并行處理。CTR模式(Counter):特點:使用一個計數器來生成密鑰流,然后與明文塊進行異或操作,可以實現流密碼的功能。優點:能夠處理不定長的數據流,適用于實時加密和流式傳輸。并行處理效率高,適合硬件實現。缺點:需要保證計數器的唯一性,否則會導致密鑰流的重復。對比總結:CBC模式和ECB模式相比,CBC模式具有更好的安全性,能夠隱藏明文的模式和重復性,而ECB模式無法隱藏這些信息。CFB模式、OFB模式和CTR模式都是流密碼模式,適用于不定長的數據流加密,能夠實現實時加密和流式傳輸。它們的主要區別在于密鑰流的生成方式和加密過程的并行性。CFB模式和OFB模式的加密過程是串行的,不適合并行處理,而CTR模式的加密過程可以并行處理,適合硬件實現。

總的來說:CBC模式在安全性方面較好,能夠隱藏明文的模式和重復性。而流密碼模式(CFB、OFB和CTR)適用于不定長數據流的加密,能夠實現實時加密和流式傳輸,其中CTR模式具有較好的并行處理性能。選擇合適的加密模式取決于具體的應用需求和安全性要求。

5. 直接可用的「代碼示例」

我一直認為可以通過復制粘貼,直接跑通的示例代碼才是好代碼。

沒錯,我的代碼示例就是這樣,并且關鍵代碼都寫好了注釋:

package mainimport ( "bytes" "crypto/cipher" "encoding/hex" "fmt" "github.com/tjfoc/gmsm/sm4")// SM4加密func SM4Encrypt(data string) (result string, err error) { //字符串轉byte切片 plainText := []byte(data) //建議從配置文件中讀取秘鑰,進行統一管理 SM4Key := "Uv6tkf2M3xYSRuFv" //todo 注意:iv需要是隨機的,進一步保證加密的安全性,將iv的值和加密后的數據一起返回給外部 SM4Iv := "04TzMuvkHm_EZnHm" iv := []byte(SM4Iv) key := []byte(SM4Key) //實例化sm4加密對象 block, err := sm4.NewCipher(key) if err != nil {  panic(err) } //明文數據填充 paddingData := paddingLastGroup(plainText, block.BlockSize()) //聲明SM4的加密工作模式 blockMode := cipher.NewCBCEncrypter(block, iv) //為填充后的數據進行加密處理 cipherText := make([]byte, len(paddingData)) //使用CryptBlocks這個核心方法,將paddingData進行加密處理,將加密處理后的值賦值到cipherText中 blockMode.CryptBlocks(cipherText, paddingData) //加密結果使用hex轉成字符串,方便外部調用 cipherString := hex.EncodeToString(cipherText) return cipherString, nil}// SM4解密 傳入string 輸出stringfunc SM4Decrypt(data string) (res string, err error) { //秘鑰 SM4Key := "Uv6tkf2M3xYSRuFv" //iv是Initialization Vector,初始向量, SM4Iv := "04TzMuvkHm_EZnHm" iv := []byte(SM4Iv) key := []byte(SM4Key) block, err := sm4.NewCipher(key) if err != nil {  panic(err) } //使用hex解碼 decodeString, err := hex.DecodeString(data) if err != nil {  return "", err } //CBC模式 優點:具有較好的安全性,能夠隱藏明文的模式和重復性。 缺點:加密過程是串行的,不適合并行處理。 blockMode := cipher.NewCBCDecrypter(block, iv) //下文有詳解這段代碼的含義 blockMode.CryptBlocks(decodeString, decodeString) //去掉明文后面的填充數據 plainText := unPaddingLastGroup(decodeString) //直接返回字符串類型,方便外部調用 return string(plainText), nil}// 明文數據填充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 main() { //待加密的數據 模擬18位的身份證號 plainText := "131229199907097219" //SM4加密 decrypt, err := SM4Encrypt(plainText) if err != nil {  return } fmt.Printf("sm4加密結果:%s\n", decrypt) //cipherString := hex.EncodeToString(cipherText) //fmt.Printf("sm4加密結果轉成字符串:%s\n", cipherString) //SM4解密 sm4Decrypt, err := SM4Decrypt(decrypt) if err != nil {  return } fmt.Printf("plainText:%s\n", sm4Decrypt) flag := plainText == sm4Decrypt fmt.Println("解密是否成功:", flag)}

運行結果如下:

6. 核心方法的源碼解析

細心的小伙伴應該又發現,(或者通過你真實的敲代碼一定能發現。

在加密和解密部分有一個CryptBlocks()方法,我們來解析一下這段源碼:

// CryptBlocks encrypts or decrypts a number of blocks. The length of // src must be a multiple of the block size. Dst and src must overlap // entirely or not at all. // // If len(dst) < len(src), CryptBlocks should panic. It is acceptable // to pass a dst bigger than src, and in that case, CryptBlocks will // only update dst[:len(src)] and will not touch the rest of dst. // // Multiple calls to CryptBlocks behave as if the concatenation of // the src buffers was passed in a single run. That is, BlockMode // maintains state and does not reset at each CryptBlocks call. CryptBlocks(dst, src []byte)
翻譯翻譯

CryptBlocks方法用于加密或解密多個數據塊。src的長度必須是塊大小的倍數。dst和src必須完全重疊或完全不重疊。

如果len(dst) < len(src),CryptBlocks方法應該引發panic。允許傳遞比src更大的dst,此時CryptBlocks只會更新dst[:len(src)],不會觸及dst的其余部分。

在這段代碼注釋中,dst表示目標緩沖區,用于存儲加密或解密后的結果。src表示源緩沖區,包含要加密或解密的數據。這兩個緩沖區可以是相同的內存區域,也可以是不同的內存區域。CryptBlocks方法會將src中的數據進行加密或解密,并將結果存儲在dst中。

需要注意的是,dst和src的長度必須是塊大小的倍數,否則CryptBlocks方法可能會引發panic。如果dst的長度小于src的長度,CryptBlocks方法只會更新dst的前len(src)個字節,并不會修改dst的其余部分。

此外,CryptBlocks方法可以多次調用,多次調用的效果相當于將所有src緩沖區的數據連接在一起,然后進行加密或解密。這意味著BlockMode會保持狀態,并且不會在每次CryptBlocks調用時重置。

如果你看注釋翻譯理解起來還是比較抽象的話,我換個方式介紹一下:

用我的話來說

在SM4加密中,CryptBlocks()方法是用于加密或解密多個數據塊的方法。它是SM4算法中的一個核心函數。

具體來說,CryptBlocks()方法接受一個源數據緩沖區(src)和一個目標數據緩沖區(dst),并對源數據進行加密或解密操作,將結果存儲在目標數據緩沖區中。

在加密過程中,CryptBlocks()方法會將源數據分成多個數據塊,然后對每個數據塊進行加密操作,并將結果存儲在目標數據緩沖區中。加密過程中使用的密鑰和其他參數由SM4算法的實現確定。

在解密過程中,CryptBlocks()方法會對源數據緩沖區中的數據塊進行解密操作,并將解密后的結果存儲在目標數據緩沖區中。

需要注意的是:CryptBlocks()方法要求源數據緩沖區和目標數據緩沖區的長度必須是SM4算法的塊大小的倍數。否則,可能會引發錯誤或產生不可預測的結果。

CryptBlocks()方法是SM4加密算法中用于加密或解密多個數據塊的關鍵方法,它實現了SM4算法的核心功能。

7. 總結回顧

我之前也寫過一篇解密解密的文章,歡迎大家閱讀指教:保障網絡請求數據傳輸的安全性、一致性和防篡改:對稱加密與非對稱加密的結合

相信你讀了這篇文章能對SM4加密有個整體理解,通過我在文章中提供的示例代碼可以快速跑通加密和解密流程。我還帶著你分析了CryptBlocks()源碼的作用。

本文轉載自微信公眾號「 程序員升級打怪之旅」,作者「王中陽Go」,可以通過以下二維碼關注。

轉載本文請聯系「 程序員升級打怪之旅」公眾號。

標簽:

返回頂部
高清视频在线观看免费播放器-伊人日本-色九月综合-18禁止看的免费污网站-免费观看性行为视频的网站-天天碰天天操-久久精品国产欧美日韩99热-中文字幕在线视频不卡-国产偷人妻精品一区二区在线-国内精品久-伊人影院在线看-密臀av一区-久久综合五月丁香久久激情-福利一区福利二区-gg国产精品国内免费观看-国产精品 高清 尿 小便 嘘嘘
  • <cite id="ecweg"><pre id="ecweg"></pre></cite>
    <rt id="ecweg"><acronym id="ecweg"></acronym></rt>
  • <rt id="ecweg"></rt>
    亚洲综合激情五月| 免费成人午夜视频| 手机在线免费观看毛片| 99re在线视频免费观看| 国产免费一区二区三区视频| www.欧美日本| 色免费在线视频| 超碰在线免费观看97| 男人天堂a在线| 欧美日韩在线一| 国模吧无码一区二区三区| 三上悠亚av一区二区三区| 国产区二区三区| 免费av不卡在线| 成人免费aaa| www.天天射.com| 精产国品一二三区| 成人免费在线视频播放| 亚洲视频在线观看一区二区三区| 在线免费黄色网| 欧美aⅴ在线观看| 黄色手机在线视频| 欧美 另类 交| 日韩欧美在线播放视频| www.com黄色片| www.av片| 国产在线播放观看| ijzzijzzij亚洲大全| 国产一区二区四区| 国产又黄又猛又粗| 精品视频在线观看一区二区| 人妻内射一区二区在线视频| 吴梦梦av在线| www.亚洲天堂网| 亚洲爆乳无码精品aaa片蜜桃| 国产视频九色蝌蚪| 成人午夜免费剧场| 中文字幕 欧美日韩| 日韩精品一区二区在线视频| 大香煮伊手机一区| 好男人www社区| 奇米影视亚洲色图| 911av视频| 中文字幕 91| 欧美综合在线观看视频| 屁屁影院ccyy国产第一页| 91制片厂毛片| 欧美精品一区二区三区免费播放| 日韩a级黄色片| 欧美一级免费在线| 色悠悠久久综合网| 欧美牲交a欧美牲交aⅴ免费下载| 日韩中文字幕在线不卡| 国产免费裸体视频| 国产黑丝在线视频| 午夜免费福利在线| 亚洲少妇第一页| 精品国产成人av在线免| 少妇av一区二区三区无码| 青草全福视在线| 法国空姐在线观看免费| 91香蕉视频在线观看视频| 亚洲一级免费在线观看| 午夜免费一区二区| 一区二区三区入口| 中文字幕一区二区三区四区在线视频| 97在线播放视频| 国产精品免费入口| 国模杨依粉嫩蝴蝶150p| 男女高潮又爽又黄又无遮挡| 国产成人精品视频免费看| 2022亚洲天堂| 婷婷六月天在线| 91日韩精品视频| 欧美乱做爰xxxⅹ久久久| www.日本在线播放| 92看片淫黄大片一级| 天天天干夜夜夜操| 超碰在线免费观看97| 国产精品一色哟哟| 国语对白做受xxxxx在线中国| 欧美xxxxx在线视频| av噜噜在线观看| 精品视频在线观看一区| 四虎永久在线精品无码视频| www.这里只有精品| 国产黑丝在线视频| 亚洲 高清 成人 动漫| 波多结衣在线观看| 欧美与动交zoz0z| 1024av视频| 中文字幕免费高| 欧美老熟妇喷水| 亚洲一级片免费观看| 日本韩国欧美在线观看| 亚洲免费一级视频| 日韩精品一区在线视频| 色天使在线观看| 少妇高清精品毛片在线视频| 国产在线观看中文字幕| 秋霞无码一区二区| 国产传媒免费观看| www.亚洲天堂网| 大地资源网在线观看免费官网| 91猫先生在线| wwwwww欧美| 少妇高潮流白浆| 香蕉视频禁止18| 欧美aⅴ在线观看| 亚洲 欧美 综合 另类 中字| 亚洲午夜精品一区| 狠狠躁狠狠躁视频专区| 男的插女的下面视频| 高清av免费看| 无码人妻精品一区二区三区66| 天天想你在线观看完整版电影免费| 亚洲不卡视频在线| 69堂免费视频| 久激情内射婷内射蜜桃| 国产精品av免费观看| 天天色天天综合网| 一区二区在线免费看| 国产精品第12页| 黄色片久久久久| 人妻少妇被粗大爽9797pw| 国产婷婷一区二区三区| 日韩在线观看a| 日韩一区二区高清视频| 手机看片日韩国产| 大桥未久一区二区三区| 992kp免费看片| 偷拍盗摄高潮叫床对白清晰| 老司机av福利| av日韩在线看| 精品这里只有精品| 成人观看免费完整观看| 久久精品一区二| 国产一二三四在线视频| 国模私拍视频在线观看| 日本激情综合网| 在线视频一二区| 日韩精品一区二区免费| 欧美日韩性生活片| 91激情视频在线| 久久99爱视频| 香蕉视频免费版| 成人在线观看你懂的| 日韩免费毛片视频| 色戒在线免费观看| 久久国产精品免费观看| 欧美日韩一道本| 天天视频天天爽| 久久久久久久久影视| 免费成人午夜视频| 日本超碰在线观看| 国产av熟女一区二区三区| 18岁视频在线观看| japanese在线视频| 国产成人黄色片| 成人手机视频在线| 精品中文字幕av| 黄色高清视频网站| 999香蕉视频| 少妇久久久久久被弄到高潮| 日韩中文字幕免费在线| 91视频 - 88av| 久久撸在线视频| 日韩在线视频在线观看| 午夜影院免费版| 可以免费观看av毛片| 国产又粗又猛又爽又黄的网站 | 黄色a级三级三级三级| 99热久久这里只有精品| 九九热99视频| 日日摸日日碰夜夜爽av| 热久久最新网址| 人人爽人人爽av| 女性隐私黄www网站视频| www.18av.com| 亚洲国产精品影视| 色婷婷成人在线| 欧美在线观看视频网站| 男女超爽视频免费播放| 秋霞在线一区二区| 久久久久久久久久一区二区| 成年人黄色片视频| 免费观看日韩毛片| 男人草女人视频| 国产资源第一页| 麻豆中文字幕在线观看| 亚洲天堂伊人网| 中文字幕55页| 自拍偷拍视频在线| 日韩人妻精品一区二区三区| 又色又爽又黄视频| 亚洲天堂网站在线| 欧美一级小视频| 久久久国内精品| av免费观看大全| 亚洲一级免费观看|