RSA密鑰的跨平臺通用

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)。css

 

關於密鑰的生成,Linux下經常使用OpenSSL生成,也能夠使用特定語言平臺所提供的方法生成。java

//  c#版本 (參數false生成私鑰,public生成公鑰)
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

 

也能夠使用OpenSSL.NET生成,這是一個OpenSSL在.net上的實現。裏邊有個cli 項目能夠在命令行下運行,他生成的應該和linux下使用OpenSSL生成的一致的。python

genrsa -out rsa_private_key.pem 1024
rsa - in rsa_private_key.pem -pubout -out rsa_public_key.pem


然並卵,每一個平臺語言之間的RSA密鑰不能通用,c#生成的java,python上用不了,OpenSSL生成的C#裏用不了,異常信息:不正確的提供程序版本linux

若是使用OpenSSL生成的密鑰,在.net中使用OpenSSL.NET加密解密是個不錯的選擇。另外一個辦法就是把密鑰轉換成各自語言所需的格式,好比這個http://csslab.s3.amazonaws.com/csslabs/Siva/opensslkey.csgit

能夠把OpenSSL Key轉換成c#須要的xml格式,這樣就能夠直接使用.net framework裏的方法進行RSA加密解密了。github

 

有時候合做方給你的可能不是一個public key,而一個cert證書文件,這就須要從這個證書裏提取出public keyweb

# 在linux下,經過openssl提取
openssl x509 - in ca.crt -pubkey
相關文章
相關標籤/搜索