.NET Core RSA 签名和验签(密钥为 16 进制编码)
使用 OpenSSL 生成公私钥对,命令:
$ openssl genrsa -out rsa_1024_priv.pem
$ openssl pkcs8 -topk8 -inform PEM -in rsa_1024_priv.pem -outform PEM -nocrypt -out rsa_1024_priv_pkcs8.pem
$ openssl rsa -in rsa_1024_priv_pkcs8.pem -pubout -out rsa_1024_pub.peml
rsa_1024_priv_pkcs8.pem
和rsa_1024_pub.peml
分别为公私钥对,复制出来里面的内容。
安装程序包:
install-package BouncyCastle.NetCore
创建帮助类:
public static class RSAHelper
{
/// <summary>
/// RSA签名
/// </summary>
/// <param name="content">数据</param>
/// <param name="privateKey">RSA密钥</param>
/// <returns></returns>
public static string RsaSign(string content, string privateKey)
{
var signer = SignerUtilities.GetSigner("SHA1withRSA");
//将java格式的rsa密钥转换成.net格式
var privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(StrToToHexByte(privateKey));
signer.Init(true, privateKeyParam);
var plainBytes = Encoding.UTF8.GetBytes(content);
signer.BlockUpdate(plainBytes, 0, plainBytes.Length);
var signBytes = signer.GenerateSignature();
return ByteToHexStr(signBytes);
}
/// <summary>
/// RSA验签
/// </summary>
/// <param name="content">内容</param>
/// <param name="publicKey">RSA公钥</param>
/// <param name="signData">签名字段</param>
/// <returns></returns>
public static bool VerifySign(string content, string publicKey, string signData)
{
try
{
var signer = SignerUtilities.GetSigner("SHA1withRSA");
var publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(StrToToHexByte(publicKey));
signer.Init(false, publicKeyParam);
var signBytes = StrToToHexByte(signData);
var plainBytes = Encoding.UTF8.GetBytes(content);
signer.BlockUpdate(plainBytes, 0, plainBytes.Length);
var ret = signer.VerifySignature(signBytes);
return ret;
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// 字符串转16进制字节数组
/// </summary>
/// <param name="hexString"></param>
/// <returns></returns>
private static byte[] StrToToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
return returnBytes;
}
/// <summary>
/// 字节数组转16进制字符串
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static string ByteToHexStr(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2");
}
}
return returnStr;
}
}
示例代码:
var content = "123";
var privateKey = RSAHelper.ByteToHexStr(Convert.FromBase64String("MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEA051JxQSrpN2cgI/fbCFjsALy7G055ichin5FF9qZ6VcdOa4/+V80FMLhR6ifRD2Sb/4qR0pMLnfkJadKBFM/QwIDAQABAkBMV3MUk6HEoXpjWwQUQ1tuVTIEH0eDA1zzVKhieaeK6Q1q4CiqJJ3fMkSTxgQZc6Wy11USJa6cRkYul4hsssddccBAiEA9Iiu7kxwbUE3DNnPzYi7st++fyo2ch9Wh2jF9BQB0YMCIQDdiXK/Y7673ucqBZdVpECJgp3DKCKlJPtfpuRmbSIvQQIhAM0IBdSclu+kbKoDvu7QpMCYRbuOA1Sw3fZvbPr4A4ZNAiBxcakpCNLrMcH+as6MNIg34oMXJL5ZAw8WdEgRi2EuAQIhALx6SB/hoTg91dGPd/Ql6pvRQaEG+HWda2yrW8fd41ot"));
var publicKey = RSAHelper.ByteToHexStr(Convert.FromBase64String("MFwwDQYJKoZIhvcNAQEBBQADSwAweniiO2ndANOdScUEq6TdnICP32whY7AC8uxtOeYnIYp+RRfamelXHTmuP/lfNBTC4Ueon0Q9km/+KkdKTC535CWnSgRTP0MCAwEAAQ=="));
var signData = RSAHelper.RsaSign(content, privateKey);
var result= RSAHelper.VerifySign(content, publicKey, signData);
注:publicKey
和privateKey
为 16 进制编码的公私钥对。
.NET Core RSA 签名和验签(密钥为 16 进制编码)的更多相关文章
- Delphi RSA签名与验签【支持SHA1WithRSA(RSA1)、SHA256WithRSA(RSA2)和MD5WithRSA签名与验签】
作者QQ:(648437169) 点击下载➨ RSA签名与验签 [delphi RSA签名与验签]支持3种方式签名与验签(SHA1WithRSA(RSA1).SHA256WithRSA(RSA2)和M ...
- erlang的RSA签名与验签
1.RSA介绍 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对 其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而 ...
- .Net C# RSA签名和验签重写
namespace com._80community.unittest.CUP { /// <summary> /// CUP Client /// </summary> pu ...
- .Net C# RSA签名和验签
帮助类 using System; using System.Text; using System.IO; using System.Security.Cryptography; namespace ...
- java/php/c#版rsa签名以及验签实现
本文为转载,请转载请注明地址: 原文地址为 http://xw-z1985.iteye.com/blog/1837376 在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的 ...
- RSA签名、验签、加密、解密
最近在做一个项目,与一个支付渠道进行连接进行充值,为了安全,每个接口访问时,都要先登陆(调用登陆接口),拿到一个sessionKey,后续业务接口内容用它来进行3DES加密处理.而登陆需要用到RSA进 ...
- RSA签名和验签Util
目录 1.DigitalSign类 2.CryptException异常类 3.加签示例 1.DigitalSign类 import org.apache.commons.codec.binary.B ...
- .NET RSA解密、签名、验签
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Sec ...
- RSA后台签名前台验签的应用(前台采用jsrsasign库)
写在前面 安全测试需要, 为防止后台响应数据返给前台过程中被篡改前台再拿被篡改后的数据进行接下来的操作影响正常业务, 决定采用RSA对响应数据进行签名和验签, 于是有了这篇<RSA后台签名前台验 ...
随机推荐
- iOS 从实际出发理解多线程
前言 多线程很多开发者多多少少相信也都有了解,以前有些东西理解的不是很透,慢慢的积累之后,这方面的东西也需要自己好好的总结一下.多线程从我刚接触到iOS的时候就知道这玩意挺重要的,但那时也是能力有限, ...
- #UnityTips# 2017.11.14
hi,all.最近比较忙,所以更新也比较慢了. 今天就来和大家分享一个小Tip,它是关于UGUI的坑的. 使用过UGUI的朋友们都知道,Canvas的渲染方式有三种: Screen Space Ove ...
- C# Ioc容器Unity,简单实用
开头先吐槽一下博客园超级不好用,添加图片后就写不动字了,难道是bug 好进入正题,先来说下依赖注入,简单来说就是定义好接口,上层代码调用接口,具体实现通过配置文件方式去指定具体实现类. 首先我们需要通 ...
- Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors...java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are
先将异常信息贴出: 该问题是tomcat进行http request解析的时候报的错,网上的解决办法主要是修改Tomcat的server.xml,在<Connector port="8 ...
- linux操作系统基础篇(六)
linux服务篇 1.samba服务的搭建 samba的功能: samba是一个网络服务器,用于Linux和Windows之间共享文件.2. samba服务的启动.停止.重启service smb s ...
- 前端面试题(3) cookie,sessionStorage和localStorage的区别
cookie是网站为了标示用户身份存在用户本地终端上的数据(经过加密). cookie数据时钟在同源的http请求中携带(即使不需要),即会在浏览器和服务器之间传递. seeeionStorage和l ...
- RabbitMQ之Topics(多规则路由)
Exchange中基于direct类型无法基于多种规则进行路由. 例如分析syslog日志,不仅需要基于severity(info/warning/critical/error)进行路由,还需要基于a ...
- MySQL阿里云安装问题小记
1. [root@iZ2zeg11g0cdei5171kqskZ mysql]# ./scripts/mysql_install_db --user=mysql FATAL ERROR: please ...
- sockt初级了解 感悟 一起打怪升级偶
刚接触来谈谈对sockt基础的一点理解,多线性下次再发.也逛了逛博客,有一篇基础讲的停息在这推荐下sockt套接字编程全绍辉 首先贴下代码#服务器 import socket skt=socket.s ...
- swaggerui在asp.net web api core 中的应用
Swaggerui 可以为我们的webapi提供美观的在线文档,如下图: 实现步骤: NuGet Packages Install-Package Swashbuckle.AspNetCore 在s ...