這都可以?(aes加密后長度太長可以縮短嗎)aes每次加密結果都不一樣,AES字節(jié)數(shù)組加密解密流程,曼菲秀祛除妊娠紋是真是假,
目錄:
1.aes加密后長度變化
2.aes加密會重復嗎
3.aes加密結果不一樣
4.aes加密des
5.aes加密后都是字符嗎
6.aes加密用法
7.aes加密后出現(xiàn)加號
8.aes加密key有什么限制
9.aes加密解密速度
10.aes256加密后的數(shù)據(jù)長度
1.aes加密后長度變化
AES類時微軟MSDN中最常用的加密類,微軟官網(wǎng)也有例子,參考鏈接:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.aes?view=netframework-4.8
2.aes加密會重復嗎
但是這個例子并不好用,限制太多,通用性差李敏鎬整容,實際使用中,我遇到的更多情況需要是這樣:1、輸入一個字節(jié)數(shù)組,經(jīng)AES加密后,直接輸出加密后的字節(jié)數(shù)組2、輸入一個加密后的字節(jié)數(shù)組,經(jīng)AES解密后,直接輸出原字節(jié)數(shù)組。
3.aes加密結果不一樣
對于我這個十八流業(yè)余愛好者來說,AES我是以用為主的,所以具體的AES是怎么運算的,我其實并不關心,我更關心的是AES的處理流程結果恰恰這一方面,網(wǎng)上的信息差強人意,看了網(wǎng)上不少的帖子,但感覺都沒有說完整說透,而且很多帖子有錯誤。
4.aes加密des
因此,我自己繪制了一張此種方式下的流程圖:
5.aes加密后都是字符嗎
字符串在加密后,長度會變長如果數(shù)組長度為16的倍數(shù),則加密后的數(shù)組長度=原長度+16;如李敏鎬整容果數(shù)組長度不為16的倍數(shù),則加密后的數(shù)組長度=16倍數(shù)向上取整按照此流程圖進行了核心代碼的編寫,驗證方法AesCoreSingleTest既是依照此流程的產(chǎn)物,實例化類AesCoreSingle后調(diào)用此方法即可驗證。
6.aes加密用法
至于類中的異步方法EnOrDecryptFileAsync,則是專門用于文件加解密的處理,此異步方法參考自《C# 6.0學習筆記》(周家安 著)最后的示例,這本書寫得真棒但我也有疑惑,為什么周家安的異步方法,就不用考慮字符串加密前后長度變化的問題呢?。
7.aes加密后出現(xiàn)加號
classAesSingleCore{/// /// 使用用戶口令,生成符李敏鎬整容合AES標準的key和iv /// /// 用戶輸入的口令 。
8.aes加密key有什么限制
/// 返回包含密鑰和向量的元組 private(byte[]Key,byte[]IV)GenerateKeyAndIV(stringpassword){byte[]
9.aes加密解密速度
key=newbyte[32];byte[]iv=newbyte[16];byte[]hash=default;if(string.IsNullOrWhiteSpace(password))thrownew
10.aes256加密后的數(shù)據(jù)長度
Argument李敏鎬整容Exception("必須輸入口令!");using(SHA384sha=SHA384.Create()){byte[]buffer=Encoding.UTF8.GetBytes(password
);hash=sha.ComputeHash(buffer);}//用SHA384的原因:生成的384位哈希值正好被分成兩段使用(32+16)*8=384 Array.Copy(hash,0,key,0
,32);//生成256位密鑰(32*8=256) Array.Copy(hash,32,iv,0,16);//生成128位向量(16*8=128) re李敏鎬整容turn(Key:key,IV:iv);}public
byte[]EncryptByte(byte[]buffer,stringpassword){byte[]encrypted;using(Aesaes=Aes.Create()){//設定密鑰和向量 (
aes.Key,aes.IV)=GenerateKeyAndIV(password);//設定運算模式和填充模式 aes.Mode=CipherMode.CBC;//默認 aes.Padding=PaddingMode
.PKCS7;//默認 //創(chuàng)建加密器對象(加解密方法不同處僅李敏鎬整容僅這一句話) varencryptor=aes.CreateEncryptor(aes.Key,aes.IV);using(MemoryStream
msEncrypt=newMemoryStream()){using(CryptoStreamcsEncrypt=newCryptoStream(msEncrypt,encryptor,CryptoStreamMode
.Write))//選擇Write模式 {csEncrypt.Write(buffer,0,buffer.Length);//對原數(shù)組加密并寫入流中 csEncrypt.FlushFin李敏鎬整容alBlock();
//使用Write模式需要此句,但Read模式必須要有 encrypted=msEncrypt.ToArray();//從流中寫入數(shù)組(加密之后,數(shù)組變長,詳見方法AesCoreSingleTest內(nèi)容) 。
}}}returnencrypted;/* * 如果要將加密后的數(shù)組轉(zhuǎn)換為加密后的字符串顯示到文本框中,建議用法 * string s = Convert.ToBase64String(encrypted); 。
*/}publicbyte[]DecryptByte(byte[]buffer,李敏鎬整容stringpassword){/* * 如果要將顯示到文本框中的加密后的字符串還原為加密后的數(shù)組,建議用法。
* byte[] buffer = Convert.FromBase64String(encrypted); */byte[]decrypted;using
(Aesaes=Aes.Create()){//設定密鑰和向量 (aes.Key,aes.IV)=GenerateKeyAndIV(password);//設定運算模式和填充模式 aes.Mode=CipherMode
.CBC;//默認 aes.Padd李敏鎬整容ing=PaddingMode.PKCS7;//默認 //創(chuàng)建解密器對象(加解密方法不同處僅僅這一句話) vardecryptor=aes.CreateDecryptor
(aes.Key,aes.IV);using(MemoryStreammsDecrypt=newMemoryStream(buffer)){using(CryptoStreamcsDecrypt=new
CryptoStream(msDecrypt,decryptor,CryptoStreamMode.Read))//選擇Read模式 {byte[]buffer_T=newbyte李敏鎬整容[buffer.Length
];/*--s1:創(chuàng)建臨時數(shù)組,用于包含可用字節(jié)+無用字節(jié)--*/inti=csDecrypt.Read(buffer_T,0,buffer.Length);/*--s2:對加密數(shù)組進行解密,并通過i確定實際多少字節(jié)可用--*/
//csDecrypt.FlushFinalBlock();//使用Read模式不能有此句,但write模式必須要有 decrypted=newbyte[i];/*--s3:創(chuàng)建只容納可用字節(jié)的數(shù)組--*/。
Array.Copy(buffer_T,0,decrypted,0,i);/*--s4:從bufferT拷貝出可用字節(jié)到李敏鎬整容decrypted--*/}}returndecrypted;}}publicstatic
voidAesCoreSingleTest(strings_in,stringpassword)//驗證加密解密模塊正確性方法 {byte[]buffer=Encoding.UTF8.GetBytes(
s_in);AesSingleCoreaesCore=newAesSingleCore();byte[]buffer_ed=aesCore.EncryptByte(buffer,password);byte
[]buffer_ed2=aesCore.DecryptByte(buffer_ed,李敏鎬整容password);strings=Encoding.UTF8.GetString(buffer_ed2);string
s2="下列字符串\n"+s+\n+$"原buffer長度 → {buffer.Length}, 加密后buffer_ed長度 → {buffer_ed.Length}, 解密后buffer_ed2長度 → {buffer_ed2.Length}"
;MessageBox.Show(s2);varfilePath=@"D:\FireFox書簽\abc.txt";vardirectoryName=System.IO.Path.GetDirectoryName
(filePath);李敏鎬整容varfileNameWE=System.IO.Path.GetFileNameWithoutExtension(filePath);varfileExtension=System
.IO.Path.GetExtension(filePath);varfilename=fileNameWE+fileExtension;stringfilepath_new=System.IO.Path
.Combine(directoryName,filename);MessageBox.Show(filepath_new);/* 字符串在加密前后的變化(默認CipherMode.CBC運算模式, PaddingM李敏鎬整容ode.PKCS7填充模式)
* 1、如果數(shù)組長度為16的倍數(shù),則加密后的數(shù)組長度=原長度+16 如對于下列字符串 D:\User\Documents\Administrator - DOpus Config - 2020-06-301.ocb
使用UTF8編碼轉(zhuǎn)化為字節(jié)數(shù)組后, 原buffer → 64, 加密后buffer_ed → 80, 解密后buffer_ed2 → 64 * 2、如果數(shù)組長度不為16的倍數(shù),則加密后的數(shù)組長度=16倍數(shù)向上取整
如對于下列字符串 D:\User\Documents\cc_202李敏鎬整容00630_113921.reg 使用UTF8編碼轉(zhuǎn)化為字節(jié)數(shù)組后
原buffer → 40, 加密后buffer_ed → 48, 解密后buffer_ed2 → 40 參考文獻: 1-《AES補位填充PaddingMode.Zeros模式》http://blog.chinaunix.net/uid-29641438-id-5786927.html
2-《關于PKCS5Padding與PKCS7Padding的區(qū)別》https://www.cnblogs.com/midea0978/articles/1437257.html
3-《AES-128 E李敏鎬整容CB 加密有感》http://blog.sina.com.cn/s/blog_60cf051301015orf.html */
}publicenumActionDirection//該枚舉說明是加密還是解密 {EnCrypt,//加密 DeCrypt//解密 }/***---聲明CancellationTokenSource對象--***/
privateCancellationTokenSourcects;//using System.Threading;引用 publicTaskEnOrDecryptFileAs李敏鎬整容ync(StreaminStream
,longinStream_Seek,StreamoutStream,longoutStream_Seek,stringpassword,ActionDirectiondirection,IProgress
progress){/***---實例化CancellationTokenSource對象--***/cts?.Dispose();//cts為空,不動作,cts不為空,執(zhí)行Dispose cts
=newCancellationTokenSource();Taskmytask=newTask(()=>{EnOrDecryptFile(inS李敏鎬整容tream,inStream_Seek,outStream
,outStream_Seek,password,direction,progress);},cts.Token,TaskCreationOptions.LongRunning);mytask.Start
();returnmytask;}publicvoidCancel_EnOrDecryptFileAsync(){/***---執(zhí)行取消操作---***/cts?.Cancel();}privatevoid
EnOrDecryptFile(StreaminStream,longinStream_Seek,StreamoutStream,l李敏鎬整容ongoutStream_Seek,stringpassword,ActionDirection
direction,IProgressprogress){if(inStream==null||outStream==null)thrownewArgumentException("輸入流與輸出流是必須的"
);//--調(diào)整流的位置(通常是為了避開文件頭部分) inStream.Seek(inStream_Seek,SeekOrigin.Begin);outStream.Seek(outStream_Seek
,SeekOrigin.Begin);//用于記錄處理進度 l李敏鎬整容ongtotal_Length=inStream.Length-inStream_Seek;longtotalread_Length=0;//初始化報告進度
progress.Report(0);using(Aesaes=Aes.Create()){//設定密鑰和向量 (aes.Key,aes.IV)=GenerateKeyAndIV(password);//創(chuàng)建加密器解密器對象(加解密方法不同處僅僅這一句話)
ICryptoTransformcryptor;if(direction==ActionDirection.EnCrypt)cryptor=aes.CreateEncryp李敏鎬整容tor(aes.Key,aes
.IV);elsecryptor=aes.CreateDecryptor(aes.Key,aes.IV);using(CryptoStreamcstream=newCryptoStream(outStream
,cryptor,CryptoStreamMode.Write)){byte[]buffer=newbyte[512*1024];//每次讀取512kb的數(shù)據(jù) intreadLen=0;while((readLen
=inStream.Read(buffer,0,buffer.Length))!=0){// 向加密流寫入數(shù)據(jù) cs李敏鎬整容tream.Write(buffer,0,readLen);totalread_Length
+=readLen;//匯報處理進度 if(progress!=null){longper=100*totalread_Length/total_Length;progress.Report(Convert
.ToInt32(per));}}}}}}