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
相关文章
相关标签/搜索