加密算法使用(五):RSA使用全过程
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使用全过程相关推荐
- 加密算法—MD5、RSA、DES
最近因为要做一个加密的功能,简单了解了一下加密算法,现在比较常用的有三个加密算法MD5加密算法.RSA加密算法.DES加密算法. MD5加密算法 定义:MD5算法是将任意长度的&q ...
- 密码学专题 非对称加密算法指令概述 RSA
非对称加密算法也称为公开密钥算法,其解决了对称加密算法密钥需要预分配的难题,使得现代密码学的研究和应用取得了重大发展. 非对称加密算法的基本特点如下: 加密密钥和解密密钥不相同; 密钥对中的一个密钥可 ...
- 加密算法(DES,AES,RSA,ECC,MD5,SHA1)简介
加密算法(DES,AES,RSA,MD5,SHA1)简介 一.对称性加密算法 二.非对称算法 三.散列算法 四.算法举例 1.对称性加密算法有:AES.DES.3DES 1.1.DES(Data En ...
- 3个著名加密算法(MD5、RSA、DES)的解析
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来. ...
- 浅析加密算法七【RSA密码】
文章目录 一.简介 二.原理 2.1 加密过程 2.2 计算n的欧拉函数 2.3 逆元计算 2.4 高次幂的计算 2.5 举例 三.优缺点 3.1 优点: 3.2 缺点 四.题外话大质数判定 4.1 ...
- 用c语言elgamal共密钥密码加密算法,非对称密钥体制RSA加密原理
一.非对称密钥加密概述 前面讲述了对称密钥加密体制.使用对称密钥加密体制进行保密通信时,任意不同的两个用户之间都应该使用互不相同的密钥.这样,如果一个网络中有n个用户,他们之间彼此都可能进行秘密通信, ...
- 加密算法(DES\RSA\SHA\ELGAMAL)
DES算法 1.DES算法的介绍 DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法.DES算法具有极高安全性,到目前为止,除了用穷举 ...
- python实现非对称加密算法_Python使用rsa模块实现非对称加密与解密
Python使用rsa模块实现非对称加密与解密 1.简单介绍: RSA加密算法是一种非对称加密算法 是由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制.加密密钥(即公开密钥)PK是公 ...
- 加密算法 AES和RSA
一,加密 (一)加密基础? 通过互联网发送数据,数据可能会被第三者恶意窃听,造成损失.因此需要给重要的数据进行加密,加密后的数据被称为"密文".接收方通过解除加密或得原本的数据,把 ...
最新文章
- 动态生成GridView时,加入DataKeyNames属性,回调时出错解决方法
- 画验证曲线_数学老师用“函数曲线”绘出美图 学生舍不得擦
- Linux Socket TCP/IP通信
- ogm session_带有Hibernate OGM的NoSQL –第一部分:持久化您的第一个实体
- spss 22 0统计分析从入门到精通_「转需」20+统计分析软件使用工具包,一次全搞定...
- java web 不用框架_MyShop-不用框架的基础javaweb项目
- 转载:redis备份策略
- 关于如何解决特定场景下WPF4.0中“XamlWriter.Save序列化限制”问题的一种思路
- Linux 命令(65)—— ld 命令
- sap生产工单报工_SAP作业分割与作业价格计算说明
- linux文件名变量,文件名通配符、变量以及管道知识点的总结
- Python3.9标准库math中的函数汇总介绍(53个函数和5个常数)
- 电影暗杀了一只巨可爱的猫[转帖]
- 声音信号希尔伯特黄变换
- linux kobject-uevent(热插拔事件)
- 虚拟机安装Ubuntu22.04 以及个人相关配置记录
- 单片机如何烧录程序?单片机的下载方式讲解
- 【田姓】宗谱——【名人精粹】
- Excel怎么实现分类自动编号
- 耗时6个月,从月入3K到14K的,我都经历了什么......
热门文章
- 【Oracle】三种方式查看SQL语句的执行计划
- zkfc 异常退出问题,报错Received stat error from Zookeeper. code:CONNECTIONLOSS
- (JSP)关于手机端(尤其是苹果手机)pdf文件无法打开的解决方案
- C++(八)— 死锁原因及解决方法
- dubbo接口统一异常处理的两种方式
- laravel 跨域解决方案
- 虚拟机中PXE-MOF:Exiting intel PXE ROM.Operating system not found解决方法
- 如何在Java中将毫秒转换为“ X分钟,x秒”?
- Windows linux子系统安装mysql
- win11系统如何绕过tpm检测进行安装 Windows11绕过tpm安装的解决方法