加密与数字签名的区别

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的数字签名相关推荐

  1. python基于rsa的数字签名实现_OpenSSL和Python实现RSA Key数字签名和验证

    OpenSSL和Python实现RSA Key数字签名和验证,基于非对称算法的RSA Key主要有两个用途,数字签名和验证(私钥签名,公钥验证),以及非对称加解密(公钥加密,私钥解密).本文提供一个基 ...

  2. 基于RSA的数字签名设计与实现

    信息安全课程的第二个实验,主要是用java.js,前端页面用的html写的. 页面成果展示: 基本公私钥生成 实验环境为win10系统,使用git命令行工具--git bash生成公私钥.生成私钥,密 ...

  3. python基于rsa的数字签名实现_青岛宽客聚会期权定价公式基于python的实现

    点击上方蓝字,关注宽客空间 2020年8月16日,宽客空间走进石岭资产,参加了青岛宽客聚会的活动.本次活动分享题目为<期权定价公式基于python的实现>.本次活动的主讲人是来自青岛石岭资 ...

  4. C#毕业设计——基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码)——数字签名系统

    基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于MD5+RSA的数字签名设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告PPT模板及论 ...

  5. 基于RSA的公钥基础体系下安全通信实战

    目录 简说RSA 服务器的初始密钥对和认证请求 证书认证机构CA 服务器安装CA签名证书 客户机 小结 从样板戏<红灯记>到好莱坞谍战大片<风语者Windtalkers>等,许 ...

  6. 一个基于RSA算法的Java数字签名例子

    ====================================================== 注:本文源代码点此下载 ================================= ...

  7. 基于混合密码体制的端到端短信通讯系统(Java实现+AES+RSA+json)

    基于混合密码体制的端到端短信通讯系统(Java实现+AES+RSA+json) 随着移动通信技术及相关领域服务的快速发展,短信内容常常涉及用户隐私和信息安全.用户使用短信传输一些重要的私人信息,如:手 ...

  8. 基于RSA公匙--PGP邮件数字签名

    PGP (Pretty Good Privacy) 是一个基于RSA公匙加密体系的邮件加密软件.可以用它对邮件保密以防止非授权者阅读,它还能对邮件加上数字签名从而使收信人可以确认邮件的发送者,并能确信 ...

  9. 非对称加密(RSA、数字签名、数字证书)

    非对称加密.数字签名.数字证书的参考文章 1. 什么是非对称加密 (1)公钥和私钥成对出现 (2)公钥加密.私钥解密,私钥加密.公钥解密 (3)公钥一般对外公开,私钥保密 (4)主要用于防止通信数据被 ...

最新文章

  1. 浅议Python append()与NumPy append()
  2. SVG动画.animateTransform
  3. 2020 年的第 1 个重磅彩蛋!
  4. 2019年12月份最热门 Github 开源项目整理
  5. Ubuntu 14.10 下运行进程实时监控pidstat命令详解
  6. python 字符串函数总结
  7. npm收录了哪些包_使用VS Code轻松找到npm软件包中的漏洞(Vuln Cost)
  8. BNU 鸣人的查克拉
  9. linux卸载wine qq,ubuntu安装wineQQ
  10. [转帖]常用项目管理软件介绍
  11. C语言 - 直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序、归并排序、基数排序。
  12. 伪代码是计算机语言的一种吗,伪代码是什么?可以取代代码存在吗?
  13. 冠状病毒主题网页制作——疫情地图
  14. DedeCMS总是提示验证码不正确的解决方法
  15. python爬虫——中文编码
  16. Linux学习(2)---绝对路径和相对路径
  17. Android中导航栏之溢出菜单OverflowMenu
  18. CTF---Web入门第七题 猫抓老鼠
  19. 反燃油车占位方案:AI识别+EasyCVR解决燃油车占位问题
  20. 关机程序源代码——千万不要点运行!!!hahaha

热门文章

  1. dir-816虚拟服务器,D-Link DIR-816 无线路由器设置
  2. 现在计算机上主流显卡是什么,现在电脑,主流显卡是哪型号??
  3. 全中国一共有多少IP地址?Python来告诉你!
  4. Java生成MD5的两种方式
  5. android 获取拼音首字母,Android开发 - 汉字转拼音首字母
  6. eGalaxTP驱动IIC
  7. 自考工业用微型计算机书面,自考工业用微型计算机
  8. 搜狐视频协议分析及视频下载方法 [20161109]
  9. 视频解析有感,在解析 iqiyi与qq视频的时候,记录一些发现
  10. 关于游戏开发方面的科普性概述