数字签名算法之RSA
数字签名算法之RSA
- 1.数字签名简述
- 2. 模型分析
- 3. 代码实现
- 3.1 签名算法实现
- 3.2 测试代码
- 3.3 运行结果
1.数字签名简述
数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。也就是说数字签名算法是非对称加密算法和消息摘要算法的结合体。
数字签名算法是公钥基础设施(PKI)以及许多网络安全机制(SSL/TLS、VPN等)的基础。
数字签名算法能够验证数据的完整性、认证性以及抗否认性。
数字签名算法遵循“私钥签名,公钥验证” 的签名/验证方式。
数字签名算法主要包括 RSA、DSA和ECDSA共3种算法。其中,RSA算法源于整数因子分解问题,DSA和ECDSA算法源于离散对数问题。
RSA既是加密/解密算法, 也是签名算法。
DSA只有签名算法,其基于DSS算法。
ECDSA算法是ECC算法与DSA算法的结合,想对于传统签名算法,具有速度快、强度高、签名短等优点,被广泛应用。
2. 模型分析
Alice作为发送方,Bob作为接收方,交互流程如下所示。
3. 代码实现
Java与Bouncy Castle对RSA签名算法均有实现,具体细节如下表所示。
算法 | 密钥长度 | 密钥长度默认值 | 签名长度 | 备注 |
---|---|---|---|---|
MD2withRSA、MD5withRSA、SHA1withRSA | 512~65536位(密钥长度必须是64的倍数) | 1024 | 与密钥长度相同 | Java |
SHA224withRSA、SHA256withRSA、SHA384withRSA、SHA512withRSA 、RIPEMD128withRSA、RIPEMD160withRSA | 512~65536位(密钥长度必须是64的倍数) | 2048 | 与密钥长度相同 | Bouncy Castle实现 |
3.1 签名算法实现
下面是Java对RSA数字签名的实现
/*** 数字签名密钥算法*/public static final String KEY_ALGORITHM = "RSA";/*** 数字签名* 签名/验证算法*/public static final String SIGNATURE_ALGORITHM = "MD5withRSA";//公钥 Map Keyprivate static final String PUBLIC_KEY = "RSAPublicKey";//私钥Map keyprivate static final String PRIVATE_KEY = "RSAPrivateKey";/*** RSA密钥长度,默认1024位,密钥长度必须是64的倍数,范围512~65536位之间*/private static final int KEY_SIZE = 512;public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {//转换私钥材料PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey);//实例化密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//取私钥对象PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);//实例化SignatureSignature signature = Signature.getInstance(SIGNATURE_ALGORITHM);//初始化Signaturesignature.initSign(priKey);//更新signature.update(data);//签名return signature.sign();}public static boolean verity(byte[] data, byte[] publicKey, byte[] sign) throws Exception{//转换公钥材料X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);//实例化密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成公钥PublicKey pubKey = keyFactory.generatePublic(keySpec);//实例化SignatureSignature signature = Signature.getInstance(SIGNATURE_ALGORITHM);//初始化Signaturesignature.initVerify(pubKey);//更新signature.update(data);//校验证return signature.verify(sign);}
3.2 测试代码
@Testpublic void rsaSignTest() throws Exception {//初始化密钥Map<String, Object> keyMap = RSACoder.initKey();byte[] publicKey = RSACoder.getPublicKey(keyMap);byte[] privateKey = RSACoder.getPrivateKey(keyMap);System.out.println("公钥:\n"+Base64.encodeToString(publicKey, Base64.DEFAULT));System.out.println("私钥:\n"+Base64.encodeToString(privateKey, Base64.DEFAULT));String inputStr = "RSA数字签名";byte[] data = inputStr.getBytes();//产生签名byte[] sign = RSACoder.sign(data, privateKey);System.out.println("签名:\t"+ Hex.toHexString(sign));//验证签名boolean status = RSACoder.verity(data, publicKey, sign);System.out.println("验签状态:\t"+ status);assertTrue(status);}
3.3 运行结果
2020-10-21 14:28:20.130 15667-15682/com.calvin.android.demo2 I/System.out: 公钥:
2020-10-21 14:28:20.130 15667-15682/com.calvin.android.demo2 I/System.out: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALVI158wtZj4N7Fhndfr0SxspYaoVJAYTcgR1czsgnTy
2020-10-21 14:28:20.130 15667-15682/com.calvin.android.demo2 I/System.out: Qz0cjuyVWqXFlxK3ZitLvuzuQqEKAHZkBSggBPxA660CAwEAAQ==
2020-10-21 14:28:20.130 15667-15682/com.calvin.android.demo2 I/System.out: 私钥:
2020-10-21 14:28:20.130 15667-15682/com.calvin.android.demo2 I/System.out: MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAtUjXnzC1mPg3sWGd1+vRLGylhqhU
2020-10-21 14:28:20.130 15667-15682/com.calvin.android.demo2 I/System.out: kBhNyBHVzOyCdPJDPRyO7JVapcWXErdmK0u+7O5CoQoAdmQFKCAE/EDrrQIDAQABAkEApjyaxXbE
2020-10-21 14:28:20.130 15667-15682/com.calvin.android.demo2 I/System.out: P/b2EynhtXugf61NiJLZoJ04zktUlCsZYiSu2V575e1uRahiv9Z9tO6otYbBQDb8DwtdjlgH0usw
2020-10-21 14:28:20.131 15667-15682/com.calvin.android.demo2 I/System.out: 4QIhANlMi777d9j+QVB1tw16FblEXm1YFBAW4WxAoAtFkM4ZAiEA1ZJD+A3wlhNLe5L9Zo9t7dHm
2020-10-21 14:28:20.131 15667-15682/com.calvin.android.demo2 I/System.out: qlrlyxDY5MOBq40XVLUCIFylfDeTM8f6r5JEfiVq1fRFqBTqprMtbjMfYp0rrc+RAiBPDGkt6fLv
2020-10-21 14:28:20.131 15667-15682/com.calvin.android.demo2 I/System.out: iUq5/WjfSh01FijbSvOc2qp82cQn+/vztQIhAIe/Rez3m7xmEzvL45IOVxfw7x0dwexDXdGdIIjo
2020-10-21 14:28:20.131 15667-15682/com.calvin.android.demo2 I/System.out: o9ak
2020-10-21 14:28:20.135 15667-15682/com.calvin.android.demo2 I/System.out: 签名: 612945943b56154cc6dce2bb13597ca734f6be79ea6e86191d34378271143a65405feeb9cbec9a1327166efa285ca117123a5bb26f0eb900e161b3ceb7b35224
2020-10-21 14:28:20.136 15667-15682/com.calvin.android.demo2 I/System.out: 验签状态: true
数字签名算法之RSA相关推荐
- java签名算法阻止 设置_java数字签名算法之RSA
© 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml xsi:schemaLocation="http://maven.apache.org/POM/4. ...
- 信息安全实验六:RSA数字签名算法 2019.06.01
实验六:RSA数字签名算法 一.实验目的 理解.掌握RAS数字签名算法的基本过程. 二.实验内容 熟悉MPIR大整数运算库函数的调用. 熟悉MD5散列的调用. 利用MPIR大整数运算库函数,实现RSA ...
- ecdsa JAVA 私钥推导公钥_ECDSA(椭圆曲线数字签名算法)
ECDSA(Elliptic Curve Digital Signature Algorithm) 一.学习背景--数字签名 在现实工作和生活中,我们使用签名的方式表达对一份文件的认可,其他人可以识别 ...
- 数字签名算法---加密学习笔记(五)
介绍 签名:就有安全性,抗否认性 数字签名:带有密钥(公钥,私钥)的消息摘要算法 作用: 1. 验证数据的完整性 2. 认证数据来源 3. 抗否认 数字签名遵循:私钥签名,公钥验证 常用的数字签名算法 ...
- Java之数字签名算法
目录 数字签名算法概述 数字签名算法--RSA DSA算法列表:MD.SHA两类 主要流程: 代码实现: 数字签名算法--DSA DSA算法列表: 主要流程: 代码实现: 数字签名算法--ECDSA ...
- 几种常见的数字签名算法比较
原文链接:数字签名算法介绍和区别 summary: 数字签名是一个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,用于验证数据完整性.认证数据来源和抗否认,遵循OSI参考模型.私钥签名和公钥验证.也 ...
- 国际 数字签名算法介绍和区别
数字签名是一个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,用于验证数据完整性.认证数据来源和抗否认,遵循OSI参考模型.私钥签名和公钥验证.也是非对称加密算法和消息摘要算法的结合体,常见的数字签 ...
- java rsa数字签名_RSA 数字签名算法(Java版)
数字签名算法Java版 还是上代码吧 public static final String SIGN_ALGORITHMS = "SHA1WithRSA"; /** * RSA签名 ...
- RSA 数字签名算法(Java版)
数字签名算法Java版 还是上代码吧 public static final String SIGN_ALGORITHMS = "SHA1WithRSA";/*** RSA签名* ...
最新文章
- 什么是网络推广浅析如何提高搜索引擎的抓取频次?
- 财务大数据比赛有python吗-【教改实验班简介】财务大数据分析班
- java rest 图_SpringMVC视图及REST风格
- 【小题目】 输出分数对应的等级 >=90-A >=80-B >=70-C >=60-D <60-E,从控制台获取数据
- 如何从心理上缓解对浑浊物的恐惧?
- 前端学习(1975)vue之电商管理系统电商系统之渲染参数下的可选项
- Docker创建一个镜像
- mfc打开指定路径下指定类型文件_Windows 网络编程:文件操作
- git tag打标签常用命令
- Java:多线程,线程池,用Executors静态工厂生成常用线程池
- Redis知识点笔记总结
- layui select下拉框选项不显示
- CF567C Geometric Progression
- torchtext field.build_vocab问题
- Localization of Classified Objects in SLAM using NonparametricStatistics and Clustering(2018,IROS)
- 自制表情包!android,PicsArt定制专属表情包-PicsArt表情包自制软件下载-乐游网安卓下载...
- linux查找以c开头的的文件夹,【Linux】 find指令(文件查找)
- 西电杨宗凯调研计算机学院,西安电子科技大学校长杨宗凯到网络与继续教育学院调研指导工作...
- Windows10如何配置java环境
- Python 人脸识别有多简单 ?一个库直接进行提取、识别、操作人脸