C# 对接JAVA过程中RSA 私钥公钥加密问题

本文介绍了在C#与JAVA接口对接中如何处理RSA加密的问题。业务需求涉及AES和RSA加密,其中RSA的XML格式密钥在C#中原生支持,而JAVA提供的是PEM格式。文章详细阐述了签名规则,包括AES加密、RSA私钥签名、公钥加密的过程,并探讨了解决PEM到XML格式转换的两种方法,以实现双方系统的无缝对接。
摘要由CSDN通过智能技术生成

公司业务需求要和第三方进行接口对接。我方使用的是C#,第三方是JAVA ,安全验证使用了AES和RSA加密。 

AES加密,机密好弄, RSA就有些麻烦了,C#和JAVA的不一样。C#原生的支持的XML格式密钥。java提供的是pem文件格式密钥。

下图为签名方式:

签名规则详细步骤如下: 
(1)合作方、现在支付生成各自 RSA 公私钥、AES 对称密钥。其中,合作方 RSA 公私钥为
(cooperatorPubKey、cooperatorPriKey),合作方 AES 对称密钥为 cooperatorAESKey;现在支付 RSA 公私钥
为(pubKey、priKey),现在支付 AES 对称密钥为 AESKey。生成密钥后交换各自 RSA 公钥。 
(2)合作方请求报文时,需要用合作方 AES 对称密钥 cooperatorAESKey 加密请求报文:
encryptData=AES.encryptToBase64(data,cooperatorAESKey),其中 encryptData 是 Base64 编码的字符串;用合
作方 RSA 私钥签名请求报文:signature=RSA.signToBase64(data,cooperatorPriKey),其中 signature 是 Base64
编码的字符串;用现在支付 RSA 公 钥 加 密 合 作 方 AES 对称密钥 cooperatorAESKey :
encryptKey=RSA.encryptToBase64(cooperatorAESKey,pubKey),其中 encryptKey 是 Base64 编码的字符串。 
注:以上为伪代码表示。 
现在支付收到合作方请求报文(包含 6 个参数:encryptData、encryptKey、cooperator、signature,func
ode,version),根据 cooperator 取出对应的密钥,用现在支付 RSA 私钥解密 encryptKey:cooperatorAESKey=
RSA.decryptFromBase64(encryptKey,priKey);用解密得到的 cooperatorAESKey 解密 encryptData:data=AES.dec
ryptFromBase64(encryptData, cooperatorAESKey);用合作方 RSA 公钥验证签名:boolean result=RSA.checkSig
nFromBase64(data,signature,cooperatorPubKey); 

 

想到2种方法:1、将pem文件格式的内容以文本方式进行处理。

2、将pem转换为xml格式,支持原生。

 

前提参数准备:

//第三方公钥
        string iPayPublicKey = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgBXxP1I2Y2cNpyZZyhEXsM4VYCKv2Y33mXe8BI3KXaBPy87yuNam0YqxsM+ujo6FUXoFThU0XT+9AenFm2opDhG2SSV/8WkPVPx6ZeGLwn0CAudUEPVz3X4lbRJXHsEZWvv6jB8fbX6LlHWqyygy3aIaw0+tB49UTYTEXHfySKQAtaE4MS9GxbmlKb+Hhn+1LCxU6A1jEnS98ZByNPe5/6LDpCEQxrlzj4k+NW3AT5beSPKSmWlUsgsME8JSZLJcnV7omuV+DU5DdVL58QXJoEfFR6GZhxeKLoYtTxSw0xso/q3KLFcdAwfjix7HcmyDhplwwQSn5ydrb5j1Ci2raQIDAQAB-----END PUBLIC KEY-----";

       //我方私钥
        string privateKey = "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCAQEAh/DIxU4Q7PNPL2cU4spoQK92Rz1CTs7xkA9G1KbMozFGP3o0iuJfWk1NLRXlPKaB9NfjxoLgMJnmFRJSHIGuFQ1ipKb+xaSmCiZ0BnVs5eKZ3vmo+cFLTP9RzYaD5hK9rAc+JrK5IuKhSBp+qzLvENtku0WDmZg0PGm/uuJgvV62geTSgKQdq2sIUsFEM6T8dhPUrpcDdSFpbTudX2J44KIoaF8GnADzKIBioc028jyMfrlru6EnDDPejVWVP3u8l5O7Hg/QZ3ZdbhUOf+4efFym3HAUNkx6Vt62HxCD9O4H4L/oceZN+2IwFEVwtPG9xBbNbK0bpNbaztqSZrpRwwIDAQABAoIBAFgkMjlkFatdUyF8J9movZH7cqhcOusYWR48GYP2JsdFQrQTy4+lmYfWiUzLXphFqguUE5b58tzwXHObLmxXVQVHaYcy1AxYZmQ8bIxnhNVFaNlfbUWLJATnoyWsq0b5Lcwl4hF7XnkVEtfKfgkI/GMkrZqTRvHG80+cjXliILGHjaUKB5YGBlWT4cxPbnImV+Is8bpIoGUYHvKLr4mz1vflC89Lkx9tEcM5AOYqs63Mvs8cgp4xfmjXUsaRnjBe/3jN76hP079ejQgC19PaoYyWT52hC8AoiMGgZ18AHk+buJwIn3HalaElVqBmGSQjC9W/jBUFCsCiYSzON96rLDECgYEAzZzq5gBFhCX07gvhPI00JzSXZ64PRy72UNfG9Uf0HTGlp62b4YiXTFLl5ST+k5KdJ+UEl58UW3xKcQuLf/p6zsMRpCokn4Omh1Q5PdO8gtoRp6d6ZkBaACKHovOE29lcKWsUJYgNexhnZ0iGC6AcbdNlLUDPmsGaSwsMRm9CGHsCgYEAqUD8FsHSgNjn2vtpG3ejNC/lPbI3H43KcDfwcq6KuTvhucL6N+69gwwGPnndFHNmCS3dkWjo/aXkEXiU4D9vk4qzBJ5iuqtlfTMk8qDv7Ros/loMdkTRiSmRPFI4UtgjG1nZKlJOVEPOUZimOJzrh+c6HkXx1OIrX/Drzor3vVkCgYEAltAQI5/zXViR7MDd9pIDvPYAT9YF8sppdSawEl0ymu89eF4IxkZv41Wytn6KFCgoCYkb8zKFtgzWdVBog/hvd5TxLZ6TukTQMtb+HXFfBgN5i6V2S+XLnem13zoLK06lIOQfpN/EM5PU1JcHayOHdq7luWmeXP7Ac2apHEijDF0CgYABghq8+S0vCL/IK8VcAUzrAiJA0n27QkAzj8wMuZFy5R210g74wJ/fsxO7KsrVi9G08zuuOAkbeYb2wORSuz37SpkdyWuHzk8xNmt13glFS55rBdJmm2ZimoQ4zWLDGjn13G8a+XDJP3FvOLUCfCN9KopSCr2E8B8C09rGFGbwwQKBgCsIA4EGs4JNZtVjnPTJtnI4aJWaasc8BkBIu1c+8IFH3PZ5l3bLtfxTpINw05QLU/HI3M4+RuswtZhk9MoNvdDLNv1owTK+o7gBreoCCgJRRcwuGiCsnNKrhymbpGM3ljlOiqfHGTK38U41HRbvrCQhGQQ5maf/3VhFlLFpOlIi-----END RSA PRIVATE KEY-----";

第一步:AES加密,

aeskey 每次都不一样,动态生成    

string EncryptKey = Guid.NewGuid().ToString("N").Substring(0, 16);
 /// <summary>
        ///   AES 加密
        /// </summary>
        /// <param name="sKey"></param>
        /// <param name="strEncrypt"></param>
        /// <returns></returns>
        public static string AESEncrypt(string sKey, string strEncrypt)
        {
            byte[] K = Encoding.UTF8.GetBytes(sKey);
            KeyParameter key = ParameterUtilities.CreateKeyParameter("AES", K);

            IBufferedCipher c = CipherUtilities.GetCipher("AES/ECB/PKCS5Padding");// 参数与Java中加密解密的参数一致     

            c.Init(true, key);  // 第一个参数为true表示加密,为false表示解密;第二个参数表示密钥

            byte[] DataToEncrypt = Encoding.UTF8.GetBytes(strEncrypt);
            byte
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA是一种非对称加密算法,它使用公钥私钥加密和解密数据。在Java生成RSA公钥私钥的步骤如下: 1. 导入相关的类库: ```java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; ``` 2. 初始化密钥对生成器: ```java KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); ``` 其,第一行代码创建了一个KeyPairGenerator对象,指定算法为RSA;第二行代码初始化了密钥对生成器,并指定密钥长度为2048位。 3. 生成密钥对: ```java KeyPair keyPair = keyGen.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); ``` 其,第一行代码生成了密钥对;第二行代码获取了私钥;第三行代码获取了公钥。 完整代码示例如下: ```java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; public class RSAGenerator { public static void main(String[] args) throws NoSuchAlgorithmException { // 初始化密钥对生成器 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); // 生成密钥对 KeyPair keyPair = keyGen.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); // 输出公钥私钥 System.out.println("私钥:" + privateKey); System.out.println("公钥:" + publicKey); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值