在java中创建RSA的签名可以使用

java.security.Signature.getInstance("SHA1WithRSA");

创建的示例。从字面上可以看出这个算法在做RSA签名之前要做SHA1的哈希计算,这是因为对于一个秘钥长度不超过1024位的RSA来说,内容长度不能超过117个字节,对于签名来说密文是不需要被解密成明文的,因此可以是用摘要算法。

在这个问题中,生成的私钥和公钥如下命令来生成的,基于openssl:

生成RSA私钥:openssl>genrsa -out rsa_private_key.pem 1024

生成RSA公钥:openssl>rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

用Java语言开发需要将私钥转换成PKCS8格式:openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

最后一步把生成的内容保存到rsa_private_pkcs8_key.pem文件中。

因为.NET中提供的RSA算法无法直接使用openssl生成的秘钥,因此这里使用了BouncyCastle的.NET版本(可在nuget中直接安装)

第一步:读取秘钥

BouncyCastle可以读取pkcs8格式的和openssl直接生成的秘钥文件。

openssl直接生成的秘钥内容中包含了一对秘钥(私钥和公钥),读取的时候我们只提取私钥:

using (var reader = new StreamReader(File.OpenRead("D:\\rsa_private_key.pem"))) {var privateKey = (new PemReader(reader).ReadObject() as AsymmetricCipherKeyPair).Private;
}

pkcs8的内容中只包含私钥:

using (var reader = new StreamReader(File.OpenRead("D:\\rsa_private_pkcs8_key.pem"))) {var privateKey = new PemReader(reader).ReadObject() as RsaPrivateCrtKeyParameters;
}

第二步:加密内容

内容加密的代码和Java中的类似。

public static byte[] Sign(ICipherParameters privateKey, byte[] data, int offset, int length) {var signer = SignerUtilities.GetSigner("SHA1withRSA");signer.Init(true, privateKey);signer.BlockUpdate(data, offset, length);return signer.GenerateSignature();
}

第三步:读取公钥

这里要提醒一下RSA的基本原理,加密用私钥,解密用公钥。那么对签名进行验证时也要使用公钥,很显然如果使用私钥验证那么私钥就要暴露给对方,这是不满足签名算法的要求的。

这里读取公钥:

using (var reader = new StreamReader(File.OpenRead("D:\\rsa_public_key.pem"))) {var publicKey = new PemReader(reader).ReadObject() as RsaKeyParameters;
}

第四步:签名验证

public static bool Verify(ICipherParameters publicKey, byte[] signature, byte[] data, int offset, int length) {var signer = SignerUtilities.GetSigner("SHA1withRSA");signer.Init(false, publicKey);signer.BlockUpdate(data, offset, length);return signer.VerifySignature(signature);
}

多亏了BouncyCastle,让RSA签名在使用的时候变的这么简单。

上面就是对签名验证的步骤,即使使用Java语言生成的签名,使用上面的代码也可以正确验证。

转载于:https://www.cnblogs.com/kevin-cai/p/6654643.html

在Java中用SHA1WithRSA创建的签名如何在.NET中验证相关推荐

  1. java中用new创建一个对象的过程解析_【漫画】Java对象的创建和访问全过程详解...

    https://github.com/TangBean 漫画由小猿编写创作 仔细看下面的流程图,我们先来获取一个直观的认识,然后再一点一点的进行详细分析! 对象的创建(遇到一条 new 指令时)检查这 ...

  2. 如何用java创建超链接_Java如何在PPT中的幻灯片上创建超链接?

    在Java编程中,如何在PPT中的幻灯片上创建超链接? 注意:需要访问网址:http://poi.apache.org/download.html , 下载一个Apache POI软件包.这里下载最新 ...

  3. vue 递归创建菜单_如何在Vue中创建类似中等的突出显示菜单

    vue 递归创建菜单 by Taha Shashtari 由Taha Shashtari 如何在Vue中创建类似中等的突出显示菜单 (How to Create a Medium-Like Highl ...

  4. 如何在mysql中创建过程_如何在MySQL 中创建存储过程?

    问题阐述 自MySQL 5.0 开始,MySQL 就支持存储过程.存储过程是一些被用户定义的SQL 语句集合.一个存储程序是可以被存储在服务器中的一套SQL 语句.存储过程可以被程序.触发器或另一个存 ...

  5. 创建jira sprint_如何在Excel中创建高级sprint燃尽图

    创建jira sprint SCRUM is a great way to manage all sorts of tasks including sprints, but you don't hav ...

  6. vue在日历表上面创建事件_如何在R中创建颜色编码的日历

    vue在日历表上面创建事件 用颜色编码的日历可以快速简便地查看您是否实现了日常目标. 您是否符合销售或社交媒体帖子等日常业务指标? 或者,您如何实现个人目标,例如每天锻炼? 乍一看,您可以了解自己的工 ...

  7. 创建组groupadd_如何在Linux中创建组– groupadd命令

    创建组groupadd In this tutorial, we will learn how to create a Group in Linux using groupadd command. 在 ...

  8. matlab 创建 符号矩阵,如何在MATLAB中动态创建符号矩阵?

    我需要在MATLAB中创建一个符号矩阵.它可以静态地完成为如何在MATLAB中动态创建符号矩阵? syms a11 a12 a21 a22; A = [a11 a12; a21 a22]; 或使用紧凑 ...

  9. 在linux桌面上创建一个文本,如何在Ubuntu中创建文档

    有几种方法可以在Ubuntu中使用GUI和命令行创建文档.所有这些方法都非常简单易用.您可能早些时候已在Ubuntu中将这些方法用于其他目的.但是,在本文中,我们将向您展示在Ubuntu中创建文档的8 ...

  10. 如何在mysql中创建连接_如何在MySQL中创建新用户并开启远程连接访问?

    如何在MySQL中创建新用户并开启远程连接访问? 发布时间:2020-05-21 14:55:19 来源:亿速云 阅读:176 作者:鸽子 下面由mysql教程给大家介绍MySQL创建新用户并开启远程 ...

最新文章

  1. android 如何适配屏幕
  2. bmp转换tiff c++代码_Creative Convert for Mac(文件格式转换工具)
  3. PyTorch教程(四):维度变换
  4. 基于案例贯通 Spark Streaming 流计算框架的运行源码
  5. 树莓派外接显示器黑屏_解决树莓派使用HDMI-VGA转换器黑屏的方案
  6. Git学习系列(八)标签的管理及配置别名详解
  7. IS-IS拓展功能补充(华为设备)
  8. oracle 分析函数之分组求和、连续求和
  9. 矩阵的转置与求导运算
  10. matlab控制读取数小数位,matlab输出的数值型矩阵中如何控制小数位数,以及对齐方式?...
  11. 内存Available 是怎么计算的
  12. android 键盘 码,Android键盘输出增加按键码
  13. 怎样免费下载知网、万方数据库等文献库的文献?
  14. 编译问题追踪 :Connect to maven.google.com:443 [maven.google.com/172.217.160.110] failed: Connection timed
  15. MySQL死锁套路:一次诡异的批量插入死锁问题分析
  16. 这些论文绘图软件,你一个都不会用
  17. 《数据库系统》(二) 关系数据库
  18. CaptureScreenshot捕捉画面截图截屏
  19. MIDI 文件格式 (转)
  20. 美团点评技术与算法文章汇总,设计算法、前后端、客户端、小程序等

热门文章

  1. 西北农林科技大学计算机考研难吗,西北农林科技大学考研难吗?一般要什么水平才可以进入?...
  2. FISCO BCOS Transaction execution error合约执行失败原因
  3. 区块链 数据读权限 设计方案
  4. C++ set 多级排序 多维度排序
  5. DAG(有向无环图)有向树 转换为树
  6. 解决php导出excel 长数字变成科学计数法
  7. Unity MRTK RadialView
  8. python语法学习第二天--条件与循环
  9. 格式要求_论著的格式要求
  10. zerorpc java_Zerorpc 支持暴露多个远程Api接口类