JDK自带方法实现RSA数字签名

JDK只支持MD2withRSA, MD5withRSA, SHA1withRSA

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

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<String, byte[]> 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<String, byte[]> 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 block
113             e.printStackTrace();
114         }
115
116         return false;
117     }
118 }
时间: 2024-10-18 09:34:23

JDK自带方法实现RSA数字签名的相关文章

JDK自带方法实现RSA对称加密

1 package jdbc.pro.lin; 2 3 import java.security.InvalidKeyException; 4 import java.security.Key; 5 import java.security.KeyFactory; 6 import java.security.KeyPair; 7 import java.security.KeyPairGenerator; 8 import java.security.NoSuchAlgorithmExcept

JDK自带方法实现消息摘要运算

啊,有点小注释,懒得介绍了,就贴个代码吧,大意理解就可以了. 1 package jdbc.pro.lin; 2 3 import java.security.InvalidKeyException; 4 import java.security.MessageDigest; 5 import java.security.NoSuchAlgorithmException; 6 7 import javax.crypto.KeyGenerator; 8 import javax.crypto.Ma

JDK自带方法实现AES对称加密

请看代码. 1 package jdbc.pro.lin; 2 3 import java.security.InvalidAlgorithmParameterException; 4 import java.security.InvalidKeyException; 5 import java.security.NoSuchAlgorithmException; 6 7 import javax.crypto.BadPaddingException; 8 import javax.crypto

MD5算法介绍及jdk自带实现方式

MD5算法,已经被人们熟知,作为一名资深或者入门级的开发者,都号称"MD5啊,知道知道".前几天程序略有小问题,原因是有的地方加密了,有的地方没加密.有个同事很得意的说,MD5就是个hash算法,很容易被解密的.当时我是无言以对了.因为俺记得MD5是不可逆的,既然不可逆,又哪里来的"解密"呢.于是我们在网上搜索"MD5解密",哇kao,竟然真的有结果,然则,事实并非那么简单,我们把MD5的一串序列放到"在线MD5解密"中去解密

crypto++RSA数字签名

"发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同.那么接收方就能确认该数字签名是发送方的. 以上内容来自百度百科,数字签名过程. 本来想着用rsa加解密和MD5就可以实现数字签名.查询了网上的文章,经过自己尝试.发现只能用公钥加密,私钥解密.这

死锁排查的小窍门 --使用jdk自带管理工具jstack

本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 开发时间久了,难免会写出一些一些死锁的代码,自己明明调用该方法可该方法就是不执行.不进该方法.日志也不打印! 这里我们模拟一段死锁的代码,使用jdk自带的管理工具来排查是不是死锁了! 1 //思索代码 2 public class DeadLockDemo implements Runnable{ 3 4 public int flag = 1; 5 //静态对象是类的所有对象共享的 6 privat

JDK自带的二分查找算法和自己写的普通二分查找算法的比较(java二分查找源代码)

一.描述 解析和比较JDK自带的二分查找算法和自己写的普通二分查找算法,使用二进制位无符号右移来代替除2运算,并使用产生随机数的方法产生一定范围的随机数数组,调用Arrays类的sort()静态方法,对int类型数组进行排序. Math.random()的用法:会产生一个[0,1)之间的随机数(注意能取到0,不能取到1),这个随机数的是double类型,要想返回指定范围的随机数如[m,n]之间的整数的公式:(int)(Math.random()*(m-n+1)+m) 二.源代码 <span st

Java 常用的日志工具——JDK自带的java.util.logging包、APACHE 的log4j 与 slf4j日志处理接口

考虑以下情况: (1).根据程序输出可以很好地帮助程序员调试程序.在编写小型程序时,可以在程序中不断增加 System.out.print() 语句来查看程序运行状态:在大型系统中,显然这一做法非常不对,可以考虑将调试信息通过日志处理工具,输出到一个文本文件中,然后查看文件内容. (2).在系统开始线上运行后,系统管理人员需要获知系统的运行情况,包括但不限于系统开始运行时间.系统关闭时间.系统目前处理任务等,这些状态需要输出到一个经过格式化的日志文件中,供管理人员查看: (3).在编写系统,甚至

jdk自带常用命令行工具使用

下面是笔者整理的jdk自带的常用命令行工具的使用方法,全部原创,转载请注明出处,并贴上链接,谢谢! jps命令使用 jstat命令使用 jinfo命令使用 jmap命令使用 jhat命令使用 jstack命令使用 jcmd命令使用