對(duì)稱(chēng)加密與非對(duì)稱(chēng)加密

(一)對(duì)稱(chēng)加密(Symmetric Cryptography)

對(duì)稱(chēng)加密是最快速谷市、最簡(jiǎn)單的一種加密方式元咙,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key),這種方法在密碼學(xué)中叫做對(duì)稱(chēng)加密算法躬审。對(duì)稱(chēng)加密有很多種算法奏夫,由于它效率很高薛匪,所以被廣泛使用在很多加密協(xié)議的核心當(dāng)中月匣。

對(duì)稱(chēng)加密通常使用的是相對(duì)較小的密鑰钻洒,一般小于256 bit。因?yàn)槊荑€越大锄开,加密越強(qiáng)素标,但加密與解密的過(guò)程越慢。如果你只用1 bit來(lái)做這個(gè)密鑰萍悴,那黑客們可以先試著用0來(lái)解密头遭,不行的話(huà)就再用1解寓免;但如果你的密鑰有1 MB大,黑客們可能永遠(yuǎn)也無(wú)法破解计维,但加密和解密的過(guò)程要花費(fèi)很長(zhǎng)的時(shí)間袜香。密鑰的大小既要照顧到安全性,也要照顧到效率享潜,是一個(gè)trade-off困鸥。

2000年10月2日,美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究所(NIST--American National Institute of Standards and Technology)選擇了Rijndael算法作為新的高級(jí)加密標(biāo)準(zhǔn)(AES--Advanced Encryption Standard)剑按。.NET中包含了Rijndael算法疾就,類(lèi)名叫RijndaelManaged,下面舉個(gè)例子艺蝴。

加密過(guò)程:

private string myData = "hello";

private string myPassword = "OpenSesame";

private byte[] cipherText;

private byte[] salt = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0 };

private void mnuSymmetricEncryption_Click(object sender, RoutedEventArgs e)

{

var key = new Rfc2898DeriveBytes(myPassword, salt);

// Encrypt the data.

var algorithm = new RijndaelManaged();

algorithm.Key = key.GetBytes(16);

algorithm.IV = key.GetBytes(16);

var sourceBytes = new System.Text.UnicodeEncoding().GetBytes(myData);

using (var sourceStream = new MemoryStream(sourceBytes))

using (var destinationStream = new MemoryStream())

using (var crypto = new CryptoStream(sourceStream, algorithm.CreateEncryptor(), CryptoStreamMode.Read))

{

moveBytes(crypto, destinationStream);

cipherText = destinationStream.ToArray();

}

MessageBox.Show(String.Format("Data:{0}{1}Encrypted and Encoded:{2}", myData, Environment.NewLine, Convert.ToBase64String(cipherText)));

}

private void moveBytes(Stream source, Stream dest)

{

byte[] bytes = new byte[2048];

var count = source.Read(bytes, 0, bytes.Length);

while (0 != count)

{

dest.Write(bytes, 0, count);

count = source.Read(bytes, 0, bytes.Length);

}

}

解密過(guò)程:

private void mnuSymmetricDecryption_Click(object sender, RoutedEventArgs e)

{

if (cipherText == null)

{

MessageBox.Show("Encrypt Data First!");

return;

}

var key = new Rfc2898DeriveBytes(myPassword, salt);

// Try to decrypt, thus showing it can be round-tripped.

var algorithm = new RijndaelManaged();

algorithm.Key = key.GetBytes(16);

algorithm.IV = key.GetBytes(16);

using (var sourceStream = new MemoryStream(cipherText))

using (var destinationStream = new MemoryStream())

using (var crypto = new CryptoStream(sourceStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read))

{

moveBytes(crypto, destinationStream);

var decryptedBytes = destinationStream.ToArray();

var decryptedMessage = new UnicodeEncoding().GetString(

decryptedBytes);

MessageBox.Show(decryptedMessage);

}

}

對(duì)稱(chēng)加密的一大缺點(diǎn)是密鑰的管理與分配猬腰,換句話(huà)說(shuō),如何把密鑰發(fā)送到需要解密你的消息的人的手里是一個(gè)問(wèn)題猜敢。在發(fā)送密鑰的過(guò)程中姑荷,密鑰有很大的風(fēng)險(xiǎn)會(huì)被黑客們攔截。現(xiàn)實(shí)中通常的做法是將對(duì)稱(chēng)加密的密鑰進(jìn)行非對(duì)稱(chēng)加密缩擂,然后傳送給需要它的人鼠冕。

(二)非對(duì)稱(chēng)加密(Asymmetric Cryptography)

1976年,美國(guó)學(xué)者Dime和Henman為解決信息公開(kāi)傳送和密鑰管理問(wèn)題胯盯,提出一種新的密鑰交換協(xié)議懈费,允許在不安全的媒體上的通訊雙方交換信息,安全地達(dá)成一致的密鑰博脑,這就是“公開(kāi)密鑰系統(tǒng)”憎乙。相對(duì)于“對(duì)稱(chēng)加密算法”這種方法也叫做“非對(duì)稱(chēng)加密算法”。

非對(duì)稱(chēng)加密為數(shù)據(jù)的加密與解密提供了一個(gè)非常安全的方法叉趣,它使用了一對(duì)密鑰泞边,公鑰(public key)和私鑰(private key)。私鑰只能由一方安全保管疗杉,不能外泄阵谚,而公鑰則可以發(fā)給任何請(qǐng)求它的人。非對(duì)稱(chēng)加密使用這對(duì)密鑰中的一個(gè)進(jìn)行加密乡数,而解密則需要另一個(gè)密鑰椭蹄。比如,你向銀行請(qǐng)求公鑰净赴,銀行將公鑰發(fā)給你,你使用公鑰對(duì)消息加密罩润,那么只有私鑰的持有人--銀行才能對(duì)你的消息解密玖翅。與對(duì)稱(chēng)加密不同的是,銀行不需要將私鑰通過(guò)網(wǎng)絡(luò)發(fā)送出去,因此安全性大大提高金度。

目前最常用的非對(duì)稱(chēng)加密算法是RSA算法应媚,是Rivest, Shamir, 和Adleman于1978年發(fā)明,他們那時(shí)都是在MIT猜极。.NET中也有RSA算法中姜,請(qǐng)看下面的例子:

加密過(guò)程:

private byte[] rsaCipherText;

private void mnuAsymmetricEncryption_Click(object sender, RoutedEventArgs e)

{

var rsa = 1;

// Encrypt the data.

var cspParms = new CspParameters(rsa);

cspParms.Flags = CspProviderFlags.UseMachineKeyStore;

cspParms.KeyContainerName = "My Keys";

var algorithm = new RSACryptoServiceProvider(cspParms);

var sourceBytes = new UnicodeEncoding().GetBytes(myData);

rsaCipherText = algorithm.Encrypt(sourceBytes, true);

MessageBox.Show(String.Format("Data: {0}{1}Encrypted and Encoded: {2}",

myData, Environment.NewLine,

Convert.ToBase64String(rsaCipherText)));

}

解密過(guò)程:

private void mnuAsymmetricDecryption_Click(object sender, RoutedEventArgs e)

{

if(rsaCipherText==null)

{

MessageBox.Show("Encrypt First!");

return;

}

var rsa = 1;

// decrypt the data.

var cspParms = new CspParameters(rsa);

cspParms.Flags = CspProviderFlags.UseMachineKeyStore;

cspParms.KeyContainerName = "My Keys";

var algorithm = new RSACryptoServiceProvider(cspParms);

var unencrypted = algorithm.Decrypt(rsaCipherText, true);

MessageBox.Show(new UnicodeEncoding().GetString(unencrypted));

}

雖然非對(duì)稱(chēng)加密很安全,但是和對(duì)稱(chēng)加密比起來(lái)跟伏,它非常的慢丢胚,所以我們還是要用對(duì)稱(chēng)加密來(lái)傳送消息,但對(duì)稱(chēng)加密所使用的密鑰我們可以通過(guò)非對(duì)稱(chēng)加密的方式發(fā)送出去受扳。為了解釋這個(gè)過(guò)程携龟,請(qǐng)看下面的例子:

(1) Alice需要在銀行的網(wǎng)站做一筆交易,她的瀏覽器首先生成了一個(gè)隨機(jī)數(shù)作為對(duì)稱(chēng)密鑰勘高。

(2) Alice的瀏覽器向銀行的網(wǎng)站請(qǐng)求公鑰峡蟋。

(3) 銀行將公鑰發(fā)送給Alice。

(4) Alice的瀏覽器使用銀行的公鑰將自己的對(duì)稱(chēng)密鑰加密华望。

(5) Alice的瀏覽器將加密后的對(duì)稱(chēng)密鑰發(fā)送給銀行蕊蝗。

(6) 銀行使用私鑰解密得到Alice瀏覽器的對(duì)稱(chēng)密鑰。

(7) Alice與銀行可以使用對(duì)稱(chēng)密鑰來(lái)對(duì)溝通的內(nèi)容進(jìn)行加密與解密了赖舟。

(三)總結(jié)

(1) 對(duì)稱(chēng)加密加密與解密使用的是同樣的密鑰蓬戚,所以速度快,但由于需要將密鑰在網(wǎng)絡(luò)傳輸建蹄,所以安全性不高碌更。

(2) 非對(duì)稱(chēng)加密使用了一對(duì)密鑰,公鑰與私鑰洞慎,所以安全性高痛单,但加密與解密速度慢。

(3) 解決的辦法是將對(duì)稱(chēng)加密的密鑰使用非對(duì)稱(chēng)加密的公鑰進(jìn)行加密劲腿,然后發(fā)送出去旭绒,接收方使用私鑰進(jìn)行解密得到對(duì)稱(chēng)加密的密鑰,然后雙方可以使用對(duì)稱(chēng)加密來(lái)進(jìn)行溝通焦人。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挥吵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子花椭,更是在濱河造成了極大的恐慌忽匈,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矿辽,死亡現(xiàn)場(chǎng)離奇詭異丹允,居然都是意外死亡郭厌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)雕蔽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)折柠,“玉大人,你說(shuō)我怎么就攤上這事批狐∩仁郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵嚣艇,是天一觀(guān)的道長(zhǎng)承冰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)髓废,這世上最難降的妖魔是什么巷懈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮慌洪,結(jié)果婚禮上顶燕,老公的妹妹穿的比我還像新娘。我一直安慰自己冈爹,他們只是感情好涌攻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著频伤,像睡著了一般恳谎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上憋肖,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天因痛,我揣著相機(jī)與錄音,去河邊找鬼岸更。 笑死鸵膏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的怎炊。 我是一名探鬼主播谭企,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼评肆!你這毒婦竟也來(lái)了债查?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓜挽,失蹤者是張志新(化名)和其女友劉穎盹廷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體久橙,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡速和,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年歹垫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剥汤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颠放。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吭敢,靈堂內(nèi)的尸體忽然破棺而出碰凶,到底是詐尸還是另有隱情,我是刑警寧澤鹿驼,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布欲低,位于F島的核電站,受9級(jí)特大地震影響畜晰,放射性物質(zhì)發(fā)生泄漏砾莱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一凄鼻、第九天 我趴在偏房一處隱蔽的房頂上張望腊瑟。 院中可真熱鬧,春花似錦块蚌、人聲如沸闰非。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)财松。三九已至,卻和暖如春纱控,著一層夾襖步出監(jiān)牢的瞬間辆毡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工甜害, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舶掖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓唾那,卻偏偏與公主長(zhǎng)得像访锻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闹获,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容