博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDK自带方法实现RSA数字签名
阅读量:5301 次
发布时间:2019-06-14

本文共 4033 字,大约阅读时间需要 13 分钟。

JDK 6只支持MD2withRSA, MD5withRSA, SHA1withRSA

其他的如SHA512withRSA需要第三方包支持,如BC(bouncy castle)

--20151126 更正:JDK 7已经可以支持SHA256withRSA和SHA512withRSA了

JDK的密钥长度默认仍是1024

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         Map
keyMap1 = 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 }

 

转载于:https://www.cnblogs.com/kingsleylam/p/4993270.html

你可能感兴趣的文章
selenium+java iframe定位
查看>>
P2P综述
查看>>
第五章 如何使用Burp Target
查看>>
Sprint阶段测试评分总结
查看>>
sqlite3经常使用命令&语法
查看>>
linux下编译openjdk8
查看>>
【python】--迭代器生成器装饰器
查看>>
Pow(x, n)
查看>>
安卓当中的线程和每秒刷一次
查看>>
每日一库:Modernizr.js,es5-shim.js,es5-safe.js
查看>>
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
属性动画
查看>>
标识符
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>