RSA加密算法实现 Java版

Java 非对称加密RSA应用实现 RSA算法是一种非对称加密算法,与对称加密算法不同的是,RSA算法有两个不同的密钥,一个是公钥,一个是私钥。RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即私有密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。 阅读详情

什么是RSA加密算法?

RSA加密算法是一种非对称加密算法,其玩法打破了以往所有加密算法的规则.在RSA出现之前,所有的加密方法都是同一种模式:加密解密的规则使用同一种方式.这种长达几个世纪的加密方案有一个致命的缺陷.在传递加密信息时,必须让对方拿到解密的规则才能正常解密.由于加密解密的规则一致,所以保存和传递"密钥",就成了最头疼的问题。

  • 使用公钥加密的数据,利用私钥进行解密
  • 使用私钥加密的数据,利用公钥进行解密

RSA加密使用了"一对"密钥.分别是公钥和私钥,这个公钥和私钥其实就是一组数字!其二进制位长度可以是1024位或者2048位.长度越长其加密强度越大,目前为止公之于众的能破解的最大长度为768位密钥,只要高于768位,相对就比较安全.所以目前为止,这种加密算法一直被广泛使用.

如何使用?

公钥PK
私钥SK
明文P
RSA加密算法
密文T
网络传输
RSA解密算法
明文P
生成RSA非对称密钥对 SK&PK
/**
     /**
     * 生成RSA密钥对
     *
     * @return Keys.Rsa
     * @throws NoSuchAlgorithmException
     */
    public static Keys.Rsa genKey() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
        keyPairGen.initialize(1024, new SecureRandom());
        KeyPair keyPair = keyPairGen.generateKeyPair();
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        String publicKeyString = Tools.encodeToString(publicKey.getEncoded());
        String privateKeyString = Tools.encodeToString((privateKey.getEncoded()));
        Keys.Rsa rsa = new Keys().new Rsa(publicKeyString, privateKeyString);
        return rsa;
    }
RSA 公钥加密
/**
     /**
     * RSA 公钥加密
     *
     * @param str
     * @param publicKey
     * @return
     * @throws Exception
     */
    public static String encrypt(String str, String publicKey) throws Exception {
        //base64编码的公钥
        byte[] keyBytes = Tools.decode(publicKey);
        KeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance(KEY_ALGORITHM).generatePublic(keySpec);
        //RSA加密
        Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        String outStr = Tools.encodeToString(cipher.doFinal(str.getBytes(Charsets.UTF_8)));
        return outStr;
    }
RSA 私钥解密
/**
     /**
     * RSA 私钥解密
     *
     * @param str
     * @param privateKey
     * @return
     * @throws Exception
     */
    public static String decrypt(String str, String privateKey) throws Exception {
        //base64编码的私钥
        byte[] keyBytes = Tools.decode(privateKey);
        KeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance(KEY_ALGORITHM).generatePrivate(keySpec);
        //RSA解密
        Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        //64位解码加密后的字符串
        byte[] inputByte = Tools.decode(str.getBytes(Charsets.UTF_8));
        return new String(cipher.doFinal(inputByte));
    }
Test测试
import com.alibaba.fastjson.JSON;
import com.pnoker.common.bean.encryp.Keys;
import com.pnoker.common.utils.encryp.AesTools;
import com.pnoker.common.utils.encryp.RsaTools;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * <p>Copyright(c) 2018. Pnoker All Rights Reserved.
 * <p>Author     : Pnoker
 * <p>Email      : pnokers@gmail.com
 * <p>Description: AES\RSA 加密算法测试
 */
@Slf4j
public class TestEncrypt {
	@Test
    public void aesTest() throws Exception {
        Keys.Aes aes = AesTools.genKey();
        log.info(" aes key : {}", JSON.toJSONString(aes));
        String str = "nihao@ks.pnoker.cn,nihao@ks.pnoker.cn";
        log.info("str : {}", str);
        String ens = AesTools.encrypt(str, aes.getPrivateKey());
        log.info("ens : {}", ens);
        String des = AesTools.decrypt(ens, aes.getPrivateKey());
        log.info("des : {}", des);
    }
    
    @Test
    public void rsaTest() throws Exception {
        Keys.Rsa rsa = RsaTools.genKey();
        log.info(" rsa key : {}", JSON.toJSONString(rsa));
        String str = "nihao@ks.pnoker.cn,nihao@ks.pnoker.cn";
        log.info("str : {}", str);
        String ens = RsaTools.encrypt(str, rsa.getPublicKey());
        log.info("ens : {}", ens);
        String des = RsaTools.decrypt(ens, rsa.getPrivateKey());
        log.info("des : {}", des);
    }
}

Base64工具类
import com.google.common.base.Charsets;

import java.util.Base64;

/**
 * <p>Copyright(c) 2018. Pnoker All Rights Reserved.
 * <p>Author     : Pnoker
 * <p>Email      : pnokers@gmail.com
 * <p>Description: 工具类
 */
public class Tools {
    /**
     * 将字符串进行Base64编码
     *
     * @param str
     * @return 返回字节流
     */
    public static byte[] encode(String str) {
        byte[] bytes = Base64.getEncoder().encode(str.getBytes(Charsets.UTF_8));
        return bytes;
    }

    /**
     * 将字节流进行Base64编码
     *
     * @param bytes
     * @return 返回字符串
     */
    public static String encodeToString(byte[] bytes) {
        String str = Base64.getEncoder().encodeToString(bytes);
        return str;
    }

    /**
     * 必须配合encode使用,用于encode编码之后解码
     *
     * @param str 字符串
     * @return 返回字节流
     */
    public static byte[] decode(String str) {
        byte[] bytes = Base64.getDecoder().decode(str);
        return bytes;
    }

    /**
     * 必须配合encode使用,用于encode编码之后解码
     *
     * @param input 字节流
     * @return 返回字节流
     */
    public static byte[] decode(byte[] input) {
        byte[] bytes = Base64.getDecoder().decode(input);
        return bytes;
    }
}

实体封装类

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * <p>Copyright(c) 2018. Pnoker All Rights Reserved.
 * <p>Author     : Pnoker
 * <p>Email      : pnokers@gmail.com
 * <p>Description: AES & RSA 算法密钥实体类
 */
public class Keys {

    /**
     * RSA 密钥对
     */
    @Data
    @AllArgsConstructor
    public class Rsa {
        private String publicKey;
        private String privateKey;
    }

    /**
     * Aes 密钥
     */
    @Data
    @AllArgsConstructor
    public class Aes {
        private String privateKey;
    }
}

完整例子推荐

IOT应用实例下载 AES/RSA算法


项目推荐



DC3是基于Spring Cloud的开源可分布式物联网(IOT)平台,用于快速开发、部署物联设备接入项目,是一整套物联系统解决方案。

java的rsa加密算法_用java编程实现RSA加密算法 RSA加密算法是目前应用最广泛的公钥加密算法,特别适用于通过Internet传送的数据,常用于数字签名和密钥交换。那么我今天就给大家介绍一下如何利用Java编程来实现RSA加密算法。一、RSA加密算法描述RSA加密算法是1978年提出的。经过多年的分析和研究,在众多的公开密钥加密算法中,RSA加密算法最受推崇,它也被推荐为公开密钥数据加密标准。由数论知识可知,若将一个具有大素数因子的合数进行分解是... 阅读详情

相关推荐

RSA加密算法和签名算法

RSA加密算法和签名算法 一、理论_来源于网上。 RSA加密算法 RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。 。密钥生成算法以安全常数作为输入,输出一个公钥PK,和一个私钥SK。安全常数用于确定这个加密算法的安全性有多高,一般以加密算法使用的质数p的大小有关。越大,质数p一般越大,保证体制有更高的安全性。在R...

shuixiou1的博客 5349

【算法】Java实现RSA算法

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它是目前最广泛使用的公钥加密算法之一。RSA算法是由三位密码学家(Ron Rivest、Adi Shamir、Leonard Adleman)在1977年提出的。RSA算法基于大数因子分解的数学难题,它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。公钥可以公开分享给其他人,而私钥必须保密。选择两个不同的大素数p和q。计算n = p * q,n被称为模数(modulus)。

分享Java硬核干货 1万+

RSA加密算法的简单案例

RSA加密算法是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击。

小小博客爱分享 1万+

Java——RSA加密算法

Java实现RSA加密算法 package RSAtest; import javax.crypto.Cipher; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; /** * @author guochao * @date 2021/11/10 */ public class RSATest { publi

guochaoHNU的博客 1万+

RSA加密算法生成公钥和私钥

Java RSA加密算法生成公钥和私钥import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPubl...

look to the master, follow the master, 5521

使用Java实现RSA加密算法

简介:RSA加密算法是一种基于非对称密钥的加密技术,通过生成一对公私密钥来实现数据的加密和解密。该算法由Rivest、Shamir和Adleman在1977年提出,广泛应用于安全通信和数据保护。Java平台的Java Cryptography Extension (JCE)提供了实现RSA的工具和方法。本实现包含生成密钥对、加密和解密数据以及密钥存储与加载的详细步骤,并强调了安全存储私钥和选择适当密钥长度的重要性。此外,还指出了在实际应用中可能需要其他安全技术的集成,以及遵守加密法规的必要性。

weixin_33480380的博客 1531

Java实现RSA加密

一、什么是RSA? RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。所以这个算法取自他们三位的姓名首字母。 RSA是目前最具有影响力的公钥加密算法,它的原理基于一个简单的数论事实:将两个大质数相乘十分简单,但是想要对它们的乘积进行分解却异常困难。这里的乘积一般公开作为密钥。只要密钥的长度足够大(一般1024位,也有2048位),基本上不可能从公钥信息推出私钥信息。 RSA使用“密钥对”对数

Andy0214的专栏 1万+

Java实现RSA加密算法示例

SSL(安全套接字层)和TLS(传输层安全性)协议是用于确保数据传输安全的协议。TLS实际上是SSL的后继版本,但通常这两个名称仍然被交替使用。它们提供以下功能:身份验证:保证通信双方是他们声称的那一个。数据加密:保证传输过程中的数据加密,防止数据泄露。数据完整性:确保数据在传输过程中未被篡改。重放攻击防护:防止重放攻击,确保数据是实时生成的。Java加密扩展(JCE)是Java平台的一个重要组成部分,它提供了加密、密钥生成与协商,以及消息摘要等安全服务。

weixin_35414260的博客 1385

RSA 加解密(Java 实现)

RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥,即公钥 + 私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,服务方根据私钥进行解密。

长安明月的博客 3万+

SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析

一、引言 上一篇博客大概介绍了MMC子系统和SDIO相关知识及架构,这一篇博客则大致分析安卓的WLAN架构及上层如何调用WLAN驱动的流程。 虽然我工作的开发环境是安卓系统,但由于我不是专业的安卓应用/框架开发工程师,所以对安卓层的一些代码并不是特别熟悉,只能大致梳理流程,不专业的地方请谅解。 本文部分内容摘抄自网络,若有侵权,请联系删除。 二、安卓WLAN架构 1、应用框架(Application framework) 在应用程序框架级别是应用程序代码,它使用各种android.net..

陈子陌的博客 5088

别再手动量了!用Python+Open3D给BIM模型做‘CT扫描’,自动揪出施工误差(附完整代码)

本文介绍如何利用Python和Open3D技术实现BIM模型的毫米级施工误差自动检测。通过点云预处理、模型配准和偏差分析,系统能自动生成三维差异热力图和验收报告,显著提升施工质量检测效率。特别适合混凝土结构错位和钢结构安装偏差等常见问题的智能分析。

weixin_29284657的博客 243

RSA加密算法原理

目录: 一、什么是RSA加密算法: 二、RSA加密过程: 三、RAS解密过程: 四、生成密钥对: 五、实践: 六、Java进行 RSA 加解密时不得不考虑到的那些事儿: 一、什么是RSA加密算法: RSA加密算法是一种非对称加密算法,所谓非对称,就是指该算法加密和解密使用不同的密钥,即使用加密密钥进行加密、解密密钥进行解密。在RAS算法中,加密密钥(即公开密钥)PK是公开信息,而解...

张维鹏的博客 10万+

保姆级教程:在Ubuntu 22.04上从零安装SUMO并运行第一个交通仿真

本教程详细介绍了在Ubuntu 22.04系统上从零安装SUMO交通仿真软件并运行第一个仿真的完整流程。涵盖环境准备、PPA源安装、核心组件验证、首次仿真案例运行以及进阶配置技巧,特别针对netedit路网编辑器和地图格式转换等实用工具进行重点讲解,帮助用户快速掌握SUMO在交通仿真领域的应用。

weixin_30546189的博客 420

RSA加密算法原理及其Java实现

简单介绍了RSA加密算法的原理及其Java实现:原文过长时,进行了分段加密。 RSA加密算法的基本原理 主要步骤 本文所有的字母都为正整数。 其主要步骤如下: 1、取两个不相等的质数p、q,一般都比较大。例如:p=67,q=79。 2、n=p×q,其中n所对应的二进制长度即为密钥的长度,一般为1024位或2048位。n=67×79=5293,转化为二进制数为1 0100 1010 1101,共13位。 3、计算n的欧拉函数f...

qq_34826261的博客 2411

2021哈工大网安837考研初试经验贴

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

weixin_41797880的博客 6520

昇腾910B多卡环境下hccl-test性能调优实战

本文详细介绍了昇腾910B多卡环境下hccl-test性能调优的实战经验,包括环境搭建、CANN工具链配置、性能测试与高级调优技巧。通过优化缓冲区、PCIe拓扑和中断亲和性设置,显著提升多卡通信效率,为AI训练提供稳定高效的计算支持。

weixin_29216049的博客 826

java的rsa加密_java实现的RSA加密算法详解

本文实例讲述了java实现的RSA加密算法。分享给大家供大家参考,具体如下:一、什么是非对称加密1、加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密2、密钥分为:公钥,私钥公钥:可以对外给任何人的加密和解密的密码,是公开的私钥:通过私钥可以生成公钥,但从公钥被认为无法生成公钥(被推导出的概率小到不考虑)3、当将要加密的内容用公钥加密的时候,只能用私钥来解密当将要加密的内容用私钥加密的时...

weixin_42361666的博客 5553

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 222

Java中实现RSA非对称加密算法对数据进行加密解密

久等了,上篇文章的彩蛋部分来了,数据通信中,安全是至关重要的一环,常见的加密算法有AES对称加密算法,RSA非对称加密算法,本文将详细介绍如何在Java中实现RSA非对称加密算法对数据进行加密解密

牧泽的博客 2605

大模型系列——一文看懂“提示词” vs “提示词工程” vs “上下文工程”

本文区分了AI领域的三个关键概念:提示词(Prompt)、提示词工程(Prompt Engineering)和上下文工程(Context Engineering)。提示词是直接输入给AI模型的指令文本;提示词工程则是系统化设计、测试和优化提示词的过程;而上下文工程是为AI构建动态上下文,提供恰当信息和工具的科学与艺术。文章通过翻译案例展示了提示词工程的迭代过程,并说明上下文工程在AI Agent中的核心作用——动态收集和组织必要信息。最后强调普通人只需掌握提示词编写,开发AI应用才需深入提示词工程,构建智能

2401_84052244的博客 748

Python从0到100(一):初识Python及安装Pycharm

Python从0到100(一):初识Python及安装Pycharm。Python是由荷兰人吉多·范罗苏姆(Guido von Rossum)发明的一种编程语言,是目前世界上最受欢迎和拥有最多用户群体的编程语言。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 8万+

java的rsa加密_Java实现RSA加密算法

RSA是一种非对称加密算法,一般采用公钥加密,私钥解密的形式生成密钥对首先创建KeyPairGenerator类的对象,用于生成公钥和私钥对// 生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");然后初始化密钥对的长度,最低长度512位,并且长度不能低于明文的长度// 初始化密...

weixin_31592801的博客 2037

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java的rsa加密算法_基于Java的RSA加密算法实现

一、RSA算法描述(1)选取长度相等的两个大素数p、q,计算其乘积n=p.q(2)计算n的欧拉数Φ(n)=(p-1).(q-1)(3)随机选择加密密钥e,使得e与(p-1)、(q-1)互素(4)用欧几里得扩展算法计算解密密钥d,满足:ed=1modΦ(n),(e,n)是公钥,d是私钥。(5)加密明文:Ci=mi^e(modn)(6)解密密文:mi=Ci^d(modn)二、RSA实现的Java代码1...

weixin_42349434的博客 1844

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

基于Java的RSA加密算法实现

一、RSA算法描述(1)选取长度相等的两个大素数p、q,计算其乘积n=p.q(2)计算n的欧拉数Φ(n)=(p-1).(q-1)(3)随机选择加密密钥e,使得e与(p-1)、(q-1)互素(4)用欧几里得扩展算法计算解密密钥d,满足:ed=1modΦ(n),(e,n)是公钥,d是私钥。(5)加密明文:Ci=mi^e(modn)(6)解密密文:mi=Ci^d(modn)二、RSA实现的Java代码1...

sinat_41880528的博客 3223

RSA加密算法的java实现

加密解密:公钥加密,私钥解密 加签验签:私钥加密,公钥解密 工具类: package com.chen.test; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import javax.crypto.Cipher; import java.io.ByteArrayOut...

小帅的博客 2115

RSA加密算法java实现

转载自: https://blog.youkuaiyun.com/zyhlwzy/article/details/77948195 RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA是第一个能同时用于加密和数宇签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA加密算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那...

weixin_40224981的博客 411
上一篇: AES加密算法实现 Java版
下一篇: Java读写操作西门子S7系列PLC
pnoker
博客等级 码龄12年 106粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值