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
也能够使用OpenSSL.NET生成,这是一个OpenSSL在.net上的实现。里边有个cli 项目能够在命令行下运行,他生成的应该和linux下使用OpenSSL生成的一致的。python
然并卵,每一个平台语言之间的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 key了web