Java实现基于RSA的数字签名
加密与数字签名的区别
1、加密保证了数据接受方的数据安全性。加密的作用是防止泄密。
2、签名保证了数据发送方的数据安全性。签名的作用是防止篡改。
数字签名的应用
问题:在比特币中,怎么证明这个交易是你发布的?
这是就需要用到数字签名,数字签名大概可已描述为:用私钥加密,用公钥解密。发布一条交易信息:“我给xxx转了0.2个比特币”,将这条消息用自己的私钥加密,再发布出去,大众在收到这条消息后,用我的公钥验签,验证成功则说明是我发布的交易。
签名的过程与加密相反。
代码
package RSA;import org.apache.commons.codec.binary.Base64;import java.io.BufferedReader;
import java.io.FileReader;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;/*** @author WuYongheng* @date 2022/11/22* @description 数字签名 RSA*/
public class RsaSignature {//数字签名 - 签名验证算法private static final String SIGNATRUE_ALGORITHM = "MD5withRSA";//数字签名 - RSA算法private static final String KEY_ALGORITHM = "RSA";//私钥private static final String PRIVATEKEY = "RSAPrivateKey";//公钥private static final String PUBLICKEY = "RSAPublicKey";/*** RSA长度* 默认是 1024* 必须是 64的倍数* 范围:512 - 65536*/private static final int KeySize = 512; // 512 位 2进制,128 位 16进制/*** 初始化** @return map* @throws Exception*/public static Map<String, Object> initKey() throws Exception {//实例化,生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);//初始化keyPairGenerator.initialize(KeySize);//获取公私钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();//获取私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//获取公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();Map<String, Object> map = new HashMap<String, Object>();map.put(PRIVATEKEY, privateKey);map.put(PUBLICKEY, publicKey);return map;}/*** 取得公钥** @param map* @return byte[]*/public static byte[] getPublicKey(Map<String, Object> map) {PublicKey publicKey = (PublicKey) map.get(PUBLICKEY);return publicKey.getEncoded();}/*** 取得私钥** @param map* @return byte[]*/public static byte[] getPrivateKey(Map<String, Object> map) {PrivateKey privateKey = (PrivateKey) map.get(PRIVATEKEY);return privateKey.getEncoded();}/*** 私钥加密** @param source 数据* @param key 私钥* @return 签名* @throws Exception*/public static String sign(String source, byte[] key) throws Exception {byte[] data = source.getBytes("utf-8");// 取得私钥PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 生成私钥PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);//新增: 实例化 签名对象Signature signature = Signature.getInstance(SIGNATRUE_ALGORITHM);//初始化 私钥signature.initSign(privateKey);//更新签名signature.update(data);byte[] enSign = signature.sign();return Base64.encodeBase64String(enSign);}/*** 校验** @param source 源数据* @param key 公钥* @param signStr 已签名的数据* @return true or false* @throws Exception*/public static boolean verify(String source, byte[] key, String signStr) throws Exception {// 还原即将 解密的 数据源byte[] data = source.getBytes("utf-8");// 还原已签名数据byte[] signData = Base64.decodeBase64(signStr);// 取得公钥X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 生成公钥PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);//新增: 实例化 签名对象Signature signature = Signature.getInstance(SIGNATRUE_ALGORITHM);//初始化 校验公钥signature.initVerify(publicKey);//更新签名signature.update(data);//验证return signature.verify(signData);}public static void main(String[] args) throws Exception {Map<String, Object> keyMap = initKey();byte[] privateKey = getPrivateKey(keyMap);byte[] publicKey = getPublicKey(keyMap);System.out.println("获取的私钥:" + Base64.encodeBase64String(privateKey));System.out.println("获取的公钥:" + Base64.encodeBase64String(publicKey));String source = "";//需要签名文件的内容String fileName = "D:\\code\\aaa.txt";try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {String line;while ((line = br.readLine()) != null) {System.out.println("文件内容是: " + line);source = line;}}System.out.println("需要签名的文件内容是: " + source);String sign = sign(source, privateKey);System.out.println("签名后:" + sign);boolean flat = verify(source, publicKey, sign);System.out.println("校验结果:" + flat);}
}
效果
Java实现基于RSA的数字签名相关推荐
- python基于rsa的数字签名实现_OpenSSL和Python实现RSA Key数字签名和验证
OpenSSL和Python实现RSA Key数字签名和验证,基于非对称算法的RSA Key主要有两个用途,数字签名和验证(私钥签名,公钥验证),以及非对称加解密(公钥加密,私钥解密).本文提供一个基 ...
- 基于RSA的数字签名设计与实现
信息安全课程的第二个实验,主要是用java.js,前端页面用的html写的. 页面成果展示: 基本公私钥生成 实验环境为win10系统,使用git命令行工具--git bash生成公私钥.生成私钥,密 ...
- python基于rsa的数字签名实现_青岛宽客聚会期权定价公式基于python的实现
点击上方蓝字,关注宽客空间 2020年8月16日,宽客空间走进石岭资产,参加了青岛宽客聚会的活动.本次活动分享题目为<期权定价公式基于python的实现>.本次活动的主讲人是来自青岛石岭资 ...
- C#毕业设计——基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码)——数字签名系统
基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于MD5+RSA的数字签名设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告PPT模板及论 ...
- 基于RSA的公钥基础体系下安全通信实战
目录 简说RSA 服务器的初始密钥对和认证请求 证书认证机构CA 服务器安装CA签名证书 客户机 小结 从样板戏<红灯记>到好莱坞谍战大片<风语者Windtalkers>等,许 ...
- 一个基于RSA算法的Java数字签名例子
====================================================== 注:本文源代码点此下载 ================================= ...
- 基于混合密码体制的端到端短信通讯系统(Java实现+AES+RSA+json)
基于混合密码体制的端到端短信通讯系统(Java实现+AES+RSA+json) 随着移动通信技术及相关领域服务的快速发展,短信内容常常涉及用户隐私和信息安全.用户使用短信传输一些重要的私人信息,如:手 ...
- 基于RSA公匙--PGP邮件数字签名
PGP (Pretty Good Privacy) 是一个基于RSA公匙加密体系的邮件加密软件.可以用它对邮件保密以防止非授权者阅读,它还能对邮件加上数字签名从而使收信人可以确认邮件的发送者,并能确信 ...
- 非对称加密(RSA、数字签名、数字证书)
非对称加密.数字签名.数字证书的参考文章 1. 什么是非对称加密 (1)公钥和私钥成对出现 (2)公钥加密.私钥解密,私钥加密.公钥解密 (3)公钥一般对外公开,私钥保密 (4)主要用于防止通信数据被 ...
最新文章
- 浅议Python append()与NumPy append()
- SVG动画.animateTransform
- 2020 年的第 1 个重磅彩蛋!
- 2019年12月份最热门 Github 开源项目整理
- Ubuntu 14.10 下运行进程实时监控pidstat命令详解
- python 字符串函数总结
- npm收录了哪些包_使用VS Code轻松找到npm软件包中的漏洞(Vuln Cost)
- BNU 鸣人的查克拉
- linux卸载wine qq,ubuntu安装wineQQ
- [转帖]常用项目管理软件介绍
- C语言 - 直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序、归并排序、基数排序。
- 伪代码是计算机语言的一种吗,伪代码是什么?可以取代代码存在吗?
- 冠状病毒主题网页制作——疫情地图
- DedeCMS总是提示验证码不正确的解决方法
- python爬虫——中文编码
- Linux学习(2)---绝对路径和相对路径
- Android中导航栏之溢出菜单OverflowMenu
- CTF---Web入门第七题 猫抓老鼠
- 反燃油车占位方案:AI识别+EasyCVR解决燃油车占位问题
- 关机程序源代码——千万不要点运行!!!hahaha
热门文章
- dir-816虚拟服务器,D-Link DIR-816 无线路由器设置
- 现在计算机上主流显卡是什么,现在电脑,主流显卡是哪型号??
- 全中国一共有多少IP地址?Python来告诉你!
- Java生成MD5的两种方式
- android 获取拼音首字母,Android开发 - 汉字转拼音首字母
- eGalaxTP驱动IIC
- 自考工业用微型计算机书面,自考工业用微型计算机
- 搜狐视频协议分析及视频下载方法 [20161109]
- 视频解析有感,在解析 iqiyi与qq视频的时候,记录一些发现
- 关于游戏开发方面的科普性概述