用RSA实现数字签名
来源:互联网 发布:linux下重装win8 编辑:程序博客网 时间:2024/05/14 11:04
下面是一个在JAVA语言中,使用安全散列算法SAH来进行消息散列,和使用RSA对散列码加密,以实现数字签名的一个示例。
如果你对数字签名还不熟悉,请先阅读《数字签名简介》及《Java的数字签名和数字证书》
RSA_Demo.java文件
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
public class RSA_Demo {
RSA_Demo()
{
init();
}
private void init()
{
prepare();
doSenderWork();
doReceiverWork();
}
//share by sender and receiver
Signature sign=null;
//belong to sender,it visible to sender and receiver
PublicKey publicKey=null;
//belong to sender,it is only visible to sender
PrivateKey privateKey;
private void prepare()
{
KeyPairGenerator keyGen=null;
try {
//实例化一个RSA算法的公钥/私钥对生成器
keyGen=KeyPairGenerator.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int keysize=1024;
//设置公钥/私钥对的长度
keyGen.initialize(keysize);
//生成一个RSA算法的公钥/私钥
KeyPair keyPair=keyGen.generateKeyPair();
privateKey=keyPair.getPrivate();
publicKey=keyPair.getPublic();
try {
//实例化一个用SHA算法进行散列,用RSA算法进行加密的Signature.
sign=Signature.getInstance("SHA1WithRSA");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void doSenderWork()
{
String words="This is robin.How are you?";
Message msg=new Message(words.getBytes());
try {
//设置加密散列码用的私钥
sign.initSign(privateKey);
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//设置散列算法的输入
sign.update(msg.getBody());
} catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte data[]=null;
try {
//进行散列,对产生的散列码进行加密并返回
data=sign.sign();
} catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//把加密后散列(即签名)加到消息中
msg.setSignature(data);
//发送消息
sendMsg(msg);
}
Message sendingMsg;
void sendMsg(Message sendMsg)
{
sendingMsg=sendMsg;
System.out.println("sending Message");
}
void doReceiverWork()
{
//收到消息
Message msg=getReceivedMsg();
try {
//设置解密散列码用的公钥。
sign.initVerify(publicKey);
} catch (InvalidKeyException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//设置散列算法的输入
sign.update(msg.getBody());
} catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
/*进行散列计算,比较计算所得散列码是否和解密的散列码是否一致。
* 一致则验证成功,否则失败
*/
if(sign.verify(msg.getSignature()))
{
System.out.println("数字签名验证成功!");
}
else
{
System.out.println("数字签名验证失败!");
}
} catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Message getReceivedMsg()
{
System.out.println("receiving Message");
return sendingMsg;
}
}
class Message
{
private byte [] body;
private byte [] signature;
Message(byte data[])
{
body=data;
}
byte[] getBody()
{
return body;
}
byte[] getSignature()
{
return signature;
}
void setSignature(byte data[])
{
signature=data;
}
}
如果使用RSA做为数字签名加密算法,对消息摘要算法则会有多种选择,除了SHA1,还有MD2,MD5等。
这时只用将Signature.getInstance("SHA1WithRSA")变为Signature.getInstance("MD2withRSA")和Signature.getInstance("MD5withRSA")
- 用RSA实现数字签名
- rsa数字签名实现
- 数字签名:RSA-PSS 实现
- 数字签名--RSA实现
- 基于JDK的RSA算法实现数字签名
- RSA加密解密及数字签名Java实现
- Java 实现 RSA加密解密及数字签名
- RSA加密解密及数字签名Java实现
- RSA加密解密及数字签名Java实现
- java RSA/DSA/ECDSA实现数字签名
- JDK自带方法实现RSA数字签名
- RSA加密解密及数字签名Java实现
- Java实现 RSA加密解密及数字签名
- java RSA/DSA/ECDSA实现数字签名
- RSA加密解密及数字签名Java实现
- Qt5使用openssl实现RSA数字签名
- java使用RSA加密方式,实现数字签名
- RSA加密解密及数字签名Java实现
- TNS-12560: TNS:protocol adapter error 小记
- UIViewController (popover view controller)
- UpdatePanel中动态加入AsyncPostBackTrigger出现的问题
- tiptop gp 之 split函数
- 当jsp页面完全加载完成后执行一个js函数
- 用RSA实现数字签名
- WebCore中的http响应信息维护
- ContentProvider和Uri详解
- ruby学习随笔1
- 通讯录开发学习2
- NetBeans 下载、使用 JAX-RPC Web Services
- 用DSA算法实现数字签名
- C#
- 让Eclipse支持jQuery和jQueryUI代码自动完成功能