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. 驱动程序环境搭配(VS2010 + WDK + VirtualDDK + VMware)good

    http://www.cnblogs.com/BoyXiao/archive/2011/07/31/2122755.html

  2. 没做过编译器就是被人欺——从一道变态的i++题猜编译器的行为(表达式从左往右扫描,同一变量相互影响)

    首先不要被人蒙了,如果是这样,根本编译不过: int i=1; int b=i+++++i; printf("%d %d\n", b ,i); Mingw报错:error: lva ...

  3. 关于v$sql_bind_capture 的问题

    ---先清空shared_pool SQL> alter system flush shared_pool; System altered. SQL> col value_STRING f ...

  4. 【HDOJ】1242 Rescue

    BFS+优先级队列. #include <iostream> #include <cstdio> #include <cstring> #include <q ...

  5. bzoj2705

    一个常用的结论(方法) 只要知道gcd(i,n)=L 的i的个数s,我们就能很轻易得出答案 gcd(i,n)=L gcd(i/L,n/L)=1 不难得到这样的s=与n/L互质的个数=phi(n/L) ...

  6. BI-SqlServer

    一.概述 SqlServer数据仓库 ETL组件 IntegrationService OLAP组件 AnalysisService 报表 ReportingService MDX(查多维数据集用的) ...

  7. JavaScript高级程序设计58.pdf

    15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域 ...

  8. 了解mongodb

    本文大纲 基础了解mongodb(mongodb介绍,跟其他nosql区别,跟内存服务器区别等,使用场景) 在使用前,强力建议看哈http://wenku.baidu.com /link?url=lu ...

  9. Application使用示例

    MainActivity如下: package cn.testapplication; import android.os.Bundle; import android.view.View; impo ...

  10. PHP的curl实现get,post 和 cookie(实例)

    类似于dreamhost这类主机服务商,是显示fopen的使用 的.使用php的curl可以实现支持FTP.FTPS.HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE ...