zoukankan      html  css  js  c++  java
  • java中的使用RSA算法进行公钥加密私钥解密 .

     一个比较简单的实现:一个三个类KeyGenerater生成公钥私钥对,Signaturer类使用私钥签名,SignProvider用公钥验证。公钥和私钥使用Base64加密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.encodeToByte(pubkey.getEncoded());
       priKey = Base64.encodeToByte(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;
     }
    }

    public class Signaturer {
     /**
      *
      * Description:数字签名
      *
      * @param priKeyText
      * @param plainText
      * @return
      * @author 孙钰佳
      * @since:2007-12-27 上午10:51:48
      */
     public static byte[] sign(byte[] priKeyText, String plainText) {
      try {
       PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64
         .decode(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.encodeToByte(signet.sign());
       return signed;
      } catch (java.lang.Exception e) {
       System.out.println("签名失败");
       e.printStackTrace();
      }
      return null;
     }
    }

    public class SignProvider {
     private SignProvider() {

     }

     /**
      *
      * Description:校验数字签名,此方法不会抛出任务异常,成功返回true,失败返回false,要求全部参数不能为空
      *
      * @param pubKeyText
      *            公钥,base64编码
      * @param plainText
      *            明文
      * @param signTest
      *            数字签名的密文,base64编码
      * @return 校验成功返回true 失败返回false
      * @author 孙钰佳
      * @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.decode(pubKeyText));
       // RSA对称加密算法
       java.security.KeyFactory keyFactory = java.security.KeyFactory
         .getInstance("RSA");
       // 取公钥匙对象
       java.security.PublicKey pubKey = keyFactory
         .generatePublic(bobPubKeySpec);
       // 解密由base64编码的数字签名
       byte[] signed = Base64.decode(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;
      }
     }
    }

  • 相关阅读:
    [洛谷P2463][SDOI2008]Sandy的卡片
    后缀数组
    周记【距gdoi:110天】
    hdu3068最长回文(Manacher算法)
    二分图的一些题目合集
    周记【距gdoi:117天】
    二分图、网络流模版总结
    2014end
    周记【距gdoi:126天】
    2-sat
  • 原文地址:https://www.cnblogs.com/langtianya/p/2887500.html
Copyright © 2011-2022 走看看