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_MARS学习笔记_S03_009_GOOGLEMAP3
一.代码 1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLay ...
- 生意经:研究一下国外SAAS的产品线,比如Salesforce、Netsuite和Zendesk等等(Salesforce斥资7.5亿美元收购云计算字处理应用Quip)
看他们做什么,我就做什么-甚至比他们做的更好. ------------------------------------------------------------ 新浪科技讯 北京时间8月3日下 ...
- python中 __name__及__main()__的使用
python中 __name__及__main()__的使用 #hello.py def sayHello(): str="hello" print(str); if __name ...
- bzoj1042
首先直接做多重背包肯定会TLE的, 观察这个背包问题有什么特殊性呢 物品种类和重量,价值是一定的,不同的是背包的容量和物品的数量 由于当物品数量没有限制的时候,方案数是可以预处理出来的 所以我们考虑用 ...
- 三种asp.net 抓取网页源代码
/// <summary>方法一:比较推荐 /// 用HttpWebRequest取得网页源码 /// 对于带BOM的网页很有效,不管是什么编码都能正确识别 /// </summar ...
- Unity3D与iOS消息交互方法(1)--iOS接收Unity3D发出的消息
跨平台这种事情不管多NB, 总要有些与原生系统交互的方法, 比如 Unity3D与iOS消息交互方法. 一: 建立一个空的Unity工程. File --> New Project 二: 编 ...
- asp.net Post Get提交数据转Model实例
转自:http://blog.csdn.net/daodaowolf/article/details/8990694 此功能是将客户端HTTP协议POST GET方式提交的数据转换为某个Model实例 ...
- TCP三次握手和连接关闭过程详解
1.建立连接协议(三次握手) (1)客户端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1. (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和S ...
- vi同类品
nvi 更纯正,接近原始的vi command argument-F don't copy whole file, may faster-S secure help (quick refe ...
- ubuntu12.04编译rtems doc目录
我的rtem的版本是rtems-4.10.2:首先安装textinfo:sudo apt-get install texinfo 然后: cd rtems-4.10.2/doc../bootstrap ...