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

相关文章

20170723 做的事 ecdsa的签名验证时间短于bls signature

1 今天在虚拟机 /home/smile/Desktop/20170610/Test//time_ecdsa 文件夹下,找到ecdsa的验证时间是 989.060606μs μs 先 make ,然后run。 再取BLS的签名生成时间: ./run  2  gnuplot 画图,画对比的时间 gnuplot 画图参考教程 http://blog.sciencen

常用加密算法之 RSA 简介及应用

引言 相关博文: Spring Boot 开发 – 常用加密算法简介(一)常用加密算法之 SM4 简介及应用 一、RSA算法简介 RSA (Rivest-Shamir-Adleman) 算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年发明。它基于大数质因数分解的困难性,提供了一种安全的数据加密和解密方法。 1. 密钥生成

APK签名校验绕过

将APK重命名为zip文件,然后可以看到有个META-INF的文件夹,里面有三个文件,分别名为MANIFEST.MF、CERT.SF和CERT.RSA,这些就是使用signapk.jar生成的签名文件。 1、 MANIFEST.MF文件: 程序遍历update.apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再用Base64进行编码。具体代

RSA非对称的加密算法

首先RSA是一个非对称的加密算法,所以在使用该算法加密解密之前,必须先行生成密钥对,包括公钥和私钥 JDK中提供了生成密钥对的类KeyPairGenerator,实例如下: public static Map<String, Object> genKeyPair() throws Exception {   // 获取公钥私钥密钥对的生成器   KeyPairGenerator kpg

python3 rsa加密

加密首先要有public key,如果加密后的内容用来做http请求,可能还需要对其quote一下。 def test():public_key = """-----BEGIN PUBLIC KEY-----*******MIICIjANBgkqhkiG9w*******-----END PUBLIC KEY-----"""import rsaimport base64from urlli

RSA加密解密教程

RSA算法简介: RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(RonRSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在

RSA —非对称加密算法

常见的数字加密方式分为两类:对称加密 和 非对称加密。       对称加密,又称为私钥加密,指的是加密和解密使用同一个密钥的方式。其特点是加密和解密过程简单、快速,并且只需要一个密钥。常见的对称加密算法包括DES、AES等。然而,由于使用的是同一个密钥,如果密钥被黑客拦截,信息就很容易被破译。        非对称加密,又称为公钥加密,是指使用一对非对称密钥进行加密的方式,其中一个密钥是公钥

RSA密码系统的特定密钥泄露攻击与Coppersmith方法的应用

PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。 RSA密码系统作为当前最广泛使用的公钥加密算法之一,其安全性依赖于大整数分解问题的困难性。然而,随着计算能力的提高和算法优化,特别是Coppersmith方法的出现,使得在特定条件下对RSA系统进行密钥恢复成为可能。本文将深入探讨Coppersmith方法

java jni 入门5 - 编码签名 以及 javap命令的使用

参考:《Java核心技术 卷II:高级特性》第12章 本地方法 #################################################################### 为了访问实例域和调用Java编程语言中定义的方法,必须学习“编入”数据类型的名称和方法签名的规则(方法签名描述了参数和该方法返回值的类型)。 编码方案如下: 编码方案 B

Java虚拟机安全之——代码签名和认证技术(恭喜RNG,WE)

前言 临近毕业,主要忙于手头实习跟论文了,实在觉得有点对不起各位看官了,写的少了,但是我会一直坚持下的,等论文写完以后,还是会坚持写更多的有趣的东西,在工作中,我希望也是边学习边记录,日后,这里会有更多大家意想不到的~今天S7半决赛,恭喜RNG,WE,哈哈,每个男生都有一个电竞梦,这是真哒,虽然因为学习告别好久了,但是总决赛还是会关注的哈!看我知道我习惯每天一段唠嗑哈,就是想跟大家说说话。