MD5withRSA算法加密

私钥计算

 public static PrivateKey getPrivateKey(String key) {
          byte[] keyBytes;
          keyBytes = java.util.Base64.getDecoder().decode(key);
          PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
          KeyFactory keyFactory;
          try {
               keyFactory = KeyFactory.getInstance("RSA");

               PrivateKey priKey;

               priKey = keyFactory.generatePrivate(keySpec);

               return priKey;
          } catch (InvalidKeySpecException e) {
               System.out.println("InvalidKeySpecException[私钥]:" + e.getStackTrace());
          }catch (NoSuchAlgorithmException e) {
               System.out.println("NoSuchAlgorithmException[私钥]:" + e.getStackTrace());
          }
          return null;

     }

公钥计算

     public static PublicKey getPublicKey(String key) {
          byte[] keyBytes;
          keyBytes = java.util.Base64.getDecoder().decode(key);
          X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
          KeyFactory keyFactory;

          try {
               keyFactory = KeyFactory.getInstance("RSA");

               PublicKey pubKey;

               pubKey = keyFactory.generatePublic(keySpec);

               return pubKey;
          } catch (InvalidKeySpecException e) {
               System.out.println("InvalidKeySpecException[公钥]:" + e.getStackTrace());
          }catch (NoSuchAlgorithmException e) {
               System.out.println("NoSuchAlgorithmException[公钥]:" + e.getStackTrace());
          }
          return null;

     }

用md5生成内容摘要,再用RSA的私钥加密,进而生成数字签名

static String getMd5Sign(String content , PrivateKey privateKey) throws Exception {
          byte[] contentBytes = content.getBytes("utf-8");
          // 返回MD5withRSA签名算法的 Signature对象
          Signature signature = Signature.getInstance("MD5withRSA");
          signature.initSign(privateKey);
          signature.update(contentBytes);
          byte[] signs = signature.sign();
          return Base64.encodeBase64String(signs);
     }

对用md5和RSA私钥生成的数字签名进行验证

  static boolean verifyWhenMd5Sign(String content, String sign, PublicKey publicKey) throws Exception {
          byte[] contentBytes = content.getBytes("utf-8");
          Signature signature = Signature.getInstance("MD5withRSA");
          signature.initVerify(publicKey);
          signature.update(contentBytes);
          return signature.verify(Base64.decodeBase64(sign));
     }

测试


public static void main(String[] args)  throws Exception {
          String content = "ZGF0YT17ImJhdGNoTnVtYmVyIjoiMjAyMTA0MjUxMzM3MDExMTAxMDExMyIsIm1kNSI6WyJiYmQ1ZDg5MzgzNTVlZTY1M2Y4MjdiYWFmODdlMzQ2MSIsImE2ODBkMDQ0NWMxNjVmYjQyYjQ0OTc2ZjZkNGEzN2ViIiwiYzlkYzM2OTgzM2RiOTMxMWQyMDFlN2JlNjFhODc2NDQiXX0mZmlsZVVzZXI9ZGVtb1VzZXJOYW1lJnJlcXVlc3RJZD04YTlhMTcxNWQ5OTQ0YTIyM2ExZDE3N2Y3YjlhMjEyNyZ0aW1lc3RhbXA9MTYwOTEzNDczNTczNA==";
          
          PublicKey publicKey = getPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSeFx6/ew7RWYlL2YmUkwa5gFu/lhBTQjQ+vi4+VIgBDpl2pGrB+NpHqn8eQBLZqV7REVADR8877jH/MQXwylJ7jL/v19Cr/vNIniE1v9W134/oIR3M9JMhlvFlO5+2xJppS4OoOzbF795OCbETWwaBV5vmP8rOBsbz6V7jxloPwIDAQAB");
          PrivateKey privateKey =  getPrivateKey("MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBANJ4XHr97DtFZiUvZiZSTBrmAW7+WEFNCND6+Lj5UiAEOmXakasH42keqfx5AEtmpXtERUANHzzvuMf8xBfDKUnuMv+/X0Kv+80ieITW/1bXfj+ghHcz0kyGW8WU7n7bEmmlLg6g7NsXv3k4JsRNbBoFXm+Y/ys4GxvPpXuPGWg/AgMBAAECgYArqcSlz1/eu/sA4+BxOsmHGwhZGnL8uRqHIEnRNggPlFD5KGrn7G8FM9NYCVJCUj0qYXNsYkyEu8a91nZn55j82OW86sG8IlnNsfyQF4PyxcbLfx/Z/QRVB9eli/FS9mJxzQG4rbAl78JHv9Bd4OSxv1wvtxLFlbDHfYJ/9Fpe4QJBAPfAtHZyhtESL72FoE2VZHjap9eXbgCoxqskkL7Z/h/CpWkSRs2RII9L7DOYak6CoobucQAeYGwtONZwgf/y4SUCQQDZefEygYEfWMfgbMpmiqqPkKogOtESqD3ZxZpyFNMiF4B14pVzPTuNMTTbu4Jqt2g0I6QoAes/y+WRAc65z6CTAkEAo733B3m15KPybX3NbrlXyBArce+hQkpJ0369M4X70J3imMj9hotuS4bQO2F2kSEBrdAVWxC4hYZ11DRTlwe9CQJBAK3LEmKPNbXsSAbkSbc6d2U1cY9CEZR8WLkwfeVPGQ70gxcyFMa8F1wVB63VojpQCXkpRmUma25XLkT8kczRzPsCQQD130tvHXHd0YQw0qhBRZyO/ZbWUrWhFhl/MJwKOL+xAWhwA27dv7DyLkEFIImHiVK1vlwClt6NrQpOupNHOsrL");

          String md5Sign  = getMd5Sign(content,privateKey);
          System.out.println("MD5withRSA算法的签名 :"+ md5Sign);
          boolean md5Verifty = verifyWhenMd5Sign(content,md5Sign,publicKey);
          System.out.println("MD5withRSA算法的签名验签结果 :"+ md5Verifty);

     }

上一篇:批量爬取酷狗音乐js逆向解析思路


下一篇:数字签名与验签