RSA 签名-PKCS1

2024-06-17 09:38
文章标签 签名 rsa pkcs1

本文主要是介绍RSA 签名-PKCS1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前段时间做东西做的很杂,现在从新整理归类下,以便于进一步加深知识点。

针对于RSA签名来说,首先需要公钥,私钥

我现在用的是PKCS1格式的公钥私钥,也就是密钥格式为非Java适用的

1:生成公钥私钥,我直接使用的是支付宝官网上下载的RSA签名/验签的工具。

string privateKeyPem = "MIIEpAIBAAKCAQEAxEZE8RRghiP/IKw36x8L9qOX3RE1pU70A+4KirahmUJQrhQ2ow8e09gZkkeRnKKZA5fwq94x8rIW1IN06iAgbAax5H7Q6rUniBp672eEvxbCzp2p6kT7D/lcqlzLDBUO/fCGr2HXHc1L1DHkv4fCS58ac82IzVQ1ZS5S+m+awBXaKstf84MbRIFPcg8YkLGLC7YIqYzGtHWg5ksF1HK8uIEBZUxT9932VuNrR9j/QBB6yT06/BvTrdf0R7iIAklmELbZL8l/IRpNVqMEsvgzw/Tl6KI3FfiN5/kC0oe9dXWn8iwYb4jlu/gSADQNrpd93YoRMQg1i+uGgaIh8yiX/wIDAQABAoIBAFzfr1GwRbhToi6wr0kXiM6tPHgD47GUOYz+f4iBwNfHdGva7rubtQejEv6P1QwcOHFl3SFGY7YmpPzsM09x4kWbqWOoymy1Sb5yYUeVYVAWkhm4qyVKfM5jPYDzpbTS5iQtQ14L2wGkGkSPU2F5+OtVnuu7Dwex2A5HrEYKt1w6Zpv10uT1RLcpYWwRV6c+5RTQIgc92VXdqDZ9fZuqAhO86K2ypNkpalv9+sAzDUKzNyO05qHmbNTAVKmudY4rLfEl9TRqmFMIor5yRNdieX2/QE0kLdUb+gwdiFdgkKg+ERT8RLB878l+jtjtJk6q3MYd5yTmurfnnsRvMHeCtoECgYEA6CoO5KvVoX8dnk3cS57Y6QkqGC/00CoDBJoNse36LYaMu85/W49K5RiZNCB3SLvqKGJkHLaNX4qVj6MScb4yr5ZDlSE2vY5FNgLih8MTbK9stkOLl0ut53fMPlwEmyOm+/mdJxumbskuy90ox50Z3RpDBXUiq2bp1wTUlhT8fEECgYEA2GzsqwE14MIxouGOglixQuvkjSEsgmsNsNwx71GEuKeOlOY+1DP8sh20Pxw9J8l20av8Cv1GJi7bQiDawtN9qWQnai0Rw3eQ5bRxtxSzYUSN4brLoGHXSIkGu3UTnXrBS7czFym4cZhyiu5ici1RQMOV6+dehZMA4zBgkjXVBD8CgYEArR43jtKHcW5dQp8ihw0DB/o6dmDEN7ksGPFbBvPCmtH6/UxE8ZxPJ7gI/bK73/On7sc3iaWik7y+O6ZI6aH/H6l36asjq4N8HoNWMhAH2wKQmPSTEZVwLurI1TM+iAS0zq3aPsBCgdfo2kGm1/pQv+uGUHqBCLir5BcJAoTRpUECgYBHfFsD9Odl8N7STSx0M3WBhEc+snlwLoocI+8+fC+ZiobW+eJA11cdQiB6RAqTLMFZajRbMONN02ZKxm1bst2r6M/4CyD17nVm2h5Bec3yT+GJcNi3hfnFFLWrj3VGK/jS2JVAjmBE7TTQXQMZcYyIFtJbVFXtSuwdHqqXQL62owKBgQCWQcCmRNu8hTve8qUrY/qcpOThAw2jEzW4UYW9PcwaMbv8pffEFBnyUhuEdXI5BP7bEBLgPfYZofinqvDLl+5sMfZt8kvN3AE14T2bAKRU11/25gK+y32wVIwk497UF2G0YtIbozu5HqMHU+elxawJJQ/5C+SrpjEOC6Hj5jrNYg==";
string publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxEZE8RRghiP/IKw36x8L9qOX3RE1pU70A+4KirahmUJQrhQ2ow8e09gZkkeRnKKZA5fwq94x8rIW1IN06iAgbAax5H7Q6rUniBp672eEvxbCzp2p6kT7D/lcqlzLDBUO/fCGr2HXHc1L1DHkv4fCS58ac82IzVQ1ZS5S+m+awBXaKstf84MbRIFPcg8YkLGLC7YIqYzGtHWg5ksF1HK8uIEBZUxT9932VuNrR9j/QBB6yT06/BvTrdf0R7iIAklmELbZL8l/IRpNVqMEsvgzw/Tl6KI3FfiN5/kC0oe9dXWn8iwYb4jlu/gSADQNrpd93YoRMQg1i+uGgaIh8yiX/wIDAQAB";
string signType = "RSA2";

 记得要对公钥私钥去空格换行操作哦

2:生成待签字符串

//待签集合
Dictionary<string, string> ParamInfo = new Dictionary<string, string>();
ParamInfo.Add("timestamp","20191112135000");
ParamInfo.Add("noncestr","123sdsf");
ParamInfo.Add("name", "张三");
//对报文中出现签名域(signature)之外的所有数据元按照key的ascii顺序排序,然后以&作为连接符拼接成待签名串。
string signContent = SignUtil.GetSignContent(ParamInfo);

3:签名

string signatureNew = string.Empty;
signatureNew = SignUtil.RSASignCharSet(signContent, privateKeyPem, null, false, signType);

4:验签-不在签名步骤内。。。

bool check = false;
check = SignUtil.RSACheck(signContent, signatureNew, publicKey, null, false, signType);

check 为true 标识验签成功,false 表示 失败。 

5:把签名放入报文集合中!这样整个报文才算签名完成。

 

签名所需要的类SignUtil (支持RSA,RSA2的签名及验签)

 public class SignUtil{/** 默认编码字符集 */private static string DEFAULT_CHARSET = "UTF-8";/// <summary>/// 待签字符串/// </summary>/// <param name="parameters"></param>/// <returns></returns>public static string GetSignContent(IDictionary<string, string> parameters){// 第一步:把字典按Key的字母顺序排序IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();// 第二步:把所有参数名和参数值串在一起StringBuilder query = new StringBuilder("");while (dem.MoveNext()){string key = dem.Current.Key;string value = dem.Current.Value;if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value)){query.Append(key).Append("=").Append(value).Append("&");}}string content = query.ToString().Substring(0, query.Length - 1);return content;}/// <summary>/// 签名/// </summary>/// <param name="parameters">待签集合</param>/// <param name="privateKeyPem">私钥 默认为文件</param>/// <param name="charset">编码类型 默认为UTF-8</param>/// <param name="signType">签名类型 RSA、RSA2</param>/// <returns></returns>public static string RSASign(IDictionary<string, string> parameters, string privateKeyPem, string charset, string signType){string signContent = GetSignContent(parameters);return RSASignCharSet(signContent, privateKeyPem, charset, signType);}/// <summary>/// 签名/// </summary>/// <param name="data">待签字符串</param>/// <param name="privateKeyPem">私钥</param>/// <param name="charset">编码类型 默认为UTF-8</param>/// <param name="signType">签名类型 RSA、RSA2</param>/// <returns></returns>public static string RSASign(string data, string privateKeyPem, string charset, string signType){return RSASignCharSet(data, privateKeyPem, charset, signType);}/// <summary>/// 签名/// </summary>/// <param name="parameters">待签集合</param>/// <param name="privateKeyPem">私钥</param>/// <param name="charset">编码类型 默认为UTF-8</param>/// <param name="keyFromFile">私钥类型 true:文件读取;false:字符串读取</param>/// <param name="signType">签名类型 RSA、RSA2</param>/// <returns></returns>public static string RSASign(IDictionary<string, string> parameters, string privateKeyPem, string charset, bool keyFromFile, string signType){string signContent = GetSignContent(parameters);return RSASignCharSet(signContent, privateKeyPem, charset, keyFromFile, signType);}public static string RSASignCharSet(string data, string privateKeyPem, string charset, string signType){RSACryptoServiceProvider rsaCsp = LoadCertificateFile(privateKeyPem, signType);byte[] dataBytes = null;if (string.IsNullOrEmpty(charset)){

这篇关于RSA 签名-PKCS1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069097

相关文章

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,

加减密签名

签名,验签的理解(转)图片理解数字签名和验签过程

app提交到腾讯开发平台,提示无法获取签名信息,请上传有效包(110506)

最近提交APP时遇到的,一般情况下是因为打包时至勾选v2没有勾选v1的原因,如下图: 这个时候将v1勾选即可。 但是在打包时ˉv1和v2都勾选了也可能会出现这个报错,那就要看一下gradle的 minSdkVersion,如果这个版本在24-26之间也可能会提示这个错误,所以降低这个版本就可以了

okHttp框架的介绍 和关于https的自定义签名证书的问题

参考博客:【张鸿洋的博客】 Android Https相关完全解析 当OkHttp遇到Https 1.okhttp的介绍:  它能够处理: 一般的get请求一般的post请求基于Http的文件上传文件下载加载图片支持请求回调,直接返回对象、对象集合支持session的保持 开发平台使用:     使用前,对于Android Studio的用户,可以选择添加: compile '

apk中签名文件探究(*.SF, *.MF,*.RSA)

文章来源: 作者:嘟嘟小灰 链接:https://www.jianshu.com/p/e07da93acf98 来源:简书 1、取一个apk,然后进行不同签名,生成1.apk、2.apk,并提取META-INF里面的文件进行比对 def calc_sha1(data):sha1obj = hashlib.sha1()if not isinstance(data, (bytear

NX客户没有开发许可,需要注册签名

报错提示,库缺少需要的入口 在允许程序后,在NX日志中可以看到,注册许可失败 1、正对C的代码觉得不存在需要注册的情况如果需要注册添加对应的CPP文件,用NXopen下的EXE签名 2、C#的代码如果客户没有开发许可需求注册,用NXBIN下EXE签名 两种签名的EXE不同。

Android APK获取平台系统签名权限

1.修改AndroidManifest.xml,改变uid为android.uid.system,使之与Settings能够共享数据空间。 <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.txx.tes

ssh登录服务器报错“no matching host key type found. Their offer: ssh-rsa,ssh-dss”解决方法

这个错误表明你尝试使用 ssh 连接到远程服务器时,客户端和服务器之间没有匹配的 host key 类型。具体来说,远程服务器提供了 ssh-rsa 和 ssh-dss 类型的 host key,但你的 SSH 客户端配置可能不再支持这些较旧的算法。最近的 OpenSSH 版本默认禁用了不够安全的算法,如 ssh-rsa 和 ssh-dss。 解决方法 临时启用 ssh-rsa: 你可以在

微信小程序手写签名

微信小程序手写签名组件 该组件基于signature_pad封装,signature_pad本身是web端的插件,此处将插件代码修改为小程序端可用。 signature_pad.js /*!* Signature Pad v5.0.3 | https://github.com/szimek/signature_pad* (c) 2024 Szymon Nowak | Released