c# - java公私钥 转 c# net 公私钥做 RSA 加解密操作

1.背景

java 和 c# 语言的公私钥格式是不同的,需要专门转换后才可以使用

2.c#工具类

复制代码
using System;
using System.Security.Cryptography;
using System.Text;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;

namespace Hypj.Logic.NCAPI
{
    public class RsaTool
    {
        
        /// <summary>
        /// java 公钥 转 net格式
        /// </summary>
        /// <param name="javaPublicKey"></param>
        /// <returns></returns>
        public static string JavaPublicKeyToNet(string javaPublicKey)
        {
            RsaKeyParameters publicKeyParam =
                (RsaKeyParameters) PublicKeyFactory.CreateKey(Convert.FromBase64String(javaPublicKey));
            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
                Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
                Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
        }
        
        /// <summary>
        /// java 私钥 转 net格式
        /// </summary>
        /// <param name="javaPrivateKey"></param>
        /// <returns></returns>
        public static string JavaPrivateKeyToNet(string javaPrivateKey)
        {
            RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(javaPrivateKey));
        
            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
                Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
        }

        /// <summary>
        /// 公钥或公钥加密数据
        /// </summary>
        /// <param name="input">字符串数据</param>
        /// <param name="key">net公钥或私钥</param>
        /// <returns>base64密文</returns>
        public static string EncryptByPub(string input, string key)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(key);
            byte[] cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(input), false);
            return Convert.ToBase64String(cipherbytes);
        }

        /// <summary>
        /// 私钥解密数据
        /// 注意:公钥不可解密,c#只能做验证
        /// </summary>
        /// <param name="input">字符串数据</param>
        /// <param name="privateKey">net私钥</param>
        /// <returns>解密后的字符串</returns>
        public static string DecryptByPri(string input, string privateKey)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(privateKey);
            byte[] encryptedData = Convert.FromBase64String(input);
            byte[] decryptedData = rsa.Decrypt(encryptedData, false);
            return Encoding.UTF8.GetString(decryptedData);
        }

      
    }
}
复制代码

 

posted @   岑惜  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2022-12-05 c++ - 误删cmake-build-debug ,clion具体解决
2021-12-05 vue3.0 没有 vue.condig.js 解决
2021-12-05 win10 安装vue 详解-包括node.js、npm、webpack
点击右上角即可分享
微信分享提示