.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后台签名前台验 ...
随机推荐
- 有关数据传输GET和POST的方法的区别
有关前后端数据交互,主要是通过走http协议通过post或get的方法,拿angularJS来说:通过JS来发送http请求调用相关接口: $scope.apostDate=function(){ $ ...
- 如何实现border-width:0.5px;
工作中遇到了一个产品需求,要求把列表分割线改成0.5px,直接写成border:0.5px solid #cccccc;是不符合规范的写法,会存在Android和IOS手机上的兼容问题,故,我们可以利 ...
- Python之上下文管理
http://www.cnblogs.com/coser/archive/2013/01/28/2880328.html 上下文管理协议为代码块提供包含初始化和清理操作的上下文环境.即便代码块发生异常 ...
- 【python】Python的单例模式
原文:http://blog.csdn.net/ghostfromheaven/article/details/7671853 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某 ...
- 深入理解js中的apply、call、bind
概述 js中的apply,call都是为了改变某个函数运行时的上下文环境而存在的,即改变函数内部的this指向. apply() apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作 ...
- JS组件系列——Gojs组件,前端图形化插件之利器
前言:之前分享过两篇关于流程画图的前端组件,使用的jsPlumb.这个组件本身还不错,使用方便.入门简单.轻量级,但是使用一段时间下来,发现一些弊病,比如组件不太稳定,初始进入页面的时候连线的样式有时 ...
- 学习爬虫的day03 (通过代理去爬去数据)
代理的IP通过去网上找# -*- coding: utf-8 -*- import re import _thread from time import sleep, ctime from urlli ...
- c语言贪吃蛇详解1.画出地图
c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...
- ajax的跨域请求
同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的 ...
- J2SE-包装类
目录 1 为什么提供包装类? 2 装箱和拆箱 3 包装类的4个特点 4 包装类类型 正文 1 为什么提供包装类? 1) 由于Java的基本数据类型功能简单,不具备面向对象的特性,实际使用时存在很多的不 ...