RSA是一种非对称加密算法,使用RSA前先生成一对公钥和私钥。

使用公钥加密的数据可以用私钥解密,同样私钥加密的数据也可以用公钥解密,

不同之处在于,私钥加密数据的同时还可以生成一组签名,签名是用来验证数据是否在传输过程中有变动的,使用公钥、签名、以及公钥加密后的数据,就可以验证是否有变动,当然也可以不验证。

代码示例如下,两个main方法:main和main1。加密解密都是针对byte数组的,考虑到我们实际使用的时候大部分场景应该是用字符串来传递数据,所以演示代码中频繁的将byte数组转化为字符串,有些byte数组不是从字符串直接转化来的,直接通过new String的方式转字符串会出现乱码,所以用到了Base64来解决这一问题。

另外,演示代码为了方便看到全过程,基本上没有抽出方法,实际使用的时候建议重构一下。

说明就到此为止,代码如下:

  1 package testEncrypt;
  2
  3 import java.security.Key;
  4 import java.security.KeyFactory;
  5 import java.security.KeyPair;
  6 import java.security.KeyPairGenerator;
  7 import java.security.NoSuchAlgorithmException;
  8 import java.security.PrivateKey;
  9 import java.security.PublicKey;
 10 import java.security.Signature;
 11 import java.security.interfaces.RSAPrivateKey;
 12 import java.security.interfaces.RSAPublicKey;
 13 import java.security.spec.InvalidKeySpecException;
 14 import java.security.spec.PKCS8EncodedKeySpec;
 15 import java.security.spec.X509EncodedKeySpec;
 16 import java.util.HashMap;
 17 import java.util.Map;
 18
 19 import javax.crypto.Cipher;
 20
 21 import org.apache.commons.codec.binary.Base64;
 22
 23 /**
 24  *
 25  * @ClassName: TestRsaEncrypt
 26  * @Description: TODO
 27  * @author: liuyx
 28  * @date: 2016年4月28日上午10:20:59
 29  */
 30 public class TestRsaEncrypt {
 31     public static final String KEY_ALGORITHM = "RSA";
 32     private static final String PUBLIC_KEY = "RSAPublicKey";
 33     private static final String PRIVATE_KEY = "RSAPrivateKey";
 34     public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
 35     private static KeyFactory keyFactory = null;
 36     static {
 37         try {
 38             keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
 39         } catch (NoSuchAlgorithmException e) {
 40             // TODO Auto-generated catch block
 41             e.printStackTrace();
 42         }
 43     }
 44     //公钥加密 私钥解密
 45     public static void main(String[] args) throws Exception {
 46         //生成密钥对
 47
 48         KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
 49         keyPairGen.initialize(512);
 50
 51         KeyPair keyPair = keyPairGen.generateKeyPair();
 52
 53         // 公钥
 54         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
 55
 56         // 私钥
 57         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
 58
 59         Map<String, Object> keyMap = new HashMap<String, Object>(2);
 60
 61         keyMap.put(PUBLIC_KEY, publicKey);
 62         keyMap.put(PRIVATE_KEY, privateKey);
 63
 64         String publicKeyStr = getBase64KeyEncodeStrFromKey(publicKey);
 65         String privateKeyStr = getBase64KeyEncodeStrFromKey(privateKey);
 66         System.out.println("公钥:"+publicKeyStr);
 67         System.out.println("私钥:"+privateKeyStr);
 68
 69         //数据加密过程演示
 70         System.out.println("公钥加密——私钥解密");
 71
 72         //要加密的数据
 73         String dataStr = "abcdefghhhhhhhopqrst";
 74         System.out.println("要加密的数据:"+dataStr);
 75         byte[] data = dataStr.getBytes();
 76
 77
 78         // 对公钥解密
 79         Key decodePublicKey = getPublicKeyFromBase64KeyEncodeStr(publicKeyStr);
 80
 81         // 对数据加密
 82         Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
 83         cipher.init(Cipher.ENCRYPT_MODE, decodePublicKey);
 84         byte[] encodedData = cipher.doFinal(data);
 85         String encodedDataStr = Base64.encodeBase64String(encodedData);
 86         System.out.println("公钥加密后的数据:"+encodedDataStr);
 87
 88         //对私钥解密
 89         Key decodePrivateKey = getPrivateKeyFromBase64KeyEncodeStr(privateKeyStr);
 90         cipher.init(Cipher.DECRYPT_MODE, decodePrivateKey);
 91         encodedData = Base64.decodeBase64(encodedDataStr);
 92         byte[] decodedData = cipher.doFinal(encodedData);
 93         String decodedDataStr = new String(decodedData);
 94         System.out.println("私钥解密后的数据:"+decodedDataStr);
 95     }
 96
 97     //私钥加密 公钥解密,附带签名验证过程
 98     public static void main1(String[] args) throws Exception {
 99         //生成密钥对
100
101         KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
102         keyPairGen.initialize(512);
103
104         KeyPair keyPair = keyPairGen.generateKeyPair();
105
106         // 公钥
107         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
108
109         // 私钥
110         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
111
112         Map<String, Object> keyMap = new HashMap<String, Object>(2);
113
114         keyMap.put(PUBLIC_KEY, publicKey);
115         keyMap.put(PRIVATE_KEY, privateKey);
116
117         String publicKeyStr = getBase64KeyEncodeStrFromKey(publicKey);
118         String privateKeyStr = getBase64KeyEncodeStrFromKey(privateKey);
119         System.out.println("公钥:"+publicKeyStr);
120         System.out.println("私钥:"+privateKeyStr);
121
122         //数据加密过程演示
123         System.out.println("私钥加密——公钥解密");
124
125         //要加密的数据
126         String dataStr = "abcdefghhhhhhhopqrst1";
127         System.out.println("要加密的数据:"+dataStr);
128         byte[] data = dataStr.getBytes();
129
130         //对私钥解密
131         Key decodePrivateKey = getPrivateKeyFromBase64KeyEncodeStr(privateKeyStr);
132         //对公钥解密
133         Key decodePublicKey = getPublicKeyFromBase64KeyEncodeStr(publicKeyStr);
134
135         // 对数据加密
136         Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
137         cipher.init(Cipher.ENCRYPT_MODE, decodePrivateKey);
138         byte[] encodedData = cipher.doFinal(data);
139
140         //插曲,加密后的数据+私钥,生成签名,验证签名
141         Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
142         signature.initSign((PrivateKey)decodePrivateKey);  //用的是私钥
143         signature.update(encodedData);  //用的是加密后的数据字节数组
144
145         //取得签名
146         String sign = Base64.encodeBase64String((signature.sign()));
147
148         //初始化验证签名
149         signature = Signature.getInstance(SIGNATURE_ALGORITHM);
150         signature.initVerify((PublicKey )decodePublicKey);  //用的是公钥
151         signature.update(encodedData);  //用的是加密后的数据字节数组
152
153         //实际的验证过程,获取验证结果
154         boolean ret = signature.verify(Base64.decodeBase64(sign));
155         System.out.println("验证结果:"+ret);
156         //插曲结束
157
158
159         String encodedDataStr = Base64.encodeBase64String(encodedData);
160         System.out.println("私钥加密后的数据:"+encodedDataStr);
161
162
163
164         cipher.init(Cipher.DECRYPT_MODE, decodePublicKey);
165         encodedData = Base64.decodeBase64(encodedDataStr);
166         byte[] decodedData = cipher.doFinal(encodedData);
167         String decodedDataStr = new String(decodedData);
168         System.out.println("公钥解密后的数据:"+decodedDataStr);
169
170     }
171
172     /*
173      * 获取key的base64加密后的字符串
174      */
175     private static String getBase64KeyEncodeStrFromKey(Key key) {
176         return Base64.encodeBase64String(key.getEncoded());
177     }
178
179     /*
180      * 获取base64加密后的字符串的原始公钥
181      */
182     private static Key getPublicKeyFromBase64KeyEncodeStr(String keyStr) {
183         byte[] keyBytes = Base64.decodeBase64(keyStr);
184         X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
185         Key publicKey = null;
186         try {
187             publicKey = keyFactory.generatePublic(x509KeySpec);
188         } catch (Exception e) {
189             // TODO Auto-generated catch block
190             e.printStackTrace();
191         }
192         return publicKey;
193     }
194
195     private static Key getPrivateKeyFromBase64KeyEncodeStr(String keyStr) {
196         byte[] keyBytes = Base64.decodeBase64(keyStr);
197         // 取得私钥
198         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
199
200         Key privateKey=null;
201         try {
202             privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
203         } catch (InvalidKeySpecException e) {
204             // TODO Auto-generated catch block
205             e.printStackTrace();
206         }
207         return privateKey;
208     }
209 }

加密算法使用(五):RSA使用全过程相关推荐

  1. 加密算法—MD5、RSA、DES

    最近因为要做一个加密的功能,简单了解了一下加密算法,现在比较常用的有三个加密算法MD5加密算法.RSA加密算法.DES加密算法.       MD5加密算法     定义:MD5算法是将任意长度的&q ...

  2. 密码学专题 非对称加密算法指令概述 RSA

    非对称加密算法也称为公开密钥算法,其解决了对称加密算法密钥需要预分配的难题,使得现代密码学的研究和应用取得了重大发展. 非对称加密算法的基本特点如下: 加密密钥和解密密钥不相同; 密钥对中的一个密钥可 ...

  3. 加密算法(DES,AES,RSA,ECC,MD5,SHA1)简介

    加密算法(DES,AES,RSA,MD5,SHA1)简介 一.对称性加密算法 二.非对称算法 三.散列算法 四.算法举例 1.对称性加密算法有:AES.DES.3DES 1.1.DES(Data En ...

  4. 3个著名加密算法(MD5、RSA、DES)的解析

    MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来.     ...

  5. 浅析加密算法七【RSA密码】

    文章目录 一.简介 二.原理 2.1 加密过程 2.2 计算n的欧拉函数 2.3 逆元计算 2.4 高次幂的计算 2.5 举例 三.优缺点 3.1 优点: 3.2 缺点 四.题外话大质数判定 4.1 ...

  6. 用c语言elgamal共密钥密码加密算法,非对称密钥体制RSA加密原理

    一.非对称密钥加密概述 前面讲述了对称密钥加密体制.使用对称密钥加密体制进行保密通信时,任意不同的两个用户之间都应该使用互不相同的密钥.这样,如果一个网络中有n个用户,他们之间彼此都可能进行秘密通信, ...

  7. 加密算法(DES\RSA\SHA\ELGAMAL)

    DES算法 1.DES算法的介绍 DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法.DES算法具有极高安全性,到目前为止,除了用穷举 ...

  8. python实现非对称加密算法_Python使用rsa模块实现非对称加密与解密

    Python使用rsa模块实现非对称加密与解密 1.简单介绍: RSA加密算法是一种非对称加密算法 是由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制.加密密钥(即公开密钥)PK是公 ...

  9. 加密算法 AES和RSA

    一,加密 (一)加密基础? 通过互联网发送数据,数据可能会被第三者恶意窃听,造成损失.因此需要给重要的数据进行加密,加密后的数据被称为"密文".接收方通过解除加密或得原本的数据,把 ...

最新文章

  1. 动态生成GridView时,加入DataKeyNames属性,回调时出错解决方法
  2. 画验证曲线_数学老师用“函数曲线”绘出美图 学生舍不得擦
  3. Linux Socket TCP/IP通信
  4. ogm session_带有Hibernate OGM的NoSQL –第一部分:持久化您的第一个实体
  5. spss 22 0统计分析从入门到精通_「转需」20+统计分析软件使用工具包,一次全搞定...
  6. java web 不用框架_MyShop-不用框架的基础javaweb项目
  7. 转载:redis备份策略
  8. 关于如何解决特定场景下WPF4.0中“XamlWriter.Save序列化限制”问题的一种思路
  9. Linux 命令(65)—— ld 命令
  10. sap生产工单报工_SAP作业分割与作业价格计算说明
  11. linux文件名变量,文件名通配符、变量以及管道知识点的总结
  12. Python3.9标准库math中的函数汇总介绍(53个函数和5个常数)
  13. 电影暗杀了一只巨可爱的猫[转帖]
  14. 声音信号希尔伯特黄变换
  15. linux kobject-uevent(热插拔事件)
  16. 虚拟机安装Ubuntu22.04 以及个人相关配置记录
  17. 单片机如何烧录程序?单片机的下载方式讲解
  18. 【田姓】宗谱——【名人精粹】
  19. Excel怎么实现分类自动编号
  20. 耗时6个月,从月入3K到14K的,我都经历了什么......

热门文章

  1. 【Oracle】三种方式查看SQL语句的执行计划
  2. zkfc 异常退出问题,报错Received stat error from Zookeeper. code:CONNECTIONLOSS
  3. (JSP)关于手机端(尤其是苹果手机)pdf文件无法打开的解决方案
  4. C++(八)— 死锁原因及解决方法
  5. dubbo接口统一异常处理的两种方式
  6. laravel 跨域解决方案
  7. 虚拟机中PXE-MOF:Exiting intel PXE ROM.Operating system not found解决方法
  8. 如何在Java中将毫秒转换为“ X分钟,x秒”?
  9. Windows linux子系统安装mysql
  10. win11系统如何绕过tpm检测进行安装 Windows11绕过tpm安装的解决方法