Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >RSA公钥加密私钥解密实例

RSA公钥加密私钥解密实例

作者头像
DannyHoo
发布于 2018-09-13 04:47:04
发布于 2018-09-13 04:47:04
4.2K00
代码可运行
举报
文章被收录于专栏:Danny的专栏Danny的专栏
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1337170

1、加密、解密流程

2、实现

(1)RSA加密工具类 RSACrypt.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package club.easyshare.framework.utils;

import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

public class RSACrypt {

    /**
     * 生成RAS公钥与私钥字符串,直接返回
     *
     * @return
     */
    public static HashMap<String, String> getKeys() {
        HashMap<String, String> map = new HashMap<String, String>();
        KeyPairGenerator keyPairGen = null;
        try {
            keyPairGen = KeyPairGenerator.getInstance("RSA");
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 初始化密钥对生成器,密钥大小为96-1024位
        keyPairGen.initialize(1024, new SecureRandom());
        // 生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        // 得到公钥字符串
        String publicKey = base64ToStr(keyPair.getPublic().getEncoded());
        // 得到私钥字符串
        String privateKey = base64ToStr(keyPair.getPrivate().getEncoded());
        map.put("publicKey", publicKey);
        map.put("privateKey", privateKey);
        return map;
    }

    /**
     * 根据公钥字符串加载公钥
     *
     * @param publicKeyStr 公钥字符串
     * @return
     * @throws Exception
     */
    public static RSAPublicKey loadPublicKey(String publicKeyStr) throws Exception {
        try {
            byte[] buffer = javax.xml.bind.DatatypeConverter.parseBase64Binary(publicKeyStr);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
            return (RSAPublicKey) keyFactory.generatePublic(keySpec);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此算法", e);
        } catch (InvalidKeySpecException e) {
            throw new Exception("公钥非法", e);
        } catch (NullPointerException e) {
            throw new Exception("公钥数据为空", e);
        }
    }

    /**
     * 根据私钥字符串加载私钥
     *
     * @param privateKeyStr 私钥字符串
     * @return
     * @throws Exception
     */
    public static RSAPrivateKey loadPrivateKey(String privateKeyStr) throws Exception {
        try {
            byte[] buffer = javax.xml.bind.DatatypeConverter.parseBase64Binary(privateKeyStr);
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此算法", e);
        } catch (InvalidKeySpecException e) {
            throw new Exception("私钥非法", e);
        } catch (NullPointerException e) {
            throw new Exception("私钥数据为空", e);
        }
    }

    /**
     * 公钥加密
     *
     * @param publicKey     公钥
     * @param plainTextData 明文数据
     * @return
     * @throws Exception 加密过程中的异常信息
     */
    public static String encrypt(RSAPublicKey publicKey, byte[] plainTextData) throws Exception {
        if (publicKey == null) {
            throw new Exception("加密公钥为空, 请设置");
        }
        Cipher cipher = null;
        try {
            // 使用默认RSA
            cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] output = cipher.doFinal(plainTextData);
            return base64ToStr(output);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此加密算法");
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new Exception("加密公钥非法,请检查");
        } catch (IllegalBlockSizeException e) {
            throw new Exception("明文长度非法");
        } catch (BadPaddingException e) {
            throw new Exception("明文数据已损坏");
        }
    }


    /**
     * 私钥解密
     *
     * @param privateKey 私钥
     * @param cipherData 密文数据
     * @return 明文
     * @throws Exception 解密过程中的异常信息
     */
    public static String decrypt(RSAPrivateKey privateKey, byte[] cipherData) throws Exception {
        if (privateKey == null) {
            throw new Exception("解密私钥为空, 请设置");
        }
        Cipher cipher = null;
        try {
            // 使用默认RSA
            cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] output = cipher.doFinal(cipherData);
            return new String(output);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此解密算法");
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new Exception("解密私钥非法,请检查");
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
            throw new Exception("密文长度非法");
        } catch (BadPaddingException e) {
            e.printStackTrace();
            throw new Exception("密文数据已损坏");
        }
    }

    public static String base64ToStr(byte[] b) {
        return javax.xml.bind.DatatypeConverter.printBase64Binary(b);
    }

    public static byte[] strToBase64(String str) {
        return javax.xml.bind.DatatypeConverter.parseBase64Binary(str);
    }
}

(2)生成秘钥对,加密数据、解密数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) throws Exception {
    //初始化阶段,初始化后生成秘钥对
    //公钥发送给消息发送方用于加密传输数据;私钥严格保存于消息接收方,收到加密的消息之后进行解密
    HashMap<String, String> map = RSACrypt.getKeys();
    String privateKeyStr=map.get("privateKey");
    String publicKeyStr=map.get("publicKey");
    System.out.println("初始化私钥为:"+privateKeyStr);
    System.out.println("初始化共钥为:"+publicKeyStr);

    //消息发送方
    String originData="周末约你看电影吧";
    System.out.println("信息原文:"+originData);
    String encryptData=RSACrypt.encrypt(RSACrypt.loadPublicKey(publicKeyStr),originData.getBytes());
    System.out.println("加密后:"+encryptData);

    //消息接收方
    String decryptData=RSACrypt.decrypt(RSACrypt.loadPrivateKey(privateKeyStr),RSACrypt.strToBase64(encryptData));
    System.out.println("解密后:"+decryptData);
}

结果输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
初始化私钥为:MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAI2SyRvMxZTrlRx6oHav8lCECHX5wZ/pPkAsl1RIh/NMfV5wjN+3kGZrG6NEvI+xCuwwFGn8GwUDgqC6Hw5nA15chuRprZFDaXa9hFrC6r6jtQ6MPOsqdaDJSfpJIY64fZqoVLKdibV783mfL175n9IkaDuw3msumJyDOsgplIJ/AgMBAAECgYApC8rFBZyvbZIg3KjTYHXXxEATvGLX8y76OjNx20mXT7D1hZpCbp0uJJWxw4cL/h+VlOcGR3KqBHeGFBBXA6Tk8miMo/ZqXHVWF0pFc2eVbhpn3llOy+HHA92KRFakY14UWK5xGk+rU7y7/FJ2ehWbPr+HQES+1Z8B2RmLwUqU4QJBANqr3GZGtAnrkmK0Y4eNBa7oVyWM8lDqa40h6rCMifzPxNGw1DH5Yr55WN89z0MRJcJXHfoLgJzecbq4g8OMVpECQQClvaxLvMpZw3xqb6akE92pLZZlSKjKckHkE3/XTM6ZPF6o44SgSV2surUnYhA86KDDvEpMiR+YDFUdJ3z8vHAPAkEA2EMmG2SLhFAdm07KLHIVD9Gq9nE56TqeGZtUjzy+72/QOI4InlAFD1nVwhtQEwUvcc9Uz0l27i21DrSTY980cQJBAJUMuvqtgCgzdhrd57Wcq/WtqpfRPQI6uGjc5FYBm7YQpWwql6Xx9I0Wpz0Qolu0NIdyODsWAdSiGpUKYwuChx8CQETYzUXnFSrK4dp5na87j4nDZs/qeevfjBuhKiGIsSQ3SOTKdmpnVZRkGs6H/eEVcmYr1/H9T20Wx1A3oTmPMuE=
初始化共钥为:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCNkskbzMWU65UceqB2r/JQhAh1+cGf6T5ALJdUSIfzTH1ecIzft5BmaxujRLyPsQrsMBRp/BsFA4Kguh8OZwNeXIbkaa2RQ2l2vYRawuq+o7UOjDzrKnWgyUn6SSGOuH2aqFSynYm1e/N5ny9e+Z/SJGg7sN5rLpicgzrIKZSCfwIDAQAB
信息原文:周末约你看电影吧
加密后:XeIAoNZlyn+Mk17wsdPpl8SDlaq0B8NbIvQFVg9Ja+YHxuKretNMu61IRY5EFyPL/dXC/6KiDDINglP2HRX4JNbRZgzZd1rkqExW219psHQOhFzbFYZ3yKuI72C7S4/sqIM1eqlnkvIGBhJNLwOfzF6VjplsbHAiQ4fDhA57XI8=
解密后:周末约你看电影吧
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年04月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java加密与解密之非对称加密算法
非对称加密算法与对称加密算法的主要差别在于非对称加密算法用于加密和解密的密钥不相同,非对称加密算法密钥分为公钥和私钥,公钥加密只能用私钥解密,反之私钥加密只能用公钥解密。相比对称加密算法,非对称加密算法加/解密效率低,但安全性高,这两种算法一般结合使用。常见非对称加密算法有RSA、ECC、Elgamal等。
布禾
2020/11/24
1.2K0
RSA的java实现
RSA非对称加密整理 辅助类 package net.yun10000.zf.util; import Java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; public class RSAKeys { private RSAPublicKey publicKey; private RSAPrivateKey privateKey; public RSAPublicKey g
东营浪人
2019/09/05
7380
Java使用RSA加密解密签名及校验
再来一个Base64的类,当然你也可以用commons-codec-1.9.jar
全栈程序员站长
2021/04/13
4.4K0
Java使用RSA加密解密签名及校验
RSA加密算法心得
RSA加密密钥是非对称的,一般是成对出现分为公钥和私钥,所以也叫非对称加密,可以公钥加密,私钥解密,也可以私钥加密,公钥解密。
全栈程序员站长
2022/09/02
9870
RSA 加解密 1024 位 & 2048 位
RSA 算法是一种非对称加密算法,会生成一对 RSA 秘钥,即公钥+私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,接口根据私钥进行解密
BUG弄潮儿
2022/06/30
3K0
RSA 加解密 1024 位 & 2048 位
数据安全RSA算法,加密解密,签名验签流程详解
(1)、乙方生成一对密钥即公钥和私钥,私钥不公开,乙方自己持有,公钥为公开,甲方持有。
知了一笑
2019/10/23
2.1K0
数据安全RSA算法,加密解密,签名验签流程详解
RSA 非对称加密原理(小白也能看懂哦~)
RSA 加密原理 步骤 说明 描述 备注 1 找出质数 P 、Q - 2 计算公共模数 N = P * Q - 3 欧拉函数 φ(N) = (P-1)(Q-1) - 4 计算公钥E 1 < E < φ(N) E的取值必须是整数 E 和 φ(N) 必须是互质数 5 计算私钥D E * D % φ(N) = 1 - 6 加密 C = M E mod N C:密文 M:明文 7 解密 M =C D mod N C:密文 M:明文 公钥=(E , N) 私钥=(D, N) 对外,我们只暴露公钥。 示例 1、
java404
2018/05/18
6.4K2
RSA加密算法的java实现
实现基本上就是这样,都是大同小异。不过,问题来了,结下来才是重点。 **1. RSA加密算法对于加密数据的长度是有要求的。一般来说,明文长度小于等于密钥长度(Bytes)-11。解决这个问题需要对较长的明文进行分段加解密,这个上面的代码已经实现了。 2. 一旦涉及到双方开发,语言又不相同,不能够采用同一个工具的时候,切记要约定以下内容。 a)约定双方的BASE64编码 b)约定双方分段加解密的方式。我踩的坑也主要是这里,不仅仅是约定大家分段的大小,更重要的是分段加密后的拼装方式。doFinal方法加密完成后得到的仍然是byte[],因为最终呈现的是编码后的字符串,所以你可以分段加密,分段编码和分段加密,一次编码两种方式(上面的代码采用的是后一种,也推荐采用这一种)。相信我不是所有人的脑回路都一样的,尤其是当他采用的开发语言和你不通时。**
全栈程序员站长
2022/08/14
1.1K0
JAVA使用几种非对称加密
DH: package com.fengyunhe.asymmetric; import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin; import javax.crypto.*; import javax.crypto.interfaces.DHPublicKey; import javax.crypto.spec.DHParameterSpec; import java.security.*; import java.security
前Thoughtworks-杨焱
2021/12/08
4410
面试官:如何设计一个对外的安全接口?
哈喽,我是狗哥。最近在跟业务方对接需要我这边出个接口给到他们调用,这种涉及外部调用的接口设计,一般都涉及很多方面,比如:
JavaFish
2022/01/17
5730
面试官:如何设计一个对外的安全接口?
java RSA 解密
import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.secu
FHAdmin
2021/09/10
2.3K0
RSA加密解密(无数据大小限制,php、go、java互通实现)
RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题。明文长度需要小于密钥长度,而密文长度则等于密钥长度。因此当加密内容长度大于密钥长度时,有效的RSA加解密就需要对内容进行分段。
双鬼带单
2019/07/30
5K0
深入解析RSA算法原理及其安全性机制
RSA算法是一种广泛使用的公钥加密算法,它的名称来源于其创始人Ron Rivest、Adi Shamir和Leonard Adleman的首字母缩写。该算法于1977年首次被提出,并迅速成为公钥密码学的标准之一。RSA算法的安全性基于大数分解和离散对数等数学难题,使得它在保护数据隐私和完整性方面具有很高的可靠性。
公众号:码到三十五
2024/04/02
1.8K0
深入解析RSA算法原理及其安全性机制
AES,RSA公私钥加解密
密钥是成对存在的,加密和解密是采用不同的密钥(公开密钥),也就是非对称密钥密码系统,每个通信方均需要两个密钥,即公钥和私钥,使用公钥进行加密操作,使用私钥进行解密操作。公钥是公开的,不需要保密,而私钥是由个人自己持有,并且必须妥善保管和注意保密。密码学里面博大精深,下面的实例仅供参考
kl博主
2023/11/18
3730
RSA加解密算法的Java实现
发布者:全栈程序员栈长,转转请注明出处:https://javaforall.cn/100043.html原文链接:
全栈程序员站长
2021/04/13
2.1K0
Android移动开发-Android数据加密与解密的实现「建议收藏」
Demo程序源码下载地址一(GitHub) Demo程序源码下载地址二(Gitee)
全栈程序员站长
2022/08/29
1.2K0
Android移动开发-Android数据加密与解密的实现「建议收藏」
SpringBoot 实现 RAS+AES 自动接口解密
目前常用的加密方式就对称性加密和非对称性加密,加密解密的操作的肯定是大家知道的,最重要的使用什么加密解密方式,制定什么样的加密策略;考虑到我技术水平和接口的速度,采用的是RAS非对称加密和AES对称加密一起用!!!!
程序员蜗牛
2024/05/10
1470
SpringBoot 实现 RAS+AES 自动接口解密
【Java小工匠聊密码学】--非对称加密--DH密钥交换算法
Diffie-Hellman由Whitfield Diffie和Martin Hellman在1976年公布的一种密钥一致性算法。Diffie-Hellman是一种建立密钥的方法,而不是加密方法。然而,它所产生的密钥可用于加密、进一步的密钥管理或任何其它的加密方式。Diffie-Hellman密钥交换算法及其优化首次发表的公开密钥算法出现在Diffie和Hellman的论文中,这篇影响深远的论文奠定了公开密钥密码编码学。
Java小工匠
2018/08/10
1.3K0
【Java小工匠聊密码学】--非对称加密--DH密钥交换算法
Android RSA加解密
如下代码: ublic class RSAUtils { private static String RSA = "RSA"; /** * 随机生成RSA密钥对(默认密钥长度为1024) * * @return */ public static KeyPair generateRSAKeyPair() { return generateRSAKeyPair(1024
胖虎哥
2023/05/10
8210
JavaRSA加密工具类
公钥加密算法,也就是 非对称加密算法,这种算法加密和解密的密码不一样,一个是公钥,另一个是私钥:
崔笑颜
2020/06/08
4.4K0
相关推荐
Java加密与解密之非对称加密算法
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验