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.view.TouchDelegate扩大View的触摸点击区域
Android4.0设计规定的有效可触摸的UI元素标准是48dp,转化为一个物理尺寸约为9毫米.7~10毫米,这是一个用户手指能准确并且舒适触摸的区域. 如下图所示,你的UI元素可能小于48dp,图标 ...
- 【转】Android:Animation的简单学习--不错
原文网址:http://blog.csdn.net/huangbiao86/article/details/6683665 Animation动画效果.提供了一系列的动画效果,可以应用大多数 的控件. ...
- (转载)JS事件监听 JS:attachEvent和addEventListener使用方法
(转载)http://www.chhua.com/web-note146 attachEvent和addEventListener使用方法 Js代码 <html> <head> ...
- 64位windows7 上安装32位oracle 10g 的方法
操作系统: windows7 中文旗舰版 oracle安装版本: 10.2.0.1 中文版,升级补丁至 10.2.0.3 下面说正题首先,我们要解除oracle安装的windows版本检测1.编辑安装 ...
- appium
电话键 KEYCODE_CALL 拨号键 5KEYCODE_ENDCALL 挂机键 6KEYCODE_HOME 按键Home 3KEYCODE_MENU 菜单键 82KEYCODE_BACK 返回键 ...
- MySQL linux二进制安装
200 ? "200px" : this.width)!important;} --> 介绍 1.创建用户和目录 groupadd mysql useradd -r -g m ...
- 导出Unity场景为配置文件
在处理很多人参与的项目时,很多时候在操作场景时,可能会牵扯到场景修改的冲突问题,这种时候,我们可以将场景以配置文件的形式存储下来(cocos的场景.android的view保存思想),可以采用json ...
- 子窗体与父窗体传值操作的js示例
//返回值给父窗体 function returnParent(value) {//获取子窗体返回值 var parent = window.dialogArguments; //获取父页面 ...
- Android_adb使用
Android Debug Bridge version 1.0.26 - #当升级 Android SDK 后,ADB 也会随之升级. adb [-d|-e|-s {<serialNumber ...
- MFC ListControl使用方法
在原来博客中有:MF CListControl 简单功能使用 推荐文章:MFC类CtrlList用法 今天又又一次来介绍点新东西:双击击listcontrol 做出响应.当然你能够做的还有非常多,比 ...