zoukankan      html  css  js  c++  java
  • 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)。

    关于密钥的生成,Linux下常用OpenSSL生成,也可以使用特定语言平台所提供的方法生成。

    // 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生成的一致的。

    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#里用不了,异常信息:不正确的提供程序版本

    如果使用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
  • 相关阅读:
    excel的导入导出
    mybatis常用sql
    java中和时间相关的类,方法
    <resultMap>
    项目启动报的错
    多表查询
    file的一些方法
    AOV网络与AOE网络
    封装解封装过程
    以太网交换机
  • 原文地址:https://www.cnblogs.com/chy710/p/4901183.html
Copyright © 2011-2022 走看看