☰
RSA加密原理与实战代码解析
2026/10/1 10:36:37 网站建设 项目流程

一、概述

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_ALGORITHM="RSA";

/**

* 密钥长度,DH算法的默认密钥长度是1024

* 密钥长度必须是64的倍数,在512到65536位之间

* */

private static final int KEY_SIZE=512;

//公钥

private static final String PUBLIC_KEY="RSAPublicKey";

//私钥

private static final String PRIVATE_KEY="RSAPrivateKey";

/**

* 初始化密钥对

* @return Map 甲方密钥的Map

* */

public static Map initKey() throws Exception{

//实例化密钥生成器

KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(KEY_ALGORITHM);

//初始化密钥生成器

keyPairGenerator.initialize(KEY_SIZE);

//生成密钥对

KeyPair keyPair=keyPairGenerator.generateKeyPair();

//甲方公钥

RSAPublicKey publicKey=(RSAPublicKey) keyPair.getPublic();

//甲方私钥

RSAPrivateKey privateKey=(RSAPrivateKey) keyPair.getPrivate();

//将密钥存储在map中

Map keyMap=new 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 pkcs8KeySpec=new PKCS8EncodedKeySpec(key);

KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

//生成私钥

PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);

//数据加密

Cipher cipher=Cipher.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 keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

//初始化公钥

//密钥材料转换

X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);

//产生公钥

PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);

//数据加密

Cipher cipher=Cipher.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 pkcs8KeySpec=new PKCS8EncodedKeySpec(key);

KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

//生成私钥

PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);

//数据解密

Cipher cipher=Cipher.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 keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

//初始化公钥

//密钥材料转换

X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);

//产生公钥

PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);

//数据解密

Cipher cipher=Cipher.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 keyMap=RSACoder.initKey();

//公钥

byte[] publicKey=RSACoder.getPublicKey(keyMap);

//私钥

byte[] privateKey=RSACoder.getPrivateKey(keyMap);

System.out.println("公钥:/n"+Base64.encodeBase64String(publicKey));

System.out.println("私钥:/n"+Base64.encodeBase64String(privateKey));

System.out.println("================密钥对构造完毕,甲方将公钥公布给乙方,开始进行加密数据的传输=============");

String str="RSA密码交换算法";

System.out.println("/n===========甲方向乙方发送加密数据==============");

System.out.println("原文:"+str);

//甲方进行数据的加密

byte[] code1=RSACoder.encryptByPrivateKey(str.getBytes(), privateKey);

System.out.println("加密后的数据:"+Base64.encodeBase64String(code1));

System.out.println("===========乙方使用甲方提供的公钥对数据进行解密==============");

//乙方进行数据的解密

byte[] decode1=RSACoder.decryptByPublicKey(code1, publicKey);

System.out.println("乙方解密后的数据:"+new String(decode1)+"/n/n");

System.out.println("===========反向进行操作,乙方向甲方发送数据==============/n/n");

str="乙方向甲方发送数据RSA算法";

System.out.println("原文:"+str);

//乙方使用公钥对数据进行加密

byte[] code2=RSACoder.encryptByPublicKey(str.getBytes(), publicKey);

System.out.println("===========乙方使用公钥对数据进行加密==============");

System.out.println("加密后的数据:"+Base64.encodeBase64String(code2));

System.out.println("=============乙方将数据传送给甲方======================");

System.out.println("===========甲方使用私钥对数据进行解密==============");

//甲方使用私钥对数据进行解密

byte[] decode2=RSACoder.decryptByPrivateKey(code2, privateKey);

System.out.println("甲方解密后的数据:"+new String(decode2));

}

}

控制台输出:

公钥:

MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAM0qc+eVm4pyBbCBuM4jRxOYsxWkylLXVklyWp3JNs71

B6vLVg2Iwh6TwPbpXbGWOI11RMLhe5bwLpdeBqP4f4MCAwEAAQ==

私钥:

MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAzSpz55WbinIFsIG4ziNHE5izFaTK

UtdWSXJanck2zvUHq8tWDYjCHpPA9uldsZY4jXVEwuF7lvAul14Go/h/gwIDAQABAkByhW3pKSOH

Zhoy6lYkCqEUGTptrGybTUQG/2QBi12iqzenm7rKlasjdMEr6Q8RX5RpGArzvhvLepAPqPZ5LXjR

AiEA7vI8/9HHrZSbHQ4Up7xby7bOULknoRjZy68HRMPRSXUCIQDbzwQfvrYNqLiauTcNsg6ejCJw

cxSCLlJupgwBBjyOFwIgVEbWIviPr/ZpGz9bI6o4ykoozKnxg01ri/6o1qUmTP0CIQDBC0XO73oJ

8vT2BdZA8/D884vHgHoxfqcswC3otGZ4TwIhANGXz8GHxM0zuOg8pds54S1ARlrkUXFULocVZ2Ka

ngFf

================密钥对构造完毕,甲方将公钥公布给乙方,开始进行加密数据的传输=============

===========甲方向乙方发送加密数据==============

原文:RSA密码交换算法

加密后的数据:kF3vekz0DpJmLzwdrWjfZLyGBWsKzFOwm+8im85KZr6QA49csvCl9KgsfjSVLuXwgsPrFoEhkiqQ

0+VApr001A==

===========乙方使用甲方提供的公钥对数据进行解密==============

乙方解密后的数据:RSA密码交换算法

===========反向进行操作,乙方向甲方发送数据==============

原文:乙方向甲方发送数据RSA算法

===========乙方使用公钥对数据进行加密==============

加密后的数据:xM1MB3DlDKRwSozf9z8YQlftrWpKT8lkabi17cN/ZLOEkOO8jVLKVAjpjsMwtJMcpHTjntdkHKOm

s1V8xbh3og==

=============乙方将数据传送给甲方======================

===========甲方使用私钥对数据进行解密==============

甲方解密后的数据:乙方向甲方发送数据RSA算法

四、总结

1.RSA算法和DH算法是不一样的, 它并不需要两把钥匙, 只需要一套密钥就可以完成加密和解密的任务。

2.我们可以看到, 在代码里面能够显示出公钥的长度是非常明显地小于私钥的长度的。

3.在操作的过程中, 我们必须要严格遵照公钥负责加密而私钥负责解密, 同时私钥也能够进行加密并利用公钥来完成解密的这一套基本原则来进行。

4.对于公钥和私钥这两个东西而言, 其本质属性一定是存在着完全不一样的差异的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询