Java中数字签名RSASignature 算法的使用
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
/**
* Created by cuboo on 2016/10/15.
*/
public class RSAsignature {
private static final String PUBLIC_KEY = "publickey";
private static final String PRIVATE_KEY = "privatekey";
/*
*RSA生成密钥对
*/
public static Map<String,Object> GenerateKeyPair(String keyType, int keySize) throws Exception {
KeyPairGenerator pairGenerator = KeyPairGenerator.getInstance(keyType);
pairGenerator.initialize(keySize);
//生成秘钥对
KeyPair keyPair = pairGenerator.generateKeyPair();
//获得公钥和私钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
Map<String,Object> map = new HashMap<String,Object>();
map.put(PUBLIC_KEY,publicKey);
map.put(PRIVATE_KEY,privateKey);
return map;
}
/*
*从Map中获得密钥对
*/
public static RSAPublicKey GetPublicKey(Map<String,Object> map){
RSAPublicKey publicKey = (RSAPublicKey) map.get(PUBLIC_KEY);
return publicKey;
}
public static RSAPrivateKey GetPrivateKey(Map<String,Object> map){
RSAPrivateKey privateKey = (RSAPrivateKey) map.get(PRIVATE_KEY);
return privateKey;
}
/*
*私钥对原始数据进行签名
*/
public static byte[] signature(RSAPrivateKey privateKey ,byte[] data,String keyType) throws Exception {
// PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded());
// KeyFactory factory = KeyFactory.getInstance(keyType);
// PrivateKey privatekey = (PrivateKey) factory.generatePrivate(keySpec);
Signature signature = Signature.getInstance("MD5withRSA");
signature.initSign(privateKey);
signature.update(data);
return signature.sign();
}
/*
* 公钥、原始数据、原始签名数据进行验证
*/
public static boolean verify(RSAPublicKey publicKey,byte[] data,byte[] sign) throws Exception {
Signature signature = Signature.getInstance("MD5withRSA");
signature.initVerify(publicKey);
signature.update(data);
return signature.verify(sign);
}
public static void main(String agrs[]) throws Exception {
Map<String,Object> map = GenerateKeyPair("RSA",1024);
RSAPublicKey publicKey = RSAcode.GetPublicKey(map);
RSAPrivateKey privateKey = RSAcode.GetPrivateKey(map);
byte[] sign = signature(privateKey,"abc".getBytes(),"RSA");
boolean verify = verify(publicKey,"abc1".getBytes(),sign);
System.out.println(fromBytesToHexString(publicKey.getEncoded()));
System.out.println(fromBytesToHexString(privateKey.getEncoded()));
System.out.println(fromBytesToHexString(sign));
System.out.println(verify);
}
public static String fromBytesToHexString(byte[] data){
StringBuilder str = new StringBuilder();
for (int i = 0; i < data.length; i++) {
String s = Integer.toHexString(0xFF & data[i]);
if (s.length() == 1){
str.append(0).append(s);
}else {
str.append(s);
}
}
return str.toString();
}
}
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇: Python机器学习库SKLearn:数据集转换之特征提取
