RSA屬於非對稱加密算法,它雖然解決了“在不安全的信道上安全地傳遞密鑰”這一問題,但缺點在於運算量太大,造成加/解速度太慢,所以在具體的工程應用上是混合使用了對稱和和非對稱加密算法,比如SSL/TLS協議是混合使用了RSA和AES算法。具體的過程是,用RSA算法加密對稱密碼再傳遞給對方,然後雙方使用對稱加密算法通信;另外,RSA還起到CA認證的作用(其實就是驗證由CA的私鑰簽名的,對方的公鑰)。
由此可見,RSA的作用已經由“加密數據”減弱爲“驗證CA證書”和“共享對稱密鑰”,如果第二個作用由DH算法代替,那麼,RSA就僅用於驗證CA證書了。
爲了理解用RSA共享對稱密鑰的過程,本文用手動的方法來逐步實現。
A用戶要把數據加密傳輸給B用戶,步驟如下:
1、B生成公鑰/私鑰對,並把其中的公鑰導出,通過公開信道傳遞給A;
2、A生成對稱密碼;
3、A用對稱加密算法對文件進行AES加密;
4、A用B的公鑰加密對稱密碼;
5、A將加密後的對稱密碼和密文通過網絡等渠道傳送B;
6、B用自己的鑰解密對稱密碼;
7、B用解密後的對稱密碼解密密文;
具體的操作步驟:
1、B生成RSA密鑰對文件key.pri,然後從中提取公鑰key.pub並通過公開信道傳遞給A:
openssl genrsa -out key.pri 4096 openssl rsa -in key.pri -pubout -out key.pub
2、A生成32字節的隨機密碼文件passwd.bin:
openssl rand -out passwd.bin 32
3、準備待加密文件test.txt,用上面的隨機密碼,以AES算法加密明文test.txt,輸出的密文是test.enc,key派生函數是pbkdf2:
openssl enc -pbkdf2 -aes-256-cbc -in test.txt -out test.enc -pass file:passwd.bin del test.txt
4、A用B發過來的公鑰key.pub加密隨機密碼文件passwd.bin,輸出的密文是passwd.enc:
openssl rsautl -encrypt -in passwd.bin -inkey key.pub -pubin -out passwd.enc del passwd.bin
5、A通過公開信道,將密文test.enc和passwd.enc發送給B:
6、B首先用自己的私鑰解密對稱密碼,得到密碼文件passwd.bin:
openssl rsautl -decrypt -in passwd.enc -out passwd.bin -inkey key.pri
7、B再用對稱密碼解密消息,得到明文test.txt,算法和祕鑰派生函數與加密時用到的參數一樣:
openssl enc -d -aes-256-cbc -pbkdf2 -in test.enc -out test.txt -pass file:passwd.bin