對稱加密與非對稱加密

2021-08-14 00:15:50 字數 3666 閱讀 8710

對稱加密是最快速、最簡單的一種加密方式,加密(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(

newunicodeencoding().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。因為金鑰越大,加密越強...