首页 > 编程语言 >C# 与JAVA 的RSA 加密解密交互,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

C# 与JAVA 的RSA 加密解密交互,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

时间:2024-02-23 10:44:07浏览次数:29  
标签:公钥 BouncyCastle string C# 解密 加密 私钥

因为一般C#的RSA加密解密都是公钥加密,私钥解密,没有私钥加密,公钥解密。

在网上查了很多资料,终于看到有个博主的分享,关于私钥加密,公钥解密的解决方案,非常感谢(最下面有源网址)。

此处就把简单应用的源码附上,需要的自己去完善。

 

1、私钥加密,公钥解密的源码

using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Crypto.Encodings;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509;
using System; 
using System.Text; 

namespace LS.Card.WPF.Helper
{
    /// <summary>
    /// c#对应java的私钥加密、公钥解密 
    /// </summary>
    public class RSAForJava
    { 
        /// <summary>
        /// KEY 结构体
        /// </summary>
        public struct RSAKEY
        {
            /// <summary>
            /// 公钥
            /// </summary>
            public string PublicKey
            {
                get;
                set;
            }
            /// <summary>
            /// 私钥
            /// </summary>
            public string PrivateKey
            {
                get;
                set;
            }
        }

        public RSAKEY GetKey()
        {
            //RSA密钥对的构造器  
            RsaKeyPairGenerator keyGenerator = new RsaKeyPairGenerator();

            //RSA密钥构造器的参数  
            RsaKeyGenerationParameters param = new RsaKeyGenerationParameters(
                Org.BouncyCastle.Math.BigInteger.ValueOf(3),
                new Org.BouncyCastle.Security.SecureRandom(),
                1024,   //密钥长度  
                25);
            //用参数初始化密钥构造器  
            keyGenerator.Init(param);
            //产生密钥对  
            AsymmetricCipherKeyPair keyPair = keyGenerator.GenerateKeyPair();
            //获取公钥和密钥  
            AsymmetricKeyParameter publicKey = keyPair.Public;
            AsymmetricKeyParameter privateKey = keyPair.Private;

            SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey);
            PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey);


            Asn1Object asn1ObjectPublic = subjectPublicKeyInfo.ToAsn1Object();

            byte[] publicInfoByte = asn1ObjectPublic.GetEncoded("UTF-8");
            Asn1Object asn1ObjectPrivate = privateKeyInfo.ToAsn1Object();
            byte[] privateInfoByte = asn1ObjectPrivate.GetEncoded("UTF-8");

            RSAKEY item = new RSAKEY()
            {
                PublicKey = Convert.ToBase64String(publicInfoByte),
                PrivateKey = Convert.ToBase64String(privateInfoByte)
            };
            return item;
        }

        private AsymmetricKeyParameter GetPublicKeyParameter(string s)
        {
            s = s.Replace("\r", "").Replace("\n", "").Replace(" ", "");
            byte[] publicInfoByte = Convert.FromBase64String(s);
            Asn1Object pubKeyObj = Asn1Object.FromByteArray(publicInfoByte);//这里也可以从流中读取,从本地导入   
            AsymmetricKeyParameter pubKey = PublicKeyFactory.CreateKey(publicInfoByte);
            return pubKey;
        }

        private AsymmetricKeyParameter GetPrivateKeyParameter(string s)
        {
            s = s.Replace("\r", "").Replace("\n", "").Replace(" ", "");
            byte[] privateInfoByte = Convert.FromBase64String(s);
            // Asn1Object priKeyObj = Asn1Object.FromByteArray(privateInfoByte);//这里也可以从流中读取,从本地导入   
            // PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey);
            AsymmetricKeyParameter priKey = PrivateKeyFactory.CreateKey(privateInfoByte);
            return priKey;
        }

        /// <summary>
        /// 私钥加密
        /// </summary>
        /// <param name="s"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public string EncryptByPrivateKey(string s, string key)
        {
            //非对称加密算法,加解密用  
            IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());
             
            //加密  
            try
            {
                engine.Init(true, GetPrivateKeyParameter(key));
                byte[] byteData = System.Text.Encoding.UTF8.GetBytes(s);
                var ResultData = engine.ProcessBlock(byteData, 0, byteData.Length);
                return Convert.ToBase64String(ResultData); 
            }
            catch (Exception ex)
            {
                return ex.Message; 
            }
        }

        /// <summary>
        /// 公钥解密
        /// </summary>
        /// <param name="s"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public string DecryptByPublicKey(string s, string key)
        {
            s = s.Replace("\r", "").Replace("\n", "").Replace(" ", "");
            //非对称加密算法,加解密用  
            IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());
             
            //解密   
            try
            {
                engine.Init(false, GetPublicKeyParameter(key));
                byte[] byteData = Convert.FromBase64String(s);
                var ResultData = engine.ProcessBlock(byteData, 0, byteData.Length);
                return Encoding.UTF8.GetString(ResultData); 
            }
            catch (Exception ex)
            {
                return ex.Message; 
            }
        }
    }
}

 

2、加密、解密之调用

此处调用时,自己写上Java中对应的公钥和私钥。

//java的私钥和公钥
string PUBLIC_KEY = "此处填写java中的公钥";
string PRIVATE_KEY = "此处填写java中的私钥";

string mes = "888888";
RSAForJava rSAForJava = new RSAForJava(); 
string enc = rSAForJava.EncryptByPrivateKey(mes, PRIVATE_KEY);   //私钥加密
string dec = rSAForJava.DecryptByPublicKey(enc, PUBLIC_KEY); //公钥解密

 

3、查看调用效果

如下图,私钥进行加密,公钥进行解密,解密后的明文和加密器的明文一致。

故使用java的密钥,在c#中进行私钥加密公钥解密,顺利解决。

 

 

引用网址:https://www.cnblogs.com/lhxsoft/p/10801158.html

 

标签:公钥,BouncyCastle,string,C#,解密,加密,私钥
From: https://www.cnblogs.com/ggll611928/p/18028968

相关文章

  • Spring集成Nacos配置中心
    spring版本4.2.8  nacos:1.1.0 jdk1.8引入依赖<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-spring-context</artifactId><version>1.1.1</version>......
  • clickhouse查看数据库和表的容量信息
         在mysql中information_schema这个数据库中保存了mysql服务器所有数据库的信息,那在clickhouse如何查询库表信息呢? 可以通过system.parts查看clickhouse数据库和表的容量大小、行数、压缩率以及分区信息。    详见正面实操,只是其中一例,大家可以举一返三。 1、......
  • 控制ERP物料主数据通过Middleware传往CRM
    先说一下优化过滤的必要性。CRM物料主数据一百多万。感谢MDM或者相关的系统,每天通过接口更新的不知道什么东西,每天数百万的物料更新队列进入CRM。CRM系统被搞死了好几次。然后各种优化报表,程序。。。最后有几个链接缓慢的自开发接口,背锅了。。。好吧,先不管那些了。现在在ERP......
  • 软件无线电处理平台设计方案:330-基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U PXIe接口
    一、板卡概述   本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持PXIE标准协议,其中XJ3标准高速差分接口,支持PCIeX 2。软件具有windows,Linux驱动。 二、功能和技术指标......
  • idea正则表达式ctrl+R替换
    正则表达式进行查找替换在idea上ctrl+F查找时,可以用类似label="(.*?)"来匹配所有label和其等于的值:注意得选中后面的".*"这是一个正则表达式的匹配:(.*?)用一对括号捕获组——捕获组可以提取双引号中的实际值.匹配任何字符,*出现任意次数,?表示......
  • css浮动(float)详解
    https://blog.csdn.net/weixin_45123004/article/details/104463619浮动详解一、什么是浮动?浮动,顾名思义,就是漂浮的意思。指的是一个元素脱离文档流,悬浮在父元素之上的现象。二、如何产生浮动?给元素本身添加float属性float: 三、浮动有什么作用?作用:在html文档流中,分为行元......
  • clickhouse 数据类型介绍
    clickhouse数据类型介绍clickhouse数据类型主要包括以下几种:   (1)、基础类型:       数值类型:包括整数、浮点数和定点数。           a、整数:有符号整型Int,分为Int8、Int16、Int32和Int64,分别对应8位、16位、32位和64位整数,占用字节大小分别为1、2、4......
  • Jenkins构建提示docker命令权限问题解决方法
    参考:https://zhuanlan.zhihu.com/p/568513293使用Jenkins构建时使用的用户为jenkins在使用docker命令时会报以下错误ERROR:permissiondeniedwhiletryingtoconnecttotheDockerdaemonsocketatunix:///var/run/docker.sock:Get"http://%2Fvar%2Frun%2Fdocker.soc......
  • 文心一言 VS 讯飞星火 VS chatgpt (200)-- 算法导论15.2 4题
    四、用go语言,对输入链长度为n的矩阵链乘法问题,描述其子问题图:它包含多少个顶点?包含多少条边?这些边分别连接哪些顶点?文心一言:矩阵链乘法问题是一个经典的动态规划问题,其中给定一个矩阵链,我们需要确定一个乘法顺序,使得计算该链所需的总标量乘法次数最少。子问题图(也叫DAG,有......
  • FMC子卡设计资料原理图450-基于ADRV9009的双收双发射频FMC子卡 数字信号处理卡 射频收
    FMCJ450-基于ADRV9009的双收双发射频FMC子卡   一、板卡概述       ADRV9009是一款高集成度射频(RF)、捷变收发器,提供双通道发射器和接收器、集成式频率合成器以及数字信号处理功能。这款IC具备多样化的高性能和低功耗组合,FMC子卡为2路输入,2路输......