您的位置:首页 > 编程语言 > Java开发

Java数字签名算法--RSA

2016-02-17 11:15 239 查看
签名具有的特性:

安全性

抗否认性

数字签名:带有密钥(公钥、私钥)的消息摘要算法(使用私钥进行签名,使用公钥进行验证)

数字签名算法:RSA、DSA、ECDSA

数字签名特性:

验证数据完整性

认证数据来源

抗否认性

经典算法

MD、SHA两类



数字签名算法-RSA的执行过程



代码:

package com.chengxuyuanzhilu.rsa;

import java.security.InvalidKeyException;
import java.security.KeyFactory;
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;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
* <p>微信公众号:程序员之路</p>
* <p>博客:http://www.cnblogs.com/chengxuyuanzhilu</p>
* @ClassName: CXYZL_RSA
* @Description: 数组签名算法——RSA
* @author 付成刚
* @date 2016年2月17日 上午7:23:02
*/
public class CXYZL_RSA {
//要签名和验证的签名内容
private static String src = "chengxuyuanzhilu rsa";

public static void main(String[] args) {
jdkRSA();
}

public static void jdkRSA(){

CXYZL_RSA cxyzl_RSA = new CXYZL_RSA();
try {
//1.初始化密钥,产生公钥私钥对
Object[] keyPairArr = cxyzl_RSA.initSecretkey();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPairArr[0];
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPairArr[1];

//2.执行签名
byte[] result = cxyzl_RSA.executeSignature(rsaPrivateKey);

//3.验证签名
boolean bool = cxyzl_RSA.verifySignature(rsaPublicKey,result);
System.out.println("RSA-MD5withRSA数字签名算法运算结果:"+bool);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* @Title: initSecretkey
* @Description: 初始化密钥,生成公钥私钥对
* @return Object[] 0 公钥,1 私钥
* @author 微信公众号:程序员之路
* @throws NoSuchAlgorithmException
* @date 2016年2月17日 上午7:31:06
*/
private Object[] initSecretkey() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

Object[] keyPairArr = new Object[2];
keyPairArr[0] = rsaPublicKey;
keyPairArr[1] = rsaPrivateKey;

return keyPairArr;
}

/**
* @Title: executeSignature
* @Description: 执行签名
* @return byte[] 签名后的内容
* @author 微信公众号:程序员之路
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws SignatureException
* @date 2016年2月17日 上午7:44:49
*/
private byte[] executeSignature(RSAPrivateKey rsaPrivateKey) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, SignatureException{
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Signature signature = Signature.getInstance("MD5withRSA");
signature.initSign(privateKey);
signature.update(src.getBytes());
byte[] result = signature.sign();

return result;
}

/**
* @Title: verifySignature
* @Description: 验证签名
* @param rsaPublicKey 公钥
* @param result 私钥执行签名的结果
* @return boolean 验证结果
* @author 微信公众号:程序员之路
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws InvalidKeyException
* @throws SignatureException
* @date 2016年2月17日 上午7:53:37
*/
private boolean verifySignature(RSAPublicKey rsaPublicKey,byte[] result) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException{
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Signature signature = Signature.getInstance("MD5withRSA");
signature.initVerify(publicKey);
signature.update(src.getBytes());
boolean bool = signature.verify(result);

return bool;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: