博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java RSA实现私钥签名、公钥验签、私钥加密数据、公钥解密数据
阅读量:4655 次
发布时间:2019-06-09

本文共 6050 字,大约阅读时间需要 20 分钟。

通过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();        }    }}

 

转载于:https://www.cnblogs.com/blogzhangwei/p/10145167.html

你可能感兴趣的文章
IntelliJ idea学习资源
查看>>
Django Rest Framework -解析器
查看>>
ExtJs 分组表格控件----监听
查看>>
Hibernate二级缓存配置
查看>>
LoadRunner常用术语
查看>>
关于jedis2.4以上版本的连接池配置,及工具类
查看>>
记忆讲师石伟华微信公众号2017所有文章汇总(待更新)
查看>>
mechanize (1)
查看>>
FactoryBean
查看>>
Coolite动态加载CheckboxGroup,无法在后台中获取
查看>>
如何在我们项目中利用开源的图表(js chart)
查看>>
nfs服务器工作原理
查看>>
C3P0连接池工具类使用
查看>>
SVN常用命令备注
查看>>
孩子教育
查看>>
解决Cacti监控图像断断续续问题
查看>>
结构体的传参理解成员的存储方式
查看>>
python 进程与线程(理论部分)
查看>>
什么是API
查看>>
[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
查看>>