首页 > 编程语言 >C#使用Java的秘钥对进行SHA256withRSA签名验签

C#使用Java的秘钥对进行SHA256withRSA签名验签

时间:2023-03-30 18:46:29浏览次数:32  
标签:SHA256withRSA Convert Java string parameters C# ToBase64String FromBase64String 

using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using System;
using System.Security.Cryptography;
using System.Text;
using System.Xml;

/// <summary>
/// RSA私钥,从Java格式转.net格式(不依赖第三方包)
/// </summary>
/// <param name="privateKey">私钥</param>
/// <returns></returns>
public static string RSAPrivateKeyJava2DotNet(string privateKey)
{
RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
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="contentForSign"></param>
/// <param name="privateKey"></param>
/// <returns></returns>
public static string Sign(string contentForSign, string privateKey)
{
var netKey = RSAPrivateKeyJava2DotNet(privateKey); //转换成适用于.net的私钥

var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(netKey);

var rsaClear = new RSACryptoServiceProvider();
var paras = rsa.ExportParameters(true);
rsaClear.ImportParameters(paras); //签名返回
using (var sha256 = new SHA256CryptoServiceProvider())
{
var signData = rsa.SignData(Encoding.UTF8.GetBytes(contentForSign), sha256);
return Convert.ToBase64String(signData);
}
}


/// <summary>
/// RSA公钥,从Java格式转.net格式(不依赖第三方包)
/// </summary>
/// <param name="publikKey"></param>
/// <returns></returns>
public static string RSAPublicKeyJava2DotNet(string publicKey)
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
}

/// <summary>
/// RSA签名验证
/// </summary>
/// <param name="encryptSource">签名</param>
/// <param name="c">验证的字符串</param>
/// <param name="publicKey">公钥</param>
/// <returns>是否相同,true验证成功,false验证失败。</returns>
public static bool VerifySignature(string encryptSource, string compareString, string publicKey)
{
try
{
using (RSACryptoServiceProvider rsa = FromXmlString(RSAPublicKeyJava2DotNet(publicKey)))
{
//rsa.FromXmlString(RSAPrivateKeyJava2DotNet(publicKey)); .net core3.0直接使用,不需要重写
byte[] signature = Convert.FromBase64String(encryptSource);
SHA256Managed sha256 = new SHA256Managed();
RSAPKCS1SignatureDeformatter df = new RSAPKCS1SignatureDeformatter(rsa);
df.SetHashAlgorithm("SHA256");
byte[] compareByte = sha256.ComputeHash(Encoding.UTF8.GetBytes(compareString));

return df.VerifySignature(compareByte, signature);
}
}
catch (Exception)
{
return false;
}
}


/// <summary>
/// 重写FromXmlString方法
/// </summary>
/// <param name="xmlString"></param>
/// <returns></returns>
public static RSACryptoServiceProvider FromXmlString(string xmlString)
{
var rsa = new RSACryptoServiceProvider();
RSAParameters parameters = new RSAParameters();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
if (xmlDoc.DocumentElement.Name.Equals("RSAKeyValue"))
{
foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes)
{
switch (node.Name)
{
case "Modulus": parameters.Modulus = Convert.FromBase64String(node.InnerText); break;
case "Exponent": parameters.Exponent = Convert.FromBase64String(node.InnerText); break;
case "P": parameters.P = Convert.FromBase64String(node.InnerText); break;
case "Q": parameters.Q = Convert.FromBase64String(node.InnerText); break;
case "DP": parameters.DP = Convert.FromBase64String(node.InnerText); break;
case "DQ": parameters.DQ = Convert.FromBase64String(node.InnerText); break;
case "InverseQ": parameters.InverseQ = Convert.FromBase64String(node.InnerText); break;
case "D": parameters.D = Convert.FromBase64String(node.InnerText); break;
}
}
}
else
{
throw new Exception("Invalid XML RSA key.");
}

rsa.ImportParameters(parameters);
return rsa;
}

//生成.net   xml   公钥  私钥

public string RsaSign(string data, string privatekey)
{
CspParameters CspParameters = new CspParameters();
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048, CspParameters);
byte[] bytes = Encoding.UTF8.GetBytes(data);
privatekey = RSA.ToXmlString(true);
var publickey=RSA.ToXmlString(false);
RSA.FromXmlString(privatekey);
byte[] sign = RSA.SignData(bytes, "SHA256");

return Convert.ToBase64String(sign);
}

 

标签:SHA256withRSA,Convert,Java,string,parameters,C#,ToBase64String,FromBase64String,
From: https://www.cnblogs.com/liu-j/p/17273956.html

相关文章

  • CentOS7 Docker安装 ElasticSearch8、Kibana8
    一、Docker安装yuminstall-ydocker#开机自启systemctlenabledocker#启动dockersystemctlstartdocker二、安装ElasticSearchdockerpulldocker.elastic.co/elasticsearch/elasticsearch:8.6.2vi/etc/sysctl.conf在/etc/sysctl.conf文件最后添加一行vm.ma......
  • [ABC273D] LRUD Instructions
    题目链接题解模拟题。观察题目,我们发现,无论问的是前/后/左/右,你都只会在一条直线上走,那对于这条直线,我们可以记录所有这条直线上的障碍物,然后找到距离当前点最近的障碍物,也就是说我们只能走到那个障碍物那块。虽然数据范围高达\(10^9\),但是\(n\le10^5\),所以用\(map\)套\(......
  • 如何限制进程内存:cgroup
    前两天刚知道cgroup,但是没用过,我就想做个简单的模拟OOM,网上搜了两天,发现一个比一个说的杂乱无章。 最后问的chatgpt:如何限制一个进程的内存在Linux系统中,可以使用cgroups来限制一个进程的内存。cgroups是一种内核机制,用于控制进程组的资源使用(CPU、内存、IO、网络等)。下面......
  • RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
    作者简介:艾阳坤,ApacheRocketMQPMCMember/Committer,CNCFOpenTelemetryMember,CNCFEnvoycontributor。在分布式系统中,多个服务之间的交互涉及到复杂的网络通信和数据传输,其中每个服务可能由不同的团队或组织负责维护和开发。因此,在这样的环境下,当一个请求被发出并经过多个......
  • 自制MCU的入门教程
    前言春意已起,却乍暖还寒。三四月的交接,是冷与暖的拥别。说明如今,以ChatGPT为代表的的人工智能驱动的语言处理系统已经火爆全网,开始渗透进日常生活;各种AI图像生成工具也大行其道,精美的生成图比肩专业的设计师。这些AI应用的广泛而快速的普及,是真的能够替代一些人的职位,导致失......
  • C# 当前进程是否有控制台窗口
    WPF应用程序,在VS的项目属性中,可以设置输出类型:那我们在代码中,如何判断应用的类型呢。有没有控制台?是否Windows应用程序还是控制台应用程序?Kernel32下函数GetConsoleWindow可以解决这个问题:[DllImport("kernel32.dll")]privatestaticexternIntPtrGetConsoleWindow();......
  • React 编程思想 #1
    React编程思想#1看太多语法,都不如简单尝试一下,跟着官方文档做了一下DEMO,文档写的真不错,就是没翻译完,一大半都还是英文(×_×),本篇其实大部分也是在重复文档内容,不过加上了自己的尝试。从原型开始React可以改变你对所看到的设计以及所构建的应用程序的看法。以前你看到的是......
  • Linux修改rc.local后重启无法进入系统
    Linux修改rc.local后重启无法进入系统复现:102服务器重启之后,一直卡在用户列表界面,但是不显示用户列表,用Alt+F2切换到黑屏终端,也无法进入终端 原因:在/etc/rc.d/rc.local中,在系统启动时会执行里面的任务,如果任务有问题,会导致无法进入系统 解决:1、重启服务器,在选择内核时,按......
  • 有关归并排序-Java实现
    有关归并排序:其中的分治思想很值得参考:1/**2*归并排序块合并3*@paramnum目标的排序数组4*@paramleftIndex传入的分治块的做左端索引5*@parammid中间索引6*@paramrightIndex传入的分治块的做右端索引7*@param......
  • Beego查数据库数据panic问题
    一开始没发现问题所在,请了位大佬帮忙排查错误逐步确定问题所在。问题起源于我查数据库没有得到正确的数据开始。一开始发现是数据类型问题,改过之后还是存在问题,于是debug一下,一步一步看问题出在哪里,结果走进了锁,就没仔细看,哪知在这中间出现了一个panic问题。但是这个panic没有打......