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();
    }
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值