Java非对称加密解密

从微信公众号摘抄,稍加改动,收藏

 

另外https://www.jianshu.com/p/048be4864559 写得挺好

复制代码
import lombok.Data;

import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

public class SignatureUtil {

    /**
     * 生成公钥和私钥
     *
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static Keys generateKey() throws NoSuchAlgorithmException {
        Keys resultMap = new Keys();
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        Base64.Encoder encoder = Base64.getEncoder();
        resultMap.setPrivateKey(encoder.encodeToString(keyPair.getPrivate().getEncoded()));
        resultMap.setPublicKey(encoder.encodeToString(keyPair.getPublic().getEncoded()));
        return resultMap;
    }

    /**
     * RSA加密-pub-en,pri-de
     *
     * @param key
     * @param content
     * @return
     * @throws Exception
     */
    public static String rsaEncrypt(String key, String content) throws Exception {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(key))));
        byte[] bytes = cipher.doFinal(content.getBytes());
        return Base64.getEncoder().encodeToString(bytes);
    }

    /**
     * RSA解密-pub-en,pri-de
     *
     * @param key
     * @param content
     * @return
     * @throws Exception
     */
    public static String rsaDecrypt(String key, String content) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(key))));
        byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(content));
        return new String(bytes);
    }

    /**
     * RSA加密-pri-en,pub-de
     *
     * @param key
     * @param content
     * @return
     * @throws Exception
     */
    public static String rsaEncryptReverse(String key, String content) throws Exception {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(key))));
        byte[] bytes = cipher.doFinal(content.getBytes());
        return Base64.getEncoder().encodeToString(bytes);
    }

    /**
     * RSA解密-pri-en,pub-de
     *
     * @param key
     * @param content
     * @return
     * @throws Exception
     */
    public static String rsaDecryptReverse(String key, String content) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, keyFactory.generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(key))));
        byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(content));
        return new String(bytes);
    }

    /**
     * 私钥签名
     *
     * @param privateKeyStr
     * @param content
     * @return
     * @throws Exception
     */
    public static String generateSignature(String privateKeyStr, String content) throws Exception {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Signature signature = Signature.getInstance("SHA1withRSA");
        PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyStr)));
        signature.initSign(privateKey);
        signature.update(content.getBytes());
        return Base64.getEncoder().encodeToString(signature.sign());
    }

    /**
     * 公钥验证
     *
     * @param publicKeyStr
     * @param content
     * @param sign
     * @return
     * @throws Exception
     */
    public static boolean verifySignature(String publicKeyStr, String content, String sign) throws Exception {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Signature signature = Signature.getInstance("SHA1withRSA");
        PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyStr)));
        signature.initVerify(publicKey);
        signature.update(content.getBytes());
        return signature.verify(Base64.getDecoder().decode(sign));
    }

    public static void main(String[] args) throws Exception {
        String content = "大王叫我来巡山呐";

        //生成密钥对
        Keys keys = generateKey();

        //公钥加密,私钥解密
        String publicKeyData = rsaEncrypt(keys.publicKey, content);
        System.out.println("公钥加密:" + publicKeyData);
        System.out.println("私钥解密:" + rsaDecrypt(keys.privateKey, publicKeyData));

        //私钥加密,公钥解密
        String privateKeyData = rsaEncryptReverse(keys.privateKey, content);
        System.out.println("私钥加密:" + privateKeyData);
        System.out.println("公钥解密:" + rsaDecryptReverse(keys.publicKey, privateKeyData));


        //私钥签名
        String sign = generateSignature(keys.privateKey, content);
        System.out.println("私钥签名:" + sign);

        //公钥验证
        boolean verifyResult = verifySignature(keys.publicKey, content, sign);
        System.out.println("公钥验证:" + verifyResult);

        //将内容做下修改,再进行公钥验证
        boolean verifyResult2 = verifySignature(keys.publicKey, content + "啦啦啦啦", sign);
        System.out.println("公钥验证:" + verifyResult2);
    }

    @Data
    public static class Keys {
        public String publicKey;
        public String privateKey;
    }
}
复制代码

 

posted @   multitude  阅读(113)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示