JDK自带方法实现RSA数字签名
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数字签名的更多相关文章
- JDK自带方法实现RSA非对称加密
package jdbc.pro.lin; import java.security.InvalidKeyException; import java.security.Key; import jav ...
- JDK自带方法实现AES对称加密
请看代码. 1 package jdbc.pro.lin; 2 3 import java.security.InvalidAlgorithmParameterException; 4 import ...
- JDK自带方法实现消息摘要运算
啊,有点小注释,懒得介绍了,就贴个代码吧,大意理解就可以了. package jdbc.pro.lin; import java.security.InvalidKeyException; impor ...
- JDK自带工具keytool生成ssl证书
前言: 因为公司项目客户要求使用HTTPS的方式来保证数据的安全,所以木有办法研究了下怎么生成ssl证书来使用https以保证数据安全. 百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具: ...
- tomcat配置https–采用JDK自带的keytool工具生成证书
转自:http://blog.csdn.net/huangxinyu_it/article/details/41693633 有关http与https的区别请看<浅谈http与https的区别( ...
- JDK自带的日志Logging
OK,现在我们来研究下JDK自带的日志Logger. 从jdk1.4起,JDK开始自带一套日志系统.JDK Logger最大的优点就是不需要任何类库的支持,只要有Java的运行环境就可以使用. 相对于 ...
- jdk自带的MD5进行数据的加密与解密
package com.tools.util; import java.io.IOException; import java.io.UnsupportedEncodingException; imp ...
- JDK自带的LinkedHashMap来实现LRU算法
1 代码如下 public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> { private final i ...
- JDK 自带的观察者模式源码分析以及和自定义实现的取舍
前言 总的结论就是:不推荐使用JDK自带的观察者API,而是自定义实现,但是可以借鉴其好的思想. java.util.Observer 接口源码分析 该接口十分简单,是各个观察者需要实现的接口 pac ...
随机推荐
- Android开源项目发现---ProgressBar 篇(持续更新)
1. SmoothProgressBar 水平进度条 项目地址:https://github.com/castorflex/SmoothProgressBar Demo地址:https://play. ...
- [FJSC2014]化合物
[题目描述] 首长NOI惨跪,于是去念文化课了.现在,他面对一道化学题. 这题的来源是因为在一个奇怪的学校两个化竞党在玩一个奇怪的博弈论游戏,这个游戏很蛋疼,我相信你们也没有兴趣听. 由于这个游戏涉及 ...
- WordPress Sharebar ‘page’参数跨站脚本漏洞
漏洞名称: WordPress Sharebar ‘page’参数跨站脚本漏洞 CNNVD编号: CNNVD-201309-468 发布时间: 2013-09-26 更新时间: 2013-09-26 ...
- Total Commander快捷键
(1)tab键---切换左.右两个大的窗口:
- Cocos2d-x学习之windows 7的visual studo 2010开发环境安装
1.引擎代码的下载 官方版本地址为: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download 目前最新版本是cocos2d-2.0-rc0a ...
- 使用VisualStudio进行单元测试之一
使用VisualStudio中的单元测试功能,可以很方便的创建单元测试项目.编写单元测试代码以及执行单元测试.而如何在VisualStudio中使用单元测试功能,就是本文和后面几篇想要说的了. ...
- calabash-android Win10 入门笔记
参考官方文档:https://developer.xamarin.com/guides/testcloud/calabash/ 概述 Calabash是一个BDD的UI自动化验收测试框架, ...
- ARM学习笔记3——数据处理指令
一.数据处理指令概述 1.概念 数据处理指令是指对存放在寄存器中的数据进行处理的指令.主要包括算术指令.逻辑指令.比较与测试指令以及乘法指令 如果在数据处理指令前使用S前缀,指令的执行结果将会影响CP ...
- iphone上click事件不触发的问题解决。
iphone上click事件不触发的问题解决. //在ID为jsProvince上有这么一个事件: $('body').on('click', '#jsProvince', function(e){ ...
- UIButton set touch handler in code
One option is to set the button up using [myButton addTarget:yourOtherClass action:@selector(mySelec ...