日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理解AES加密解密的使用方法

發布時間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解AES加密解密的使用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很多人對于AES加密并不是很了解,導致互相之間進行加密解密困難。
本文用簡單的方式來介紹AES在使用上需要的知識,而不涉及內部算法。最后給出例子來幫助理解AES加密解密的使用方法。

AES的麻煩

相比于其他加密,AES加密似乎模式很多,包括ECB、CBC等等等等,每個模式又包括IV參數和Padding參數,并且,不同語言對AES加密的庫設計有區別。這些導致AES加密在不同人之間聯調會很麻煩。

AES屬于塊加密

不難理解,對越長的字符串進行加密,代價越大,所以通常對明文進行分段,然后對每段明文進行加密,最后再拼成一個字符串。塊加密的一個要面臨的問題就是如何填滿最后一塊?所以這就是PADDING的作用,使用各種方式填滿最后一塊字符串,所以對于解密端,也需要用同樣的PADDING來找到最后一塊中的真實數據的長度。

加密模式

AES分為幾種模式,比如ECB,CBC,CFB等等,這些模式除了ECB由于沒有使用IV而不太安全,其他模式差別并沒有太明顯,大部分的區別在IV和KEY來計算密文的方法略有區別。具體可參考 wiki說明
另外,AES分為AES128,AES256等,表示期待秘鑰的長度,比如AES256秘鑰的長度應該是256/8的32字節,一些語言的庫會進行自動截取,讓人以為任何長度的秘鑰都可以。而這其實是有區別的。

IV的作用

IV稱為初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV,既然IV看起來和key一樣,卻還要多一個IV的目的,對于每個塊來說,key是不變的,但是只有第一個塊的IV是用戶提供的,其他塊IV都是自動生成。
IV的長度為16字節。超過或者不足,可能實現的庫都會進行補齊或截斷。但是由于塊的長度是16字節,所以一般可以認為需要的IV是16字節。

PADDING

AES塊加密說過,PADDING是用來填充最后一塊使得變成一整塊,所以對于加密解密兩端需要使用同一的PADDING模式,大部分PADDING模式為PKCS5, PKCS7, NOPADDING。

加密解密端

所以,在設計AES加密的時候

  • 對于加密端,應該包括:加密秘鑰長度,秘鑰,IV值,加密模式,PADDING方式。
  • 對于解密端,應該包括:解密秘鑰長度,秘鑰,IV值,解密模式,PADDING方式。

Nodejs實現

這里使用Nodejs的cryptojs庫模擬AES加密解密

var crypto = require("crypto");var algorithm='aes-256-cbc'; var key = new Buffer("aaaabbbbccccddddeeeeffffgggghhhh"); var iv = new Buffer("1234567812345678"); function encrypt(text){var cipher=crypto.createCipheriv(algorithm,key,iv);cipher.update(text,"utf8");return cipher.final("base64"); } function decrypt(text){var cipher=crypto.createDecipheriv(algorithm,key,iv);cipher.update(text,"base64");return cipher.final("utf8"); }var text="ni你好hao"; var encoded=encrypt(text) console.log(encoded); console.log(decrypt(encoded))

結果如下

WfH4hzIc3dc0pjxa9V/RgQ== ni你好hao

nodejs自帶的并不能自動配置padding等參數,演示起來并不方便。
于是使用另一個框架crypto-js的nodejs庫實現和之前完全相同的版本

var CryptoJS = require("crypto-js"); var key ="aaaabbbbccccddddeeeeffffgggghhhh"; var iv = "1234567812345678";function encrypt(text){return CryptoJS.AES.encrypt(text,CryptoJS.enc.Utf8.parse(key),{iv:CryptoJS.enc.Utf8.parse(iv),mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7}) }function decrypt(text){var result = CryptoJS.AES.decrypt(text,CryptoJS.enc.Utf8.parse(key),{iv:CryptoJS.enc.Utf8.parse(iv),mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7})return result.toString(CryptoJS.enc.Utf8) }var text="ni你好hao"; var encoded=encrypt(text) console.log(encoded.toString()); console.log(decrypt(encoded))

現在aes的參數都變成可配置的,接下來驗證一下之前對AES的理解。

  • 改變IV的長度,發現當IV大于16字節的時候,不管16字節之后的是什么,都不影響加密結果,應該是種自動截取機制(nodejs原生庫IV不是16字節,就會報錯)
  • 改變IV的長度,當IV小于16字節,還可以成功加密,可能是自動補齊機制
  • 加密IV和解密IV不同的時候,并不影響解密是否成功,但是解密的結果有差別,比如將解密的IV變成1234567813345678,則解密結果變為ni你好h`o
    修改padding,加密解密的padding換成NoPadding,發現解密之后生成utf8字符串出錯
  • 經過多次嘗試,加密為Pkcs7和ZeroPadding時,加密后的字符串變化顯著,這時解密用任何padding模式,都可以成功解密。

ni你好hao,經過Pkcs7后,輸出為

WfH4hzIc3dc0pjxa9V/RgQ==

nopadding后,輸出為

OtSNypfx1SF6C2E=

zeropadding后,輸出為

OtSNypfx1SF6C2GfyXMidA==

Pkcs7的結果和其他結果相差很大,很難相信其padding是補充最后一塊
有趣的是Pkcs7的結果和zeropadding的結果通過同樣的解密設置,能解出同樣的字符串ni你好hao

總結

AES加密解密的秘鑰有一對,一個是IV一個是KEY,并且他們的長度都有嚴格要求。
Padding的作用似乎不只是補齊最后,如果自己什么都對,但是加密失敗,可以嘗試不同Padding

總結

以上是生活随笔為你收集整理的理解AES加密解密的使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。