RSA使用public key加密,用private key解密(簽名相反,使用private key簽名,用public key驗證簽名)。比如我跟合作方D之間的資料傳輸,我使用D提供給我的public key進行加密後,傳給D,他使用他的private key解密後得到原文;response時,D使用我提供給他的public key加密,我收到後使用我的private key解密得到原文。一個常用的場景是兩方之間的資料傳輸使用AES加密,再把AES的金鑰通過RSA加密後一併傳輸。(AES的效能高過RSA)。
關於金鑰的生成,Linux下常用OpenSSL生成,也可以使用特定語言平臺所提供的方法生成。
// c#版本 (引數false生成私鑰,public生成公鑰)
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ExportParameters(false); //對像
rsa.ExportCspBlob(false); //字串
rsa.ToXmlString(false); //xml格式
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ExportParameters(false); //對像
rsa.ExportCspBlob(false); //字串
rsa.ToXmlString(false); //xml格式
# python版本
import rsa
(pubkey, privkey) = rsa.newkeys(1024)
pub = pubkey.save_pkcs1() #public key
pri = privkey.save_pkcs1() #private key
import rsa
(pubkey, privkey) = rsa.newkeys(1024)
pub = pubkey.save_pkcs1() #public key
pri = privkey.save_pkcs1() #private key
也可以使用OpenSSL.NET生成,這是一個OpenSSL在.net上的實現。裡邊有個cli 專案可以在命令列下執行,他生成的應該和linux下使用OpenSSL生成的一致的。
genrsa -out rsa_private_key.pem 1024
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
然並卵,每個平臺語言之間的RSA金鑰不能通用,c#生成的java,python上用不了,OpenSSL生成的C#裡用不了,異常資訊:不正確的提供程式版本
如果使用OpenSSL生成的金鑰,在.net中使用OpenSSL.NET加密解密是個不錯的選擇。另一個辦法就是把金鑰轉換成各自語言所需的格式,比如這個http://csslab.s3.amazonaws.com/csslabs/Siva/opensslkey.cs
可以把OpenSSL Key轉換成c#需要的xml格式,這樣就可以直接使用.net framework裡的方法進行RSA加密解密了。
有時候合作方給你的可能不是一個public key,而一個cert證照檔案,這就需要從這個證照裡提取出public key了
#在linux下,通過openssl提取
openssl x509 -in ca.crt -pubkey
openssl x509 -in ca.crt -pubkey