ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java非对称加密解密

2021-03-01 13:34:14  阅读:118  来源: 互联网

标签:Java String Base64 解密 RSA content return 非对称 throws


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

 

另外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;
    }
}

 

标签:Java,String,Base64,解密,RSA,content,return,非对称,throws
来源: https://www.cnblogs.com/tekikesyo/p/14463070.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有