• 【加密】RSA验签及加密


    通过OpenSSL生成公私钥文件(如果没有OpenSSL工具建议下载Cmder工具自带OpenSSL指令)

    1、生成RSA密钥的方法 

     genrsa -out private-rsa.key 2048

    2、获取客户端公钥文件

    openssl  req -new -x509 -key private-rsa.key -days 750 -out public-rsa.cer

    3、获取服务器私钥文件

    openssl pkcs12 -export -name zhangsan -in public-rsa.cer -inkey private-rsa.key -out user-rsa.pfx

    4、获取密钥文件的5元组数据

    openssl rsa -in private-rsa.key -noout -text

    Java实现私钥签名、公钥验签、私钥加密数据、公钥解密数据

     
    import javax.crypto.Cipher;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.security.KeyStore;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.Signature;
    import java.security.cert.Certificate;
    import java.security.cert.CertificateFactory;
    
    public class Sha1withRSAUtil {
        private static final String publicKeyFileName = System.getProperty("user.dir") + File.separator + "pubkey.cer";
        private static final String privateKeyFileName = System.getProperty("user.dir") + File.separator + "private.pfx";
        private static final String pfxPassword = "123";//私钥文件获取时设置的密钥
        private static String aliasName = "003";//alias名称
    
        /**
         * 签名
         *
         * @return 签名后经过base64处理的字符串
         * @throws Exception
         */
        public static String sign(String str) {
            String base64Sign = "";
            InputStream fis = null;
            try {
                fis = new FileInputStream(privateKeyFileName);
                KeyStore keyStore = KeyStore.getInstance("PKCS12");
                char[] pscs = pfxPassword.toCharArray();
                keyStore.load(fis, pscs);
                PrivateKey priKey = (PrivateKey) (keyStore.getKey(aliasName, pscs));
                // 签名
                Signature sign = Signature.getInstance("SHA1withRSA");
                sign.initSign(priKey);
                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();
            } finally {
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return base64Sign;
        }
    
        /**
         * 数据验证
         *
         * @param signStr 加密后的数据
         * @param verStr  原始字符
         * @return
         */
        public static boolean verify(String signStr, String verStr)
                throws Exception {
            boolean verfy = false;
            InputStream fis = null;
            try {
                fis = new FileInputStream(publicKeyFileName);
                CertificateFactory cf = CertificateFactory.getInstance("x509");
                Certificate cerCert = cf.generateCertificate(fis);
                PublicKey pubKey = cerCert.getPublicKey();
                BASE64Decoder decoder = new BASE64Decoder();
                byte[] signed = decoder.decodeBuffer(signStr);
                Signature sign = Signature.getInstance("SHA1withRSA");
                sign.initVerify(pubKey);
                sign.update(verStr.getBytes("UTF-8"));
                verfy = sign.verify(signed);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return verfy;
        }
    
    
        /**
         * 通过公钥文件进行加密数据
         *
         * @return 加密后经过base64处理的字符串
         */
        public static String encrypt(String source) throws Exception {
            InputStream fis = null;
            try {
                fis = new FileInputStream(publicKeyFileName);
                CertificateFactory cf = CertificateFactory.getInstance("x509");
                Certificate cerCert = cf.generateCertificate(fis);
                PublicKey pubKey = cerCert.getPublicKey();
                Cipher cipher = Cipher.getInstance("RSA");
                cipher.init(Cipher.ENCRYPT_MODE, pubKey);
                byte[] sbt = source.getBytes();
                byte[] epByte = cipher.doFinal(sbt);
                BASE64Encoder encoder = new BASE64Encoder();
                String epStr = encoder.encode(epByte);
                return epStr;
            } finally {
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        /**
         * 通过私钥文件进行解密数据
         *
         * @return 解密后的明文字符串
         */
        public static String decode(String source) throws Exception {
            BASE64Decoder b64d = new BASE64Decoder();
            byte[] keyByte = b64d.decodeBuffer(source);
            InputStream fis = null;
            try {
                fis = new FileInputStream(privateKeyFileName);
                KeyStore keyStore = KeyStore.getInstance("PKCS12");
                char[] pscs = pfxPassword.toCharArray();
                keyStore.load(fis, pscs);
                PrivateKey priKey = (PrivateKey) (keyStore.getKey(aliasName, pscs));
                Cipher cipher = Cipher.getInstance("RSA");
                cipher.init(Cipher.DECRYPT_MODE, priKey);
                byte[] epByte = cipher.doFinal(keyByte);
                return new String(epByte, "UTF-8");
            } finally {
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
     

    使用方法

     
    import com.util.rsa.Sha1withRSAUtil;
    
    public class Main {
    
        public static void main(String[] args) {
            String data = "name123456789";
            String signData = Sha1withRSAUtil.sign(data);
            System.out.println(signData);
    
            try {
                boolean flag = Sha1withRSAUtil.verify(signData, data);
                System.out.println(flag);
    
                String eData = Sha1withRSAUtil.encrypt(data);
                System.out.println(eData);
                String dData = Sha1withRSAUtil.decode(eData);
                System.out.println(dData);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
     
  • 相关阅读:
    广义斐波那契数列 矩阵乘法
    GCD
    [SDOI2008]沙拉公主的困惑 线性筛_欧拉函数_逆元_快速幂
    [SDOI2008]仪仗队 欧拉函数
    洛谷P2617 Dynamic Rankings 主席树 单点修改 区间查询第 K 大
    洛谷P3919 【模板】可持久化数组(可持久化线段树/平衡树)
    Codevs 3269 混合背包
    洛谷P3834 【模板】可持久化线段树 1 主席树
    矩形面积求并 扫描线 + 过不去
    灾后重建 Floyd
  • 原文地址:https://www.cnblogs.com/itplay/p/11283972.html
Copyright © 2020-2023  润新知