安全隨筆2:對稱加密應用場景

MD5或者說HASH值是一種不可逆的算法。如果需要從密文還原成明文,那么就需要對稱和非對稱這兩類可逆算法。

首先,簡單介紹下這兩類算法。圖9-1是對稱算法的示意圖:

image

圖9-1 對稱算法

在對稱算法中,首先需要發送方和接收方協定一個密鑰K。K可以是一個密鑰對,但是必須要求加密密鑰和解密密鑰之間能夠互相推算出來。在最簡單也是最常用的對稱算法中,加密和解密共享一個密鑰。上圖中,我們為了簡單期間,使用的就是一個密鑰。密鑰K為了防止被第三方獲取,可以通過一個秘密通道由發送方傳送給接收方。當然,這個秘密通道可以是任何形式,如果覺得可以,你甚至可以寄送一封郵件給對方告訴他密鑰。

對稱加密中明文通過對稱加密成密文,在公開通道中進行傳輸。這個時候,即便第三方截獲了數據,由于他沒有掌握密鑰,也是解密不了密文的。

簡單介紹了對稱加密,現在我們來看非對稱加密。圖9-2是一個非對稱加密的示意圖:

image

圖9-2 非對稱算法

在非對稱算法中,首先得有一個密鑰對,這個密鑰對含有兩部分內容,分別稱作公鑰(PK)和私鑰(SK),公鑰通常用來加密,私鑰則用來解密。在對稱算法中,也講到了可以有兩個密鑰(分為加密和解密密鑰)。但是,對稱算法中的加解密密鑰可以互相轉換,而在非對稱算法中,則不能從公鑰推算出私鑰。所以,我們完全可以將公鑰公開到任何地方。

如上圖所以,發送者用接收方公開出來的公鑰PK進行加密。接受方在收到密文后,再用與公鑰對應的私鑰SK進行解密。同樣,密文可以被截獲,但是由于截獲者只有公鑰,沒有私鑰,他不能進行解密。

對稱算法和非對稱算法各有優缺點。非對稱加密的突出優點是用于解密的密鑰(也就是私鑰)永遠不需要傳遞給對方。但是,它的缺點也很突出:非對稱加密算法復雜,導致加解密速度慢,故只適合小量數據的場合。而對稱加密加解密效率高,系統開銷小,適合進行大數據量的加解密。由于文件一般比較大,這個特性決定了適合它的加密方式最好是對稱加密。下面是一個針對文件的對稱加密的實現:

static?void?Main()
{
????EncryptFile(@"c:\temp.txt", @"c:\tempcm.txt", "123");
????Console.WriteLine("加密成功!");
????DecryptFile(@"c:\tempcm.txt", @"c:\tempm.txt", "123");
????Console.WriteLine("解密成功!");
}
//緩沖區大小
static?int?bufferSize = 128 * 1024;
//密鑰salt
static?byte[] salt = { 134, 216, 7, 36, 88, 164, 91, 227, 174, 76, 191, 197, 192, 154, 200, 248 };
//初始化向量
static?byte[] iv = { 134, 216, 7, 36, 88, 164, 91, 227, 174, 76, 191, 197, 192, 154, 200, 248 };
//初始化并返回對稱加密算法
static?SymmetricAlgorithm CreateRijndael(string?password, byte[] salt)
{
????PasswordDeriveBytes pdb = new?PasswordDeriveBytes(password, salt, "SHA256", 1000);
????SymmetricAlgorithm sma = Rijndael.Create();
????sma.KeySize = 256;
????sma.Key = pdb.GetBytes(32);
????sma.Padding = PaddingMode.PKCS7;
????return?sma;
}
static?void?EncryptFile(string?inFile, string?outFile, string?password)
{
????using?(FileStream inFileStream = File.OpenRead(inFile), outFileStream = File.Open(outFile, FileMode.OpenOrCreate))
????using?(SymmetricAlgorithm algorithm = CreateRijndael(password, salt))
????{
????????algorithm.IV = iv;
????????using?(CryptoStream cryptoStream = new?CryptoStream(outFileStream, algorithm.CreateEncryptor(), CryptoStreamMode.Write))
????????{
????????????byte[] bytes = new?byte[bufferSize];
????????????int?readSize = -1;
????????????while?((readSize = inFileStream.Read(bytes, 0, bytes.Length)) != 0)
????????????{
????????????????cryptoStream.Write(bytes, 0, readSize);
????????????}
????????????cryptoStream.Flush();
????????}
????}
}
static?void?DecryptFile(string?inFile, string?outFile, string?password)
{
????using?(FileStream inFileStream = File.OpenRead(inFile), outFileStream = File.OpenWrite(outFile))
????using?(SymmetricAlgorithm algorithm = CreateRijndael(password, salt))
????{
????????algorithm.IV = iv;
????????using?(CryptoStream cryptoStream = new?CryptoStream(inFileStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read))
????????{
????????????byte[] bytes = new?byte[bufferSize];
????????????int?readSize = -1;
????????????int?numReads = (int)(inFileStream.Length / bufferSize);
????????????int?slack = (int)(inFileStream.Length % bufferSize);
????????????for?(int?i = 0; i < numReads; ++i)
????????????{
????????????????readSize = cryptoStream.Read(bytes, 0, bytes.Length);
????????????????outFileStream.Write(bytes, 0, readSize);
????????????}
????????????if?(slack > 0)
????????????{
????????????????readSize = cryptoStream.Read(bytes, 0, (int)slack);
????????????????outFileStream.Write(bytes, 0, readSize);
????????????}
????????????outFileStream.Flush();
????????}
????}
}

備注:密鑰salt和初始化向量iv

有必要解釋下上面代碼中的密鑰salt和初始化向量iv。

密鑰salt在加密算法中主要被設計用來防止“字典攻擊”。字典攻擊也是一種窮舉的暴力破解法。字典中會假設一定數量的密碼值,攻擊者會嘗試用這些密碼來解密密文。Salt是在密鑰導出之前在密碼末尾引入的隨機字節,它使這類攻擊變得非常困難。

初始化向量IV在加密算法中起到的也是增強破解難度的作用。在加密過程中,如果遇到相同的數據塊,其加密出來的結果也一致,相對就會容易破解。加密算法在加密數據塊的時候,往往會同時使用密碼和上一個數據塊的加密結果。因為要加密的第一個數據塊顯然不存在上一個數據塊,所以這個初始化向量就是被設計用來當作初始數據塊的加密結果。

最后,我們在實際應用中,應該始終考慮使用對稱加密的方式進行文件的加解密工作。當然,如果文件加密后要傳給網絡中的其它接收者,而接收者始終要對文件進行解密的,這意味著密鑰也是始終要傳送給接收者的。這個時候,非對稱加密就可以派上用場了,它可以用于字符串的加解密及安全傳輸場景。關于這一點,我們會在下一個建議中講到。

本文轉自最課程陸敏技博客園博客,原文鏈接:http://www.cnblogs.com/luminji/archive/2011/06/01/2065438.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455851.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455851.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455851.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python安裝多久_python安裝與使用

1、進入官網下載python軟件 python-3.4.4.amd64.msi http://www.python.org/download/ 這個軟件包含三個環境&#xff0c;如下圖&#xff1a;2、雙擊安裝軟件 3、設置環境變量path";C:\Python34"; 4、驗證是否安裝成功 進入cmd中&#xff0c;輸入python,如果出現如下…

HADAMARD變換

for (j0;j<16;j) { for (i0;i<16;i) { M1[ i ][j]imgY_org[img->opix_yj][img->opix_xi]-img->mprr_2[k][j][ i ]; 計算當前宏塊殘差塊 M0[i%4][i/4][j%4][j/4]M1[ i ][j]; } } current_intra_sad_20; //…

CSS中的塊元素,內聯元素,內聯塊元素

塊元素,內聯元素,內聯塊元素 元素就是標簽&#xff0c;布局中常用的有三種標簽&#xff0c;塊元素、內聯元素、內聯塊元素&#xff0c;了解這三種元素的特性&#xff0c;才能熟練的進行頁面布局。 塊元素塊元素&#xff0c;也可以稱為行元素&#xff0c;布局中常用的標簽如&…

django 與 vue 的完美結合

最近接到一個任務&#xff0c;就是用django后端&#xff0c;前段用vue&#xff0c;做一個普通的簡單系統&#xff0c;我就是一搞后端的&#xff0c;聽到vue也是比較震驚&#xff0c;之前壓根沒接觸過vue。看了vue的一些文檔&#xff0c;還有一些項目&#xff0c;先說一下django…

東芝確定半導體重組計劃:保留閃存其他全賣

會計丑聞給日本東芝公司的業績帶來嚴重影響&#xff0c;為了提高盈利&#xff0c;東芝正在對旗下的半導體、個人電腦、白色家電等業務進行一次重大重組。據日經新聞1月23日報道&#xff0c;東芝已經正式制定了芯片業務重組的詳細計劃&#xff0c;除了占據優勢的閃存芯片之外&am…

python畫兩條曲線圖_python繪制多個曲線的折線圖

這篇文章利用的是matplotlib.pyplot.plot的工具來繪制折線圖&#xff0c;這里先給出一個段代碼和結果圖&#xff1a; # -*- coding: UTF-8 -*- import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt #這里導入你自己的數據 #...... #...... #x_axix&a…

5.19匯總

int block_x 8*(b8 & 0x01)4*(b4 & 0x01);int block_y 8*(b8 >> 1)4*(b4 >> 1);請問下老大 這兩句定義是什么意思啊&#xff1f; 帶些值進去算一下就知道了 b8 0 1 2 3b4 0 1 2 3 A&#xff1a;0 ........Er…

oracle 截取字指定的字符串

過濾指定的字符串,一字符串有重復的數據內容,所以需要去掉重復的內容,subst()截取 起止下標;instr()獲取終止下標位置 例如:substr(p.address, 0, instr(p.address, -, 1, 1)-1) ); case when length(substr(p.address, 0, instr(p.address, -, 1, 1)-1) ) 13 then substr(sub…

[django]django模型中auto_now和auto_now_add

示例: update_time models.DateTimeField(更新時間, defaulttimezone.now) create_time models.DateTimeField(創建時間, auto_now_addTrue) auto_now無論是你添加還是修改對象&#xff0c;時間為你添加或者修改的時間。 auto_now_add為添加時的時間&#xff0c;更新對象時不…

2014-7-29-阿里電面-第一輪

等了好久&#xff0c;以為簡歷要掛了&#xff0c;今天最終打來了。面試過程中手抖嘴抖有木有&#xff01; 1、經經常使用的集合類。我回到ArrayList、LinkedList、HashMap&#xff0c;接著問ArrayList、LinkedList的差別&#xff0c;以及分別的適用范圍。看了Java集合類基本上是…

數據分級分類實施指南_運營商行業數據安全治理實踐

建立組織構建大數據安全保障組一、大數據安全保障工作組職責 1、負責制定大數據信息安全策略&#xff0c;明確信息安全目標。 2、組織相關平臺負責人定期召開信息安全會議。 3、負責客戶數據安全突發事件應急方案實施和大數據信息系統日常安全運行管理的組織協調及決策工作。 4…

CSS中的定位

定位 關于定位我們可以使用css的position屬性來設置元素的定位類型&#xff0c;postion的設置項如下&#xff1a; relative 生成相對定位元素&#xff0c;元素所占據的文檔流的位置不變&#xff0c;元素本身相對文檔流的位置進行偏移absolute 生成絕對定位元素&#xff0c;元…

servlet中中文正常顯示,mysql數據庫手動插入中文正常顯示,servlet向mysql中插入中文顯示亂碼...

作者&#xff1a;http://5563447.blog.51cto.com/5553447/1422627 問題是&#xff1a;就是POST請求提交表單數據給servlet,通過JDBC插入Mysql,出現中文亂碼。 解決方式&#xff1a;在url后面加這句 ?useUnicodetrue&characterEncodingutf-8 我的項目&#xff1a; 結果&am…

rtp問題引領匯總

視頻網絡傳輸一定要用rtp嗎&#xff1f; RTP/RTCP有一套很好的反饋機制&#xff0c;通過其可以估算網絡狀況&#xff0c;然后在編碼端進行調整&#xff0c;如網絡繁忙時適當的降低畫面質量&#xff0c;減小碼率等&#xff0c;主要是想通過RTP/RTCP協議實現QoS&#xff01;同時…

Django的信號機制詳解

Django的信號機制詳解 Django提供一種信號機制。其實就是觀察者模式&#xff0c;又叫發布-訂閱(Publish/Subscribe) 。當發生一些動作的時候&#xff0c;發出信號&#xff0c;然后監聽了這個信號的函數就會執行。 Django內置了一些信號&#xff0c;比如&#xff1a; django.…

垃圾回收算法_垃圾回收算法有哪些

垃圾檢測通常通過建立一個根對象的集合以及建立一個從這些根對象開始能夠觸及的對象集合來實現。如果正在執行的程序可以訪問到根對象和某個對象之間存在引用路徑&#xff0c;這個對象就是可觸及的。對于程序來說&#xff0c;根對象總是可以訪問的。從這些根對象開始&#xff0…

不錯的電子書下載網站

為什么80%的碼農都做不了架構師&#xff1f;>>> www.jb51.net 電子書質量不錯,雖然是掃描版的,但是都是高清的. vdisk.weibo.com 網盤, 內容很多! 轉載于:https://my.oschina.net/GMT/blog/1188971

GeoHash核心原理解析

原文地址&#xff1a;http://www.cnblogs.com/LBSer/p/3310455.html geohash for php&#xff1a;附件下載geohash.tar.gz 引子 機機是個好動又好學的孩子&#xff0c;平日里就喜歡拿著手機地圖點點按按來查詢一些好玩的東西。某一天機機到北海公園游玩&#xff0c;肚肚餓了&am…

[轉載]流行視頻格式講解

*. MPEG/.MPG/.DAT MPEG也是Motion Picture Experts Group 的縮寫。這類格式包括了 MPEG-1, MPEG-2 和 MPEG-4在內的多種視頻格式。MPEG-1相信是大家接觸得最多的了&#xff0c;因為目前其正在被廣泛地應用在 VCD 的制作和一些視頻片段下載的網絡應用上面&#xff0c;大部分的…

Ajax相關介紹

ajax是什么? AJAX 是與服務器交換數據并更新部分網頁的藝術&#xff0c;在不重新加載整個頁面的情況下。 AJAX 指異步 JavaScript 及 XML&#xff08;Asynchronous JavaScript And XML&#xff09;。 AJAX 是一種在 2005 年由 Google 推廣開來的編程模式。 AJAX 不是一種新的…