JDK自带方法实现RSA数字签名
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,1 package jdbc.pro.lin; 2 3 import java.security.InvalidKeyException; 4 import java.security.NoS
千家信息网最后更新 2025年01月23日JDK自带方法实现RSA数字签名
1 package jdbc.pro.lin; 2 3 import java.security.InvalidKeyException; 4 import java.security.NoSuchAlgorithmException; 5 import java.security.PrivateKey; 6 import java.security.PublicKey; 7 import java.security.Signature; 8 import java.security.SignatureException; 9 import java.util.Map; 10 11 import jdbc.pro.lin.MyRSA; 12 13 /** 14 * RSA数字签名,借用MyRSA中的算法,不再重复 15 * 数字签名遵循"私钥签名,公钥验签"原则,因为私钥是个人身份认证 16 * @author Kinsley 17 * 18 */ 19 public class MySignature { 20 21 /** 数字签名算法。JDK只提供了MD2withRSA, MD5withRSA, SHA1withRSA,其他的算法需要第三方包才能支持 */ 22 public static final String SIGNATURE_ALGORITHM = "SHA1withRSA"; 23 24 public static final String PLAIN_TEXT = "MANUTD is the greatest club in the world"; 25 public static void main(String[] args) 26 { 27 //建立两套公私钥对 28 MapkeyMap1 = MyRSA.generateKeyBytes(); 29 PublicKey publicKey1 = MyRSA.restorePublicKey(keyMap1.get(MyRSA.PUBLIC_KEY)); 30 PrivateKey privateKey1 = MyRSA.restorePrivateKey(keyMap1.get(MyRSA.PRIVATE_KEY)); 31 32 Map keyMap2 = MyRSA.generateKeyBytes(); 33 PublicKey publicKey2 =MyRSA.restorePublicKey(keyMap2.get(MyRSA.PUBLIC_KEY)); 34 PrivateKey privateKey2 =MyRSA.restorePrivateKey(keyMap2.get(MyRSA.PRIVATE_KEY)); 35 36 /** 假设现在A签名后向B发送消息 37 * A用B的公钥进行加密 38 * 用自己A的私钥进行签名 39 */ 40 byte[] encodedText = MyRSA.RSAEncode(publicKey2, PLAIN_TEXT.getBytes()); 41 byte[] signature = sign(privateKey1, PLAIN_TEXT.getBytes()); 42 43 /** 44 * 现在B收到了A的消息,进行两步操作 45 * 用B的私钥解密得到明文 46 * 将明文和A的公钥进行验签操作 47 */ 48 49 byte[] decodedText = MyRSA.RSADecode(privateKey2, encodedText).getBytes(); 50 System.out.println("Decoded Text: " + new String(decodedText)); 51 52 System.out.println("Signature is " + verify(publicKey1, signature, decodedText)); 53 } 54 55 /** 56 * 签名,三步走 57 * 1. 实例化,传入算法 58 * 2. 初始化,传入私钥 59 * 3. 签名 60 * @param key 61 * @param plainText 62 * @return 63 */ 64 public static byte[] sign(PrivateKey privateKey, byte[] plainText) 65 { 66 try { 67 //实例化 68 Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); 69 70 //初始化,传入私钥 71 signature.initSign(privateKey); 72 73 //更新 74 signature.update(plainText); 75 76 //签名 77 return signature.sign(); 78 79 } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { 80 // TODO Auto-generated catch block 81 e.printStackTrace(); 82 } 83 84 return null; 85 } 86 87 /** 88 * 验签,三步走 89 * 1. 实例化,传入算法 90 * 2. 初始化,传入公钥 91 * 3. 验签 92 * @param publicKey 93 * @param signatureVerify 94 * @param plainText 95 * @return 96 */ 97 public static boolean verify(PublicKey publicKey, byte[] signatureVerify, byte[] plainText ) 98 { 99 try {100 //实例化101 Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);102 103 //初始化104 signature.initVerify(publicKey);105 106 //更新107 signature.update(plainText);108 109 //验签110 return signature.verify(signatureVerify);111 } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {112 // TODO Auto-generated catch block113 e.printStackTrace();114 }115 116 return false;117 }118 }
算法
公钥
实例
数字
数字签名
三步走
明文
消息
更新
个人
公私
原则
第三方
身份
身份认证
加密
支持
认证
方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
用数据库管理技术处理的数据
餐饮顾客数据库
wincc组态服务器设置
浪潮服务器端口网卡不识别
什么程序可以导入数据库文件
专家谈网络安全审查
授权数据库远程访问
php 二维数组的数据库
农信数据库管理
广播电台护苗网络安全课
福建诚信网络技术开发项目
网络技术自主创新
鼓楼区电商app软件开发
青少年网络安全手抄报4k
超激斗梦境经常未连接服务器
地名地址数据库建设质检报告
房地产网络安全科技馆
云服务器管理教程
腾讯云数据库mysql费用
幻想曲音频服务器
学长综测数据库
腾讯云服务器连不上github
化和网络安全工作要点
tbc服务器联盟部落比例
小张软件开发
sql数据库应用类型
网络安全法的几个层面
创建sql数据库添加数据库
软件开发战队名称朱雀系列
系统和网络安全保障服务