RSA签名即校验

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)Integer.parseInt(item, 16);
        }
        return b2;
    }
    /**
     * 签名
     *
     * @return 签名后经过base64处理的字符串
     * @throws Exception
     */
    public static String sign(String str) {
        String base64Sign = "";
        try {
            // 签名
            Signature sign = Signature.getInstance("SHA1withRSA");
            sign.initSign(rk);
            byte[] bysData = str.getBytes("UTF-8");
            sign.update(bysData);
            byte[] signByte = sign.sign();
            BASE64Encoder encoder = new BASE64Encoder();
            base64Sign = encoder.encode(signByte);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return base64Sign;
    }

    /**
     * 数据验证
     *
     * @param signStr 加密后的数据
     * @param verStr  原始字符
     * @return
     */
    public static boolean verify(String signStr, String verStr){
        boolean verfy = false;
        try {
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] signed = decoder.decodeBuffer(signStr);
            Signature sign = Signature.getInstance("SHA1withRSA");
            sign.initVerify(uk);
            sign.update(verStr.getBytes("UTF-8"));
            verfy = sign.verify(signed);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return verfy;
    }
    /**
     * 使用私钥对数据进行加密签名
     * @param data 数据
     * @param privateKeyString 私钥
     * @return 加密后的签名
     */
    public static String sign(String data, String privateKeyString) throws Exception {
        KeyFactory keyf = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyf.generatePrivate(new PKCS8EncodedKeySpec(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);
    }
    /**
     * 使用公钥判断签名是否与数据匹配
     * @param data 数据
     * @param sign 签名
     * @param publicKeyString 公钥
     * @return 是否篡改了数据
     */
    public static boolean verify(String data, String sign, String publicKeyString) throws Exception {
        KeyFactory keyf = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyf.generatePublic(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("校验:"+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

 

转载于:https://www.cnblogs.com/fengmo2427/p/11225424.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值