C#中如何实现AES算法加密(aes,开发技术)

时间:2024-05-05 14:21:51 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

先上效果图

文件和加密文件之间的转换。

C#中如何实现AES算法加密

先添加辅助类

publicclassAES_EnorDecrypt{//定义默认密钥privatestaticbyte[]_aesKeyByte={0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};privatestaticstring_aesKeyStr=Encoding.UTF8.GetString(_aesKeyByte);///<summary>///随机生成密钥,默认密钥长度为32,不足在加密时自动填充空格///</summary>///<paramname="n">密钥长度</param>///<returns></returns>publicstaticstringGetIv(intn){strings="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";char[]arrChar=newchar[s.Length];for(inti=0;i<s.Length;i++){arrChar[i]=Convert.ToChar(s.Substring(i,1));}StringBuildernum=newStringBuilder();Randomrnd=newRandom(DateTime.Now.Millisecond);for(inti=0;i<n;i++){num.Append(arrChar[rnd.Next(0,arrChar.Length)].ToString());}_aesKeyByte=Encoding.UTF8.GetBytes(num.ToString());return_aesKeyStr=Encoding.UTF8.GetString(_aesKeyByte);}///<summary>///AES加密,针对文本类文件///</summary>///<paramname="Data">被加密的明文</param>///<paramname="Key">密钥</param>///<paramname="Vector">密钥向量</param>///<returns>密文</returns>publicstaticstringAESEncrypt(stringData,stringKey,stringVector){byte[]plainBytes=Encoding.UTF8.GetBytes(Data);byte[]bKey=newbyte[32];Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)),bKey,bKey.Length);byte[]bVector=newbyte[16];Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)),bVector,bVector.Length);byte[]Cryptograph=null;//加密后的密文RijndaelAes=Rijndael.Create();try{using(MemoryStreamMemory=newMemoryStream()){//把内存流对象包装成加密流对象using(CryptoStreamEncryptor=newCryptoStream(Memory,Aes.CreateEncryptor(bKey,bVector),CryptoStreamMode.Write)){Encryptor.Write(plainBytes,0,plainBytes.Length);Encryptor.FlushFinalBlock();Cryptograph=Memory.ToArray();}}}catch{Cryptograph=null;}returnConvert.ToBase64String(Cryptograph);}///<summary>///AES加密,任意文件///</summary>///<paramname="Data">被加密的明文</param>///<paramname="Key">密钥</param>///<paramname="Vector">密钥向量</param>///<returns>密文</returns>publicstaticbyte[]AESEncrypt(byte[]Data,stringKey,stringVector){byte[]bKey=newbyte[32];Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)),bKey,bKey.Length);byte[]bVector=newbyte[16];Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)),bVector,bVector.Length);byte[]Cryptograph=null;//加密后的密文RijndaelAes=Rijndael.Create();try{using(MemoryStreamMemory=newMemoryStream()){//把内存流对象包装成加密流对象using(CryptoStreamEncryptor=newCryptoStream(Memory,Aes.CreateEncryptor(bKey,bVector),CryptoStreamMode.Write)){Encryptor.Write(Data,0,Data.Length);Encryptor.FlushFinalBlock();Cryptograph=Memory.ToArray();}}}catch{Cryptograph=null;}returnCryptograph;}///<summary>///AES解密,针对文本文件///</summary>///<paramname="Data">被解密的密文</param>///<paramname="Key">密钥</param>///<paramname="Vector">密钥向量</param>///<returns>明文</returns>publicstaticstringAESDecrypt(stringData,stringKey,stringVector){byte[]encryptedBytes=Convert.FromBase64String(Data);byte[]bKey=newbyte[32];Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)),bKey,bKey.Length);byte[]bVector=newbyte[16];Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)),bVector,bVector.Length);byte[]original=null;//解密后的明文RijndaelAes=Rijndael.Create();try{using(MemoryStreamMemory=newMemoryStream(encryptedBytes)){//把内存流对象包装成加密对象using(CryptoStreamDecryptor=newCryptoStream(Memory,Aes.CreateDecryptor(bKey,bVector),CryptoStreamMode.Read)){//明文存储区using(MemoryStreamoriginalMemory=newMemoryStream()){byte[]Buffer=newbyte[1024];intreadBytes=0;while((readBytes=Decryptor.Read(Buffer,0,Buffer.Length))>0){originalMemory.Write(Buffer,0,readBytes);}original=originalMemory.ToArray();}}}}catch{original=null;}returnEncoding.UTF8.GetString(original);}///<summary>///AES解密,任意文件///</summary>///<paramname="Data">被解密的密文</param>///<paramname="Key">密钥</param>///<paramname="Vector">密钥向量</param>///<returns>明文</returns>publicstaticbyte[]AESDecrypt(byte[]Data,stringKey,stringVector){byte[]bKey=newbyte[32];Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)),bKey,bKey.Length);byte[]bVector=newbyte[16];Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)),bVector,bVector.Length);byte[]original=null;//解密后的明文RijndaelAes=Rijndael.Create();try{using(MemoryStreamMemory=newMemoryStream(Data)){//把内存流对象包装成加密对象using(CryptoStreamDecryptor=newCryptoStream(Memory,Aes.CreateDecryptor(bKey,bVector),CryptoStreamMode.Read)){//明文存储区using(MemoryStreamoriginalMemory=newMemoryStream()){byte[]Buffer=newbyte[1024];intreadBytes=0;while((readBytes=Decryptor.Read(Buffer,0,Buffer.Length))>0){originalMemory.Write(Buffer,0,readBytes);}original=originalMemory.ToArray();}}}}catch{original=null;}returnoriginal;}}

AES是块加密,块的长度是16字节,如果原文不到16的字节,就会进行填充至16个字节。

开始实现

界面布局

C#中如何实现AES算法加密

textbox1为文件位置,textbox2为密码。

C#中如何实现AES算法加密

C#中如何实现AES算法加密

C#中如何实现AES算法加密

设置好后

publicpartialclassFormAes:Form{#region属性privatestaticstring_aesKeyVector="q2T_=R/*33vc";#endregionpublicFormAes(){InitializeComponent();}///<summary>///选择文件///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidtextBox1_Click(objectsender,EventArgse){OpenFileDialogdialog=newOpenFileDialog();dialog.Multiselect=true;//该值确定是否可以选择多个文件dialog.Title="请选择文件夹";dialog.Filter="所有文件(*.*)|*.*";if(dialog.ShowDialog()==System.Windows.Forms.DialogResult.OK){textBox1.Text=dialog.FileName;}}///<summary>///加密///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton1_Click(objectsender,EventArgse){if(string.IsNullOrWhiteSpace(textBox1.Text.Trim())||string.IsNullOrWhiteSpace(textBox2.Text.Trim()))return;backgroundWorker1.RunWorkerAsync();}///<summary>///解密///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton2_Click(objectsender,EventArgse){if(string.IsNullOrWhiteSpace(textBox1.Text.Trim())||string.IsNullOrWhiteSpace(textBox2.Text.Trim()))return;backgroundWorker2.RunWorkerAsync();}///<summary>///后台线程执行的方法///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbackgroundWorker1_DoWork(objectsender,DoWorkEventArgse){stringKeyVector=_aesKeyVector;//密钥向量stringpath=Path.GetDirectoryName(textBox1.Text);stringname=Path.GetFileName(textBox1.Text);name+=".En";#region加密FileStreamsr=newFileStream(textBox1.Text,FileMode.Open,FileAccess.Read);FileStreamsw=newFileStream(path+"\\"+name,FileMode.Create,FileAccess.Write);if(sr.Length>50*1024*1024)//如果文件大于50M,采取分块加密,按50MB读写{byte[]mybyte=newbyte[52428800];//每50MB加密一次intnumBytesRead=52428800;//每次加密的流大小longleftBytes=sr.Length;//剩余需要加密的流大小longreadBytes=0;//已经读取的流大小//每50MB加密后会变成50MB+16Bbyte[]encrpy=newbyte[52428816];while(true){if(leftBytes>numBytesRead){sr.Read(mybyte,0,mybyte.Length);encrpy=AES_EnorDecrypt.AESEncrypt(mybyte,textBox2.Text,KeyVector);sw.Write(encrpy,0,encrpy.Length);leftBytes-=numBytesRead;readBytes+=numBytesRead;backgroundWorker1.ReportProgress((int)(readBytes*100/sr.Length));}else//重新设定读取流大小,避免最后多余空值{byte[]newByte=newbyte[leftBytes];sr.Read(newByte,0,newByte.Length);byte[]newWriteByte;newWriteByte=AES_EnorDecrypt.AESEncrypt(newByte,textBox2.Text,KeyVector);sw.Write(newWriteByte,0,newWriteByte.Length);readBytes+=leftBytes;backgroundWorker1.ReportProgress((int)(readBytes*100/sr.Length));break;}}}else{byte[]mybyte=newbyte[sr.Length];sr.Read(mybyte,0,(int)sr.Length);mybyte=AES_EnorDecrypt.AESEncrypt(mybyte,textBox2.Text,KeyVector);sw.Write(mybyte,0,mybyte.Length);backgroundWorker1.ReportProgress(100);}sr.Close();sw.Close();#endregion}privatevoidbackgroundWorker1_ProgressChanged(objectsender,ProgressChangedEventArgse){progressBar1.Value=e.ProgressPercentage;}///<summary>///执行完成时触发///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbackgroundWorker1_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){MessageBox.Show("加密成功!");}///<summary>///后台线程执行的方法///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbackgroundWorker2_DoWork(objectsender,DoWorkEventArgse){try{stringKeyVector=_aesKeyVector;//密钥向量stringpath=Path.GetDirectoryName(textBox1.Text);stringname=Path.GetFileName(textBox1.Text);if(name.EndsWith(".En")){name=name.Remove(name.Length-3,3);}#region解密FileStreamsr=newFileStream(textBox1.Text,FileMode.Open,FileAccess.Read);FileStreamsw=newFileStream(path+"\\"+name,FileMode.Create,FileAccess.Write);if(sr.Length>50*1024*1024)//如果文件大于50M,采取分块解密,按50MB读写{byte[]mybyte=newbyte[52428816];//解密缓冲区50MB+16Bbyte[]decrpt=newbyte[52428800];//解密后的50MBintnumBytesRead=52428816;//每次解密的流大小longleftBytes=sr.Length;//剩余需要解密的流大小longreadBytes=0;//已经读取的流大小try{while(true){if(leftBytes>numBytesRead){sr.Read(mybyte,0,mybyte.Length);decrpt=AES_EnorDecrypt.AESDecrypt(mybyte,textBox2.Text,KeyVector);sw.Write(decrpt,0,decrpt.Length);leftBytes-=numBytesRead;readBytes+=numBytesRead;backgroundWorker2.ReportProgress((int)(readBytes*100/sr.Length));}else//重新设定读取流大小,避免最后多余空值{byte[]newByte=newbyte[leftBytes];sr.Read(newByte,0,newByte.Length);byte[]newWriteByte;newWriteByte=AES_EnorDecrypt.AESDecrypt(newByte,textBox2.Text,KeyVector);sw.Write(newWriteByte,0,newWriteByte.Length);readBytes+=leftBytes;backgroundWorker2.ReportProgress((int)(readBytes*100/sr.Length));break;}}}catch{sr.Close();sw.Close();File.Delete(path+"\\"+name);e.Cancel=true;}sr.Close();sw.Close();}else{byte[]mybyte=newbyte[(int)sr.Length];sr.Read(mybyte,0,(int)sr.Length);try{mybyte=AES_EnorDecrypt.AESDecrypt(mybyte,textBox2.Text,KeyVector);sw.Write(mybyte,0,mybyte.Length);backgroundWorker2.ReportProgress(100);}catch{sr.Close();sw.Close();File.Delete(path+"\\"+name);e.Cancel=true;}sr.Close();sw.Close();}#endregion}catch{e.Cancel=true;}}privatevoidbackgroundWorker2_ProgressChanged(objectsender,ProgressChangedEventArgse){progressBar1.Value=e.ProgressPercentage;}///<summary>///执行完成时触发///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbackgroundWorker2_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){if(e.Cancelled){MessageBox.Show("解密失败\n密码错误或加密文件被篡改,无法解密");}else{MessageBox.Show("解密成功!");}}}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:C#中如何实现AES算法加密的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:怎么使用C#最小二乘法拟合曲线成直线下一篇:

10 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18