對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的金鑰(secret key)。對稱加密有很多種演算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。
對稱加密通常使用的是相對較小的金鑰,一般小於256 bit。因為金鑰越大,加密越強,但加密與解密的過程越慢。如果你只用1 bit來做這個金鑰,那黑客們可以先試著用0來解密,不行的話就再用1解;但如果你的金鑰有1 mb大,黑客們可能永遠也無法破解,但加密和解密的過程要花費很長的時間。金鑰的大小既要照顧到安全性,也要照顧到效率,是乙個trade-off。
2023年10月2日,美國國家標準與技術研究所(nist--american national institute of standards and technology)選擇了rijndael演算法作為新的高階加密標準(aes--advanced
encryption
standard)。.net中包含了rijndael演算法,類名叫rijndaelmanaged,下面舉個例子。
加密過程:
private string mydata = "hello";解密過程:private string mypassword = "opensesame";
private byte ciphertext;
private byte salt = ;
private void mnusymmetricencryption_click(object sender, routedeventargs e)
messagebox.show(string.format("data:encrypted and encoded:", mydata, environment.newline, convert.tobase64string(ciphertext)));
}private void movebytes(stream source, stream dest)
}
private void mnusymmetricdecryption_click(object sender, routedeventargs e)對稱加密的一大缺點是金鑰的管理與分配,換句話說,如何把金鑰傳送到需要解密你的訊息的人的手裡是乙個問題。在傳送金鑰的過程中,金鑰有很大的風險會被黑客們攔截。現實中通常的做法是將對稱加密的金鑰進行非對稱加密,然後傳送給需要它的人。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))
}
非對稱加密為資料的加密與解密提供了乙個非常安全的方法,它使用了一對金鑰,公鑰(public key)和私鑰(private key)。私鑰只能由一方安全保管,不能外洩,而公鑰則可以發給任何請求它的人。非對稱加密使用這對金鑰中的乙個進行加密,而解密則需要另乙個金鑰。比如,你向銀行請求公鑰,銀行將公鑰發給你,你使用公鑰對訊息加密,那麼只有私鑰的持有人--銀行才能對你的訊息解密。與對稱加密不同的是,銀行不需要將私鑰通過網路傳送出去,因此安全性大大提高。
目前最常用的非對稱加密演算法是rsa演算法,是rivest, shamir, 和adleman於2023年發明,他們那時都是在mit。.net中也有rsa演算法,請看下面的例子:
加密過程:
private byte rsaciphertext;解密過程:private void mnuasymmetricencryption_click(object sender, routedeventargs e)
encrypted and encoded: ",
mydata, environment.newline,
convert.tobase64string(rsaciphertext)));
}
private void mnuasymmetricdecryption_click(object sender, routedeventargs e)雖然非對稱加密很安全,但是和對稱加密比起來,它非常的慢,所以我們還是要用對稱加密來傳送訊息,但對稱加密所使用的金鑰我們可以通過非對稱加密的方式傳送出去。為了解釋這個過程,請看下面的例子: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));
}
(1) alice需要在銀行的**做一筆交易,她的瀏覽器首先生成了乙個隨機數作為對稱金鑰。
(2) alice的瀏覽器向銀行的**請求公鑰。
(3) 銀行將公鑰傳送給alice。
(4) alice的瀏覽器使用銀行的公鑰將自己的對稱金鑰加密。
(5) alice的瀏覽器將加密後的對稱金鑰傳送給銀行。
(6) 銀行使用私鑰解密得到alice瀏覽器的對稱金鑰。
(7) alice與銀行可以使用對稱金鑰來對溝通的內容進行加密與解密了。
(1) 對稱加密加密與解密使用的是同樣的金鑰,所以速度快,但由於需要將金鑰在網路傳輸,所以安全性不高。
(2) 非對稱加密使用了一對金鑰,公鑰與私鑰,所以安全性高,但加密與解密速度慢。
(3) 解決的辦法是將對稱加密的金鑰使用非對稱加密的公鑰進行加密,然後傳送出去,接收方使用私鑰進行解密得到對稱加密的金鑰,然後雙方可以使用對稱加密來進行溝通。
對稱加密與非對稱加密
概述目前存在兩種加密方法 一種是對稱加密 另稱私鑰加密 一種是不對稱加密 另稱公鑰加密 對稱加密 對稱加密是一種最古老也最有名的加密技術。它對加密的內容應用乙個私鑰 可以是乙個數字,乙個單詞,或者是一隨機字串 按照一定的規則進行改變,從而達到加密的目的。一種簡單的情形是把每個字母在字母表中往前或往後...
對稱加密與非對稱加密
什麼是加密?加密分為演算法和秘鑰兩部分。演算法是不變的,秘鑰是變化的,看下面的例子。秘鑰 abcedfgh 12345678。演算法 明文中每一位都換成秘鑰表中的另乙個位。例如adfh經過加密後為1568。加密金鑰k和解密金鑰k 是一樣的則為對稱加密。對稱加密的優點 加密速度快。對稱加密的缺點 金鑰...
對稱加密與非對稱加密
對稱加密是最快速 最簡單的一種加密方式,加密 encryption 與解密 decryption 用的是同樣的金鑰 secret key 對稱加密有很多種演算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。對稱加密通常使用的是相對較小的金鑰,一般小於256 bit。因為金鑰越大,加密越強...