验签

import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;

import org.apache.commons.codec.binary.Base64;


public class KeyGenerater {
 private byte[] priKey;
 private byte[] pubKey;

 public void generater() {
  try {
   java.security.KeyPairGenerator keygen = java.security.KeyPairGenerator
     .getInstance("RSA");
   SecureRandom secrand = new SecureRandom();
   secrand.setSeed("syj".getBytes()); // 初始化随机产生器
   keygen.initialize(1024, secrand);
   KeyPair keys = keygen.genKeyPair();

   PublicKey pubkey = keys.getPublic();
   PrivateKey prikey = keys.getPrivate();

   pubKey = Base64.encodeBase64(pubkey.getEncoded());
   priKey = Base64.encodeBase64(prikey.getEncoded());

   System.out.println("pubKey = " + new String(pubKey));
   System.out.println("priKey = " + new String(priKey));
  } catch (java.lang.Exception e) {
   System.out.println("生成密钥对失败");
   e.printStackTrace();
  }
 }

 public byte[] getPriKey() {
  return priKey;
 }

 public byte[] getPubKey() {
  return pubKey;
 }

}


import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;

import org.apache.commons.codec.binary.Base64;

public class Signaturer {
 /**
  *
  * Description:数字签名
  */
 public static byte[] sign(byte[] priKeyText, String plainText) {
  try {
   PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decodeBase64(priKeyText));
   KeyFactory keyf = KeyFactory.getInstance("RSA");
   PrivateKey prikey = keyf.generatePrivate(priPKCS8);

   // 用私钥对信息生成数字签名
   java.security.Signature signet = java.security.Signature
     .getInstance("MD5withRSA");
   signet.initSign(prikey);
   signet.update(plainText.getBytes());
   byte[] signed = Base64.encodeBase64(signet.sign());
   return signed;
  } catch (java.lang.Exception e) {
   System.out.println("签名失败");
   e.printStackTrace();
  }
  return null;
 }
}


import org.apache.commons.codec.binary.Base64;


public class SignProvider {
 private SignProvider() {

 }

 /**
  *
  * Description:校验数字签名,此方法不会抛出任务异常,成功返回true,失败返回false,要求全部参数不能为空
  *
  * @param pubKeyText
  *            公钥,base64编码
  * @param plainText
  *            明文
  * @param signTest
  *            数字签名的密文,base64编码
  * @return 校验成功返回true 失败返回false
  * @since:2007-12-27 上午09:33:55
  */
 public static boolean verify(byte[] pubKeyText, String plainText,
   byte[] signText) {
  try {
   // 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
   java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(
     Base64.decodeBase64(pubKeyText));
   // RSA对称加密算法
   java.security.KeyFactory keyFactory = java.security.KeyFactory
     .getInstance("RSA");
   // 取公钥匙对象
   java.security.PublicKey pubKey = keyFactory
     .generatePublic(bobPubKeySpec);
   // 解密由base64编码的数字签名
   byte[] signed = Base64.decodeBase64(signText);
   java.security.Signature signatureChecker = java.security.Signature
     .getInstance("MD5withRSA");
   signatureChecker.initVerify(pubKey);
   signatureChecker.update(plainText.getBytes());
   // 验证签名是否正常
   if (signatureChecker.verify(signed))
    return true;
   else
    return false;
  } catch (Throwable e) {
   System.out.println("校验签名失败");
   e.printStackTrace();
   return false;
  }
 }
}

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
//        KeyGenerater k=new KeyGenerater();
//        k.generater();
        
        
        String privateStr="MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIA1lWKd9UdVJEbZHNyGDPZe9cSW62rGJ+dV4k3n5XFBN6hvlNw4hHDRtCrvOMzlO6rY4eXguDuiC75rslv6Al628nA+uwWtgmwFMgjCQGNvqrzEFLKjkXx8Onn9mbZImAVqbcVt8tgHe+qHPWRtyptuBZnV1u8JbFSt5zM/RY8RAgMBAAECgYBqsKx8oWgAkVib4IbE+ISG7STmEJUdiIKiXvTw0b48jgIMF7avwBRucgPVCregwk3x8YOisWt+rG3La4HESnt3MfusAAGNUioO5I5MFUEyRDoMq3hh+zySvnzw/h3aONNAgYV6d/0qyWCmMWST7NyPfsODB3inJY71oHpuZmuBcQJBAOXVU9oLDHvqg2vLpaCwAYV8noNvAlOEgEq/GDV9X6+TU/H4k9c+BsijC6rSeYeRtSKiRZ84qA9ZAPZaM/vrmS0CQQCOzlg64lpthn+AQfaICx2a1IvtRDDigyAWpvWY7nFelZ26dzshKMtptOIZhqhxhChlDOcjNbbSPb8So4URaDP1AkEAsIVjLKG1yeq5W26C3GKyGHM5T9tP3xNycXZJwrNzbWdrXvo7mmKSVUEc8etL2froMxyM+phKQ9dpLMzlBkTSVQJAeLDz6HA9NKujPmaBUOD0GFLiH5iuKAHiMMLSdnmu3t1b/KegFZpAsAnrvN8NpUKoUR7iieNvq6f7wGjqoZeLsQJBANprDC/OPq9YgFgthOzg0B3ujT4xV14T4S8WOGpqIwHuIm3x0a0/zsb2rB8o+QnFurAtQWZmQ15SaJIwUJUjXI8=";
        
    String a=new String(    Signaturer.sign(privateStr.getBytes(),"yangyang"));
    System.out.println(a.toString());
    
    SignProvider.verify(pubKeyText, plainText, signText)
        
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值