RSA加密原理与实战代码解析

发布时间:2026/10/1 10:36:45

RSA加密原理与实战代码解析 一、概述1.RSA算法的核心原理, 实际上就是依赖于那种大整数分解起来特别困难的技术难题, 而且现在各种大家都常用的编程语言, 基本上全都支持把这个RSA给实现出来。2.java6支持RSA算法3.RSA这个算法, 它是可以用来对数据进行加密处理的, 同时呢, 它也是能够用于实现数字签名功能的。4.相对于DES和AES这些对称加密算法来说, RSA算法的运行速度是存在一个差距的, 它的速度要明显慢许多。5.总的原则就是, 公钥负责加密而私钥负责解密, 或者是用私钥进行加密然后用公钥来解密。二、模型分析搭建那叫做 RSA 的算法来生成密钥对, 这过程真的是相当的简便, 在此处咱还是照旧, 就拿甲方和乙方这两个角色互发信号、递送信件的情形当作案例来做比方。1.甲方在本地的环境中去构建密钥对。所谓的密钥对,包括公钥和私钥这两个部分。接着甲方要把这个公钥向乙方进行公布。2.甲方会使用这个私钥去对数据进行加密处理, 完成之后, 再将加密过的数据发送给乙方。3.乙方使用由甲方所提供的公钥, 来对数据进行解密的操作。就是当乙方需要向甲方发送数据, 也就是说, 在乙方向甲方传递信息这种情况下。4.乙方这边先拿着公钥, 把数据进行一通加密操作, 接着才把处理好的数据传送给甲方。5.甲方用私钥进行解密, 对那个数据执行了解密操作。三、这段代码的具体分析内容。package com.ca.test;import java.security.Key;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;import javax.crypto.Cipher;import javax.crypto.interfaces.DHPrivateKey;import javax.crypto.interfaces.DHPublicKey;import org.apache.commons.codec.binary.Base64;/*** 非对称加密算法RSA算法组件* 非对称算法一般是用来传送对称加密算法的密钥来使用的相对于DH算法RSA算法只需要一方构造密钥不需要* 大费周章的构造各自本地的密钥对了。DH算法只能算法非对称算法的底层实现。而RSA算法算法实现起来较为简单* author kongqz* */public class RSACoder {//非对称密钥算法public static final String KEY_ALGORITHMRSA;/*** 密钥长度DH算法的默认密钥长度是1024* 密钥长度必须是64的倍数在512到65536位之间* */private static final int KEY_SIZE512;//公钥private static final String PUBLIC_KEYRSAPublicKey;//私钥private static final String PRIVATE_KEYRSAPrivateKey;/*** 初始化密钥对* return Map 甲方密钥的Map* */public static Map initKey() throws Exception{//实例化密钥生成器KeyPairGenerator keyPairGeneratorKeyPairGenerator.getInstance(KEY_ALGORITHM);//初始化密钥生成器keyPairGenerator.initialize(KEY_SIZE);//生成密钥对KeyPair keyPairkeyPairGenerator.generateKeyPair();//甲方公钥RSAPublicKey publicKey(RSAPublicKey) keyPair.getPublic();//甲方私钥RSAPrivateKey privateKey(RSAPrivateKey) keyPair.getPrivate();//将密钥存储在map中Map keyMapnew HashMap();keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}/*** 私钥加密* param data待加密数据* param key 密钥* return byte[] 加密数据* */public static byte[] encryptByPrivateKey(byte[] data,byte[] key) throws Exception{//取得私钥PKCS8EncodedKeySpec pkcs8KeySpecnew PKCS8EncodedKeySpec(key);KeyFactory keyFactoryKeyFactory.getInstance(KEY_ALGORITHM);//生成私钥PrivateKey privateKeykeyFactory.generatePrivate(pkcs8KeySpec);//数据加密Cipher cipherCipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 公钥加密* param data待加密数据* param key 密钥* return byte[] 加密数据* */public static byte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception{//实例化密钥工厂KeyFactory keyFactoryKeyFactory.getInstance(KEY_ALGORITHM);//初始化公钥//密钥材料转换X509EncodedKeySpec x509KeySpecnew X509EncodedKeySpec(key);//产生公钥PublicKey pubKeykeyFactory.generatePublic(x509KeySpec);//数据加密Cipher cipherCipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, pubKey);return cipher.doFinal(data);}/*** 私钥解密* param data 待解密数据* param key 密钥* return byte[] 解密数据* */public static byte[] decryptByPrivateKey(byte[] data,byte[] key) throws Exception{//取得私钥PKCS8EncodedKeySpec pkcs8KeySpecnew PKCS8EncodedKeySpec(key);KeyFactory keyFactoryKeyFactory.getInstance(KEY_ALGORITHM);//生成私钥PrivateKey privateKeykeyFactory.generatePrivate(pkcs8KeySpec);//数据解密Cipher cipherCipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 公钥解密* param data 待解密数据* param key 密钥* return byte[] 解密数据* */public static byte[] decryptByPublicKey(byte[] data,byte[] key) throws Exception{//实例化密钥工厂KeyFactory keyFactoryKeyFactory.getInstance(KEY_ALGORITHM);//初始化公钥//密钥材料转换X509EncodedKeySpec x509KeySpecnew X509EncodedKeySpec(key);//产生公钥PublicKey pubKeykeyFactory.generatePublic(x509KeySpec);//数据解密Cipher cipherCipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, pubKey);return cipher.doFinal(data);}/*** 取得私钥* param keyMap 密钥map* return byte[] 私钥* */public static byte[] getPrivateKey(Map keyMap){Key key(Key)keyMap.get(PRIVATE_KEY);return key.getEncoded();}/*** 取得公钥* param keyMap 密钥map* return byte[] 公钥* */public static byte[] getPublicKey(Map keyMap) throws Exception{Key key(Key) keyMap.get(PUBLIC_KEY);return key.getEncoded();}/*** param args* throws Exception*/public static void main(String[] args) throws Exception {//初始化密钥//生成密钥对Map keyMapRSACoder.initKey();//公钥byte[] publicKeyRSACoder.getPublicKey(keyMap);//私钥byte[] privateKeyRSACoder.getPrivateKey(keyMap);System.out.println(公钥/nBase64.encodeBase64String(publicKey));System.out.println(私钥/nBase64.encodeBase64String(privateKey));System.out.println(密钥对构造完毕,甲方将公钥公布给乙方开始进行加密数据的传输);String strRSA密码交换算法;System.out.println(/n甲方向乙方发送加密数据);System.out.println(原文:str);//甲方进行数据的加密byte[] code1RSACoder.encryptByPrivateKey(str.getBytes(), privateKey);System.out.println(加密后的数据Base64.encodeBase64String(code1));System.out.println(乙方使用甲方提供的公钥对数据进行解密);//乙方进行数据的解密byte[] decode1RSACoder.decryptByPublicKey(code1, publicKey);System.out.println(乙方解密后的数据new String(decode1)/n/n);System.out.println(反向进行操作乙方向甲方发送数据/n/n);str乙方向甲方发送数据RSA算法;System.out.println(原文:str);//乙方使用公钥对数据进行加密byte[] code2RSACoder.encryptByPublicKey(str.getBytes(), publicKey);System.out.println(乙方使用公钥对数据进行加密);System.out.println(加密后的数据Base64.encodeBase64String(code2));System.out.println(乙方将数据传送给甲方);System.out.println(甲方使用私钥对数据进行解密);//甲方使用私钥对数据进行解密byte[] decode2RSACoder.decryptByPrivateKey(code2, privateKey);System.out.println(甲方解密后的数据new String(decode2));}}控制台输出公钥MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAM0qceVm4pyBbCBuM4jRxOYsxWkylLXVklyWp3JNs71B6vLVg2Iwh6TwPbpXbGWOI11RMLhe5bwLpdeBqP4f4MCAwEAAQ私钥MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAzSpz55WbinIFsIG4ziNHE5izFaTKUtdWSXJanck2zvUHq8tWDYjCHpPA9uldsZY4jXVEwuF7lvAul14Go/h/gwIDAQABAkByhW3pKSOHZhoy6lYkCqEUGTptrGybTUQG/2QBi12iqzenm7rKlasjdMEr6Q8RX5RpGArzvhvLepAPqPZ5LXjRAiEA7vI8/9HHrZSbHQ4Up7xby7bOULknoRjZy68HRMPRSXUCIQDbzwQfvrYNqLiauTcNsg6ejCJwcxSCLlJupgwBBjyOFwIgVEbWIviPr/ZpGz9bI6o4ykoozKnxg01ri/6o1qUmTP0CIQDBC0XO73oJ8vT2BdZA8/D884vHgHoxfqcswC3otGZ4TwIhANGXz8GHxM0zuOg8pds54S1ARlrkUXFULocVZ2KangFf密钥对构造完毕,甲方将公钥公布给乙方开始进行加密数据的传输甲方向乙方发送加密数据原文:RSA密码交换算法加密后的数据kF3vekz0DpJmLzwdrWjfZLyGBWsKzFOwm8im85KZr6QA49csvCl9KgsfjSVLuXwgsPrFoEhkiqQ0VApr001A乙方使用甲方提供的公钥对数据进行解密乙方解密后的数据RSA密码交换算法反向进行操作乙方向甲方发送数据原文:乙方向甲方发送数据RSA算法乙方使用公钥对数据进行加密加密后的数据xM1MB3DlDKRwSozf9z8YQlftrWpKT8lkabi17cN/ZLOEkOO8jVLKVAjpjsMwtJMcpHTjntdkHKOms1V8xbh3og乙方将数据传送给甲方甲方使用私钥对数据进行解密甲方解密后的数据乙方向甲方发送数据RSA算法四、总结1.RSA算法和DH算法是不一样的, 它并不需要两把钥匙, 只需要一套密钥就可以完成加密和解密的任务。2.我们可以看到, 在代码里面能够显示出公钥的长度是非常明显地小于私钥的长度的。3.在操作的过程中, 我们必须要严格遵照公钥负责加密而私钥负责解密, 同时私钥也能够进行加密并利用公钥来完成解密的这一套基本原则来进行。4.对于公钥和私钥这两个东西而言, 其本质属性一定是存在着完全不一样的差异的。
延伸阅读

更多相关文章

2026/10/1 10:36:45

详解类型、变量与对象

1.什么是类型*编程语言和数据类型的关系:如果编程语言受到数据类型的约束,则是强类型语言,例如C#不能将long类型的数值赋给int类型变量;否则是弱类型语言;*C#是强类型语言,不允许将比较长的数据放入小的变量…

2026/10/1 10:31:45

关键字新闻爬虫实战:百度与今日头条数据采集入库全方案

简介:这是一份基于 Java 实现的新闻爬虫项目,覆盖百度新闻与今日头条两个信源,支持按关键字批量抓取新闻并写入数据库,适合需要采集新闻数据的 Java 开发者、数据分析人员或爬虫初学者参考。压缩包共 20 个文件,包含 1…

2026/10/1 11:31:48

Python校园外卖点餐系统:毕设选题与开发全流程解析

每年到毕业设计选题季,就有不少学弟学妹来问我:“学长,Python 的课设/毕设题目怎么选?想做个网站类的但又不想完全照搬网上的管理系统,有没有什么推荐?”说实话,校园外卖点餐系统这个题目我见过…

2026/10/1 11:31:48

字节码与机器码的区别:从JVM跨平台到JIT运行时转换

字节码和机器码到底有什么不一样?这个问题我几乎每隔一段时间就会遇到一次,尤其是新同事第一次用javap反汇编.class文件、或者第一次用objdump查看一个可执行文件的时候。我的第一句回答通常很短:机器码是 CPU 直接执行的二进制指令&#xff…

2026/10/1 11:31:48

Spring Boot+SSM兼职平台系统实战:数据库设计到核心功能落地

1. 项目概述接到这个标题的时候,我第一反应是:这不就是Java Web学习路线里的“集大成者”吗。Spring Boot SSM MySQL Maven Thymeleaf Ajax,这一套组合下来,几乎把Java后端开发从入门到实战的核心技能点全部覆盖了。说实话&a…

2026/10/1 11:31:48

窗口文本只读到半截?GetText 3000 字上限踩坑实录

做 Windows 桌面自动化,读聊天窗口里的会话内容是个常见需求:程序定时轮询窗口文本,判断买家有没有发来新消息,再决定要不要处理。这套流程稳定跑了很久,直到某天我们注意到,程序在长会话里开始"装死&…

2026/10/1 11:26:47

MVDR波束形成原理与实战避坑指南

简介:本资源是一份面向信号处理初学者与通信/声学方向研究生的波束形成算法实践代码包,聚焦MVDR(最小方差无失真响应)与常规波束形成的原理对比与MATLAB实现。资源通过两份核心脚本完整呈现两种算法的关键流程:MVDR.m实…

2026/10/1 5:21:14

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑