JDK 6只支持MD2withRSA, MD5withRSA, SHA1withRSA

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

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

JDK的密钥长度默认仍是1024

 package jdbc.pro.lin;

 import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.util.Map; import jdbc.pro.lin.MyRSA; /**
* RSA数字签名,借用MyRSA中的算法,不再重复
* 数字签名遵循“私钥签名,公钥验签”原则,因为私钥是个人身份认证
* @author Kinsley
*
*/
public class MySignature { /** 数字签名算法。JDK只提供了MD2withRSA, MD5withRSA, SHA1withRSA,其他的算法需要第三方包才能支持 */
public static final String SIGNATURE_ALGORITHM = "SHA1withRSA"; public static final String PLAIN_TEXT = "MANUTD is the greatest club in the world";
public static void main(String[] args)
{
//建立两套公私钥对
Map<String, byte[]> keyMap1 = MyRSA.generateKeyBytes();
PublicKey publicKey1 = MyRSA.restorePublicKey(keyMap1.get(MyRSA.PUBLIC_KEY));
PrivateKey privateKey1 = MyRSA.restorePrivateKey(keyMap1.get(MyRSA.PRIVATE_KEY)); Map<String, byte[]> keyMap2 = MyRSA.generateKeyBytes();
PublicKey publicKey2 =MyRSA.restorePublicKey(keyMap2.get(MyRSA.PUBLIC_KEY));
PrivateKey privateKey2 =MyRSA.restorePrivateKey(keyMap2.get(MyRSA.PRIVATE_KEY)); /** 假设现在A签名后向B发送消息
* A用B的公钥进行加密
* 用自己A的私钥进行签名
*/
byte[] encodedText = MyRSA.RSAEncode(publicKey2, PLAIN_TEXT.getBytes());
byte[] signature = sign(privateKey1, PLAIN_TEXT.getBytes()); /**
* 现在B收到了A的消息,进行两步操作
* 用B的私钥解密得到明文
* 将明文和A的公钥进行验签操作
*/ byte[] decodedText = MyRSA.RSADecode(privateKey2, encodedText).getBytes();
System.out.println("Decoded Text: " + new String(decodedText)); System.out.println("Signature is " + verify(publicKey1, signature, decodedText));
} /**
* 签名,三步走
* 1. 实例化,传入算法
* 2. 初始化,传入私钥
* 3. 签名
* @param key
* @param plainText
* @return
*/
public static byte[] sign(PrivateKey privateKey, byte[] plainText)
{
try {
//实例化
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); //初始化,传入私钥
signature.initSign(privateKey); //更新
signature.update(plainText); //签名
return signature.sign(); } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
} /**
* 验签,三步走
* 1. 实例化,传入算法
* 2. 初始化,传入公钥
* 3. 验签
* @param publicKey
* @param signatureVerify
* @param plainText
* @return
*/
public static boolean verify(PublicKey publicKey, byte[] signatureVerify, byte[] plainText )
{
try {
//实例化
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); //初始化
signature.initVerify(publicKey); //更新
signature.update(plainText); //验签
return signature.verify(signatureVerify);
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return false;
}
}

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

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

    package jdbc.pro.lin; import java.security.InvalidKeyException; import java.security.Key; import jav ...

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

    请看代码. 1 package jdbc.pro.lin; 2 3 import java.security.InvalidAlgorithmParameterException; 4 import ...

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

    啊,有点小注释,懒得介绍了,就贴个代码吧,大意理解就可以了. package jdbc.pro.lin; import java.security.InvalidKeyException; impor ...

  4. JDK自带工具keytool生成ssl证书

    前言: 因为公司项目客户要求使用HTTPS的方式来保证数据的安全,所以木有办法研究了下怎么生成ssl证书来使用https以保证数据安全. 百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具: ...

  5. tomcat配置https–采用JDK自带的keytool工具生成证书

    转自:http://blog.csdn.net/huangxinyu_it/article/details/41693633 有关http与https的区别请看<浅谈http与https的区别( ...

  6. JDK自带的日志Logging

    OK,现在我们来研究下JDK自带的日志Logger. 从jdk1.4起,JDK开始自带一套日志系统.JDK Logger最大的优点就是不需要任何类库的支持,只要有Java的运行环境就可以使用. 相对于 ...

  7. jdk自带的MD5进行数据的加密与解密

    package com.tools.util; import java.io.IOException; import java.io.UnsupportedEncodingException; imp ...

  8. JDK自带的LinkedHashMap来实现LRU算法

    1 代码如下 public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> { private final i ...

  9. JDK 自带的观察者模式源码分析以及和自定义实现的取舍

    前言 总的结论就是:不推荐使用JDK自带的观察者API,而是自定义实现,但是可以借鉴其好的思想. java.util.Observer 接口源码分析 该接口十分简单,是各个观察者需要实现的接口 pac ...

随机推荐

  1. CRC算法及C实现

    一.CRC算法原理   CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校 验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数 ...

  2. HttpResponseCache 网络缓存使用

    Caches HTTP and HTTPS responses to the filesystem so they may be reused, saving time and bandwidth. ...

  3. redis pub/sub 发布订阅

    Redis的列表数据结构有blpop和brpop命令,能从列表里返回且删除第一个(或最后一个)元素,或者被堵塞,直到有一个元素可供操作.这可以用来实现一个简单的队列.(参考:http://www.cn ...

  4. 【HDOJ】3315 My Brute

    几乎与2853相同,MCMF. /* 2853 */ #include <iostream> #include <string> #include <map> #i ...

  5. Oracle core06_latch&lock

    lock and latch 在oracle中为了保护共享资源,使用了两种不同的锁机制lock和latch,这两种锁有明显不同点: 1,lock和pin,采用的是队列的方式,先来先服务的策略,latc ...

  6. 求奇数偶数的和,,利用while循环

    static void Main(string[] args)        {             while (true)                {             try   ...

  7. BZOJ2802: [Poi2012]Warehouse Store

    2802: [Poi2012]Warehouse Store Time Limit: 10 Sec  Memory Limit: 64 MBSec  Special JudgeSubmit: 121  ...

  8. android学习——activity的生命周期

    Android中主要组件之Activity的生命周期,基本都是翻译Android API和个人的理解. 首先看一下Android api中所提供的Activity生命周期图: Activity其实是继 ...

  9. SSL 通信及 java keystore 工具介绍

    http://www.javacodegeeks.com/2014/07/java-keystore-tutorial.html Table Of Contents 1. Introduction 2 ...

  10. c语言结构体中的冒号的用法

    结构体中常见的冒号的用法是表示位域. 有些信息在存储时,并不需要占用一个完整的字节,   而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1   两种状态,   用一位二进位即可.为了节省 ...