ASP.NET Core實(shí)現(xiàn)AES-GCM加密算法
傳統(tǒng)的加密算法中,一個(gè)主要的問題是無法確認(rèn)密鑰或密文的有效性,也就是說,當(dāng)密鑰或密文錯(cuò)誤時(shí),照樣能解密,但不報(bào)錯(cuò)。還需要我們制定一個(gè)一個(gè)原文的校驗(yàn)算法。
為了簡(jiǎn)化這個(gè)過程,一種方式是使用AEAD加密算法,和傳統(tǒng)的加密相比,解密的時(shí)候會(huì)報(bào)錯(cuò)。省了檢驗(yàn)的過程。AEAD算法中一個(gè)常用的實(shí)現(xiàn)是AES GCM算法,在.net core中已經(jīng)有標(biāo)準(zhǔn)AEAD算法的實(shí)現(xiàn)。
public void Encrypt( byte[] nonce, byte[] plaintext, byte[] ciphertext, byte[] tag, byte[] associatedData = null);
這個(gè)接口第一感覺就是需要的參數(shù)比較多,首先構(gòu)造函數(shù)中就需要傳入一個(gè)key,然后加密函數(shù)就需要傳入5個(gè)參數(shù)。為了理解這些參數(shù)的作用,首先去掉原文和密文的參數(shù), 然后去掉可選的associatedData,主要就是這三個(gè)參數(shù)了:
key
nonce
tag
他們都是字節(jié)數(shù)組類型,這里附上簡(jiǎn)單的解釋:
key
密鑰,長(zhǎng)度范圍必須是16,24,32(128, 192, 256bits)之一,加密和解密相同,是雙方約定的。
nonce
初始向量,一般也寫作IV,它也可以看做秘鑰的一部分,加密和解密都需要傳入,主要用于防止攻擊者掌握密鑰后對(duì)密文的破解。
nonce它在加密的時(shí)候通過某種算法生成,一般是生成的隨機(jī)數(shù),并通過某種方式發(fā)送給解密方。長(zhǎng)度范圍為AesGcm.NonceByteSizes
tag
接收生成的身份驗(yàn)證標(biāo)記的字節(jié)數(shù)組,取值范圍為AesGcm.TagByteSizes。
tag是在加密的過程中生成,解密的時(shí)候需要使用,一般認(rèn)為是密文的一部分。
有了上面的基礎(chǔ)后,下面就簡(jiǎn)單的演示一下:
var key = new byte[16]; //取值范圍為 16, 24, or 32 bytes (128, 192, or 256 bits). var nonce = new byte[12]; //取值范圍為 AesGcm.NonceByteSizes var tag = new byte[12]; //取值范圍為 AesGcm.TagByteSizes var plain = new byte[1_000_000]; //原文 var cliper = new byte[plain.Length]; //密文 var plain2 = new byte[plain.Length]; //解密后的原文緩沖區(qū) _rnd.NextBytes(plain); //生成原文 _rnd.NextBytes(key); //生成秘鑰 _rnd.NextBytes(nonce); //生成秘鑰2 using var aes = new AesGcm(key); aes.Encrypt(nonce, plain, cliper, tag); using var aes2 = new AesGcm(key); aes2.Decrypt(nonce, cliper, tag, plain2);
在實(shí)際使用中,還需要指定一個(gè)協(xié)議或其他方式傳遞noce和tag。
到此這篇關(guān)于.NET實(shí)現(xiàn)AES-GCM加密的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net中的窗體身份驗(yàn)證(最簡(jiǎn)單篇)
這篇文章主要介紹了最簡(jiǎn)單的asp.net中的窗體身份驗(yàn)證,詳細(xì)敘述了asp.net的窗體身份驗(yàn)證步驟,感興趣的小伙伴們可以參考一下2015-09-09asp.net Cookie跨域、虛擬目錄等設(shè)置方法
Cookie跨域、虛擬目錄等設(shè)置方法,需要的朋友可以參考下。2009-11-11解析.netcore項(xiàng)目中IStartupFilter使用教程
netcore項(xiàng)目中有些服務(wù)是在通過中間件來通信的,比如orleans組件,今天通過實(shí)例代碼給大家介紹下netcore項(xiàng)目中IStartupFilter使用教程,感興趣的朋友一起看看吧2021-11-11ASP.NET MVC4 HtmlHelper擴(kuò)展類,實(shí)現(xiàn)分頁功能
本文主要做了一個(gè)HtmHelper類的分頁擴(kuò)展函數(shù),方便在視圖中調(diào)用,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。2016-03-03.net core部署到windows服務(wù)上的完整步驟
這篇文章主要給大家介紹了關(guān)于.net core部署到windows服務(wù)上的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09asp.net計(jì)算一串?dāng)?shù)字中每個(gè)數(shù)字出現(xiàn)的次數(shù)
計(jì)算一串?dāng)?shù)字中每個(gè)數(shù)字出現(xiàn)的次數(shù),可以這樣子,先判斷輸入的字符串是不是數(shù)字組成,還是否包含有其它字符2012-05-05