That RSA signature verification

package com.okni.okpool.okfinance.util;
import jodd.util.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
/**
 * 创建人:kerns
 * 创建时间: 2019/7/17 2:51 PM
 **/
public class RSACrypto {
    private final static String RSA = "RSA";
    public static PublicKey uk;
    public static PrivateKey rk;

    public static void generateKey() throws Exception{

        KeyPairGenerator gen = KeyPairGenerator.getInstance(RSA);
        gen.initialize(1024, new SecureRandom());
        KeyPair keyPair = gen.generateKeyPair();
        uk = keyPair.getPublic();
        System.out.println("公钥===="+uk.getFormat());
        rk = keyPair.getPrivate();
        System.out.println("私钥===="+rk.toString());
        System.out.println("公钥:"+new BASE64Encoder().encodeBuffer(uk.getEncoded()));

        System.out.println("私钥:"+new BASE64Encoder().encodeBuffer(rk.getEncoded()));


    }
    private static byte[] encrypt(String text, PublicKey pubRSA) throws Exception{

        Cipher cipher = Cipher.getInstance(RSA);
        cipher.init(Cipher.ENCRYPT_MODE, pubRSA);
        return cipher.doFinal(text.getBytes());
    }
    public final static String encrypt(String text){

        try {
            return byte2hex(encrypt(text, uk));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    public final static String decrypt(String data){

        try{
            return new String(decrypt(hex2byte(data.getBytes())));
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] decrypt(byte[] src) throws Exception{

        Cipher cipher = Cipher.getInstance(RSA);
        cipher.init(Cipher.DECRYPT_MODE, rk);
        return cipher.doFinal(src);
    }

    public static String byte2hex(byte[] b){

        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n ++)
        {
            stmp = Integer.toHexString(b[n] & 0xFF);
            if (stmp.length() == 1)
                hs += ("0" + stmp);
            else
                hs += stmp;
        }
        return hs.toUpperCase();
    }

    public static byte[] hex2byte(byte[] b){

        if ((b.length % 2) != 0)
            throw new IllegalArgumentException("长度不是偶数");

        byte[] b2 = new byte[b.length / 2];

        for (int n = 0; n < b.length; n += 2)
        {
            String item = new String(b, n, 2);
            b2[n/2] = (byte) The Integer.parseInt (Item, 16); 
        } 
        Return B2; 
    } 
    / ** 
     * Signature 
     * 
     * @return the signature process after base64 string 
     * @throws Exception
      * / 
    public  static String Sign (String STR) { 
        String base64Sign = "" ;
         the try {
             // signature 
            Sign = Signature.getInstance the Signature ( "SHA1withRSA" ); 
            sign.initSign (RK); 
            byte [] = bysData str.getBytes ( "UTF-. 8" ); 
            sign.update (bysData); 
            byte[] = SignBytesign.sign (); 
            Base64Encoder Encoder = new new Base64Encoder (); 
            base64Sign = encoder.encode (signByte); 
        } the catch (Exception E) { 
            e.printStackTrace (); 
        } 
        return base64Sign; 
    } 

    / ** 
     * Verification 
     * 
     * @ param encrypted data signStr 
     * @param verstr original character 
     * @return 
     * / 
    public  static  Boolean Verify (signStr String, String verstr) {
         Boolean verfy = to false;
         The try { 
            Base64Decoder Decoder = new new Base64Decoder ();
             byte [] = Signed decoder.decodeBuffer (signStr); 
            the Signature Sign = Signature.getInstance ( "SHA1withRSA" ); 
            sign.initVerify (UK); 
            sign.update (verStr.getBytes ( "UTF-. 8" )); 
            verfy = sign.verify (signed); 
        } the catch (Exception E) { 
            e.printStackTrace (); 
        } 
        return verfy; 
    } 
    / **
     * Encrypts the data using the private key signing 
     * @param Data Data 
     * @param privateKeyString private key 
     * @return encrypted signature
      * / 
    public  static String Sign (Data String, String privateKeyString) throws Exception { 
        the KeyFactory keyf = KeyFactory.getInstance ( "the RSA" ); 
        the privateKey privateKey = keyf.generatePrivate ( new new PKCS8EncodedKeySpec with (Base64.decode (privateKeyString))); 
        java.security.Signature Signet = java.security.Signature.getInstance ( "SHA1withRSA" ); 
        signet.initSign (privateKey) ;
        signet.update (data.getBytes ( "UTF-. 8" ));
        byte [] = Signed signet.sign ();
         return Base64.encodeToString (Signed); 
    } 
    / ** 
     * using the public key signature is determined whether the data matches 
     * @ param data data 
     * @param Sign signature 
     * @param publicKeyString public 
     * @return whether the tampered data
      * / 
    public  static  Boolean Verify (data String, String Sign, String publicKeyString) throws Exception { 
        the KeyFactory keyf = KeyFactory.getInstance ( "the RSA" ); 
        PublicKey publicKey = keyf.generatePublic ( new new X509EncodedKeySpec(Base64.decode(publicKeyString)));
        java.security.Signature signet = java.security.Signature.getInstance("SHA1withRSA");
        signet.initVerify(publicKey);
        signet.update(data.getBytes("utf-8"));
        return signet.verify(Base64.decode(sign));

    }
    //just for test
    public static void main(String args[]){

        try{
          // RSACrypto.generateKey();
//            String cc="mnn123456";
//            String md5datas="mnn123456";// Md5Utils.getMD5(cc,"UTF-8");
//            System.out.println("MD5:"+md5datas);
//            String cipherText = RSACrypto.encrypt(md5datas);
//            System.out.println("密文是:"+cipherText);
//            String plainText = RSACrypto.decrypt(cipherText);
//            System.out.println("明文是:"+plainText);
//            String signData = RSACrypto.sign(md5datas);
//            System.out.println("签名:"+signData);
//            boolean flag = RSACrypto.verify(signData, md5datas);
//            System.out.println ( "verification:" + flag);

            //私钥
            String privateKeyString = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANjUPqvutSFTALjOpgjN27bXL8oYY6UKjqNetcaBf1nbnVczPenH2BMehN5iq+ibYf/PgwuMbKIoBGxTEIvqdm3jAvcaqMYkWQwVW+NQ4AO7bR4IGAcdZXMpnaoS03yeoUC4jm/6nKfv10SL3bnZpZamznY3eAC5MGsYwzg+D0gzAgMBAAECgYBCS7LV0uiixcQkvVpausaBAw5jlk1xOucd4GlnxlRv3wwei1ZU0nuobN5nOHgjaM7v7jy9HTRh6CZiEIuwnAGVSx1+91K042rraLhQ9iomRqxZqymPAF6o+g+QhlPbjC62j1eeJvFivcwzpdH7SPdjdFpmDX31VYx01HyFYSEqwQJBAP7R7U3S/BduCS6kjEVry2B5u/l597Jr9Eut0M/D7zbJgREgCi1OiF1V3c34cnBQhRuhhojD3pm9q/3s9WNn0ZECQQDZ1Ugvsqc/b4lBYFDa6uaoIjboLB/MGZi3Pr58Q/xMZa1vZQbYeiCAqJQsBvEPnM/HC2HL7zKcHc8C505BKNuDAkEA3QgdDkd3sZ8ZyeKjZcgl5m5Rtgms6JApnMeNe9qaEezhzof7K+eV81f7CKF8Kp49h4UpnFJCMRtMJ/s1s18ncQJBAJIMcc2pFoFtorT2gr+EZwmrhuy7SMZrEv0pUEW4v1vpgBMDxUc2+rvISzAJp240UQq/Et7MjT4mrjjgJJODdUkCQBeydFAFY8LpQkxOStq7+avjgDpZ8wFc6dFEgS/mLbQPERBlYoW/+epGdUdZPYCWv252hf5MIadwM5a3TQvtDcA=";


            //公钥
            String publicKeyString = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDY1D6r7rUhUwC4zqYIzdu21y/KGGOlCo6jXrXGgX9Z251XMz3px9gTHoTeYqvom2H/z4MLjGyiKARsUxCL6nZt4wL3GqjGJFkMFVvjUOADu20eCBgHHWVzKZ2qEtN8nqFAuI5v+pyn79dEi9252aWWps52N3gAuTBrGMM4Pg9IMwIDAQAB";
//私钥
//            String privateKeyString =new BASE64Encoder().encodeBuffer(rk.getEncoded());
//            //公钥
//            String publicKeyString =new BASE64Encoder().encodeBuffer(uk.getEncoded());
            System.out.println("公钥:"+publicKeyString);

            System.out.println("私钥:"+privateKeyString);
                    String data = "mnn123456";
          String s = sign(data, privateKeyString.replace("\n",""));
            System.out.println("针对数据["  + data + "]签名: " + s);

//            data = "mnn123456";
//String s="ER4w5KXI/JrhQ7l8No4iTlNuewhaa8bWRpu4jVJq/P7Wz6qiTRXfqETrGg4/NHO/dVi45ZsK5p3kk8hPue95HBj8bUSEd0eJ2TePOfiZrJwPWVxO+B4K9SvtpJhKiDQA9K+cuPCLQWWglJ3SkkNozf1h4N6W8rz4jRspwEdRQcA=";
            System.out.println("签名验证结果:" + verify(data, s, publicKeyString.replace("\n","")));


        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
View Code

 

Guess you like

Origin www.cnblogs.com/fengmo2427/p/11225424.html