RSA加密和解密工具类

  1 import org.apache.commons.codec.binary.Base64;
  2
  3 import javax.crypto.Cipher;
  4 import java.security.*;
  5 import java.security.spec.PKCS8EncodedKeySpec;
  6 import java.security.spec.X509EncodedKeySpec;
  7 import java.util.HashMap;
  8 import java.util.Map;
  9
 10 /**
 11  * RSA加密和解密工具
 12  *
 13  * @Author: syj
 14  * @CreateDate: 2018/7/20 16:52
 15  */
 16 public class RSAUtil {
 17
 18     /**
 19      * 数字签名,密钥算法
 20      */
 21     private static final String RSA_KEY_ALGORITHM = "RSA";
 22
 23     /**
 24      * 数字签名签名/验证算法
 25      */
 26     private static final String SIGNATURE_ALGORITHM = "MD5withRSA";
 27
 28     /**
 29      * RSA密钥长度,RSA算法的默认密钥长度是1024密钥长度必须是64的倍数,在512到65536位之间
 30      */
 31     private static final int KEY_SIZE = 1024;
 32
 33     /**
 34      * 生成密钥对
 35      */
 36     private static Map<String, String> initKey() throws Exception {
 37         KeyPairGenerator keygen = KeyPairGenerator.getInstance(RSA_KEY_ALGORITHM);
 38         SecureRandom secrand = new SecureRandom();
 39         /**
 40          * 初始化随机产生器
 41          */
 42         secrand.setSeed("initSeed".getBytes());
 43         /**
 44          * 初始化密钥生成器
 45          */
 46         keygen.initialize(KEY_SIZE, secrand);
 47         KeyPair keys = keygen.genKeyPair();
 48
 49         byte[] pub_key = keys.getPublic().getEncoded();
 50         String publicKeyString = Base64.encodeBase64String(pub_key);
 51
 52         byte[] pri_key = keys.getPrivate().getEncoded();
 53         String privateKeyString = Base64.encodeBase64String(pri_key);
 54
 55         Map<String, String> keyPairMap = new HashMap<>();
 56         keyPairMap.put("publicKeyString", publicKeyString);
 57         keyPairMap.put("privateKeyString", privateKeyString);
 58
 59         return keyPairMap;
 60     }
 61
 62     /**
 63      * 密钥转成字符串
 64      *
 65      * @param key
 66      * @return
 67      */
 68     public static String encodeBase64String(byte[] key) {
 69         return Base64.encodeBase64String(key);
 70     }
 71
 72     /**
 73      * 密钥转成byte[]
 74      *
 75      * @param key
 76      * @return
 77      */
 78     public static byte[] decodeBase64(String key) {
 79         return Base64.decodeBase64(key);
 80     }
 81
 82     /**
 83      * 公钥加密
 84      *
 85      * @param data      加密前的字符串
 86      * @param publicKey 公钥
 87      * @return 加密后的字符串
 88      * @throws Exception
 89      */
 90     public static String encryptByPubKey(String data, String publicKey) throws Exception {
 91         byte[] pubKey = RSAUtil.decodeBase64(publicKey);
 92         byte[] enSign = encryptByPubKey(data.getBytes(), pubKey);
 93         return Base64.encodeBase64String(enSign);
 94     }
 95
 96     /**
 97      * 公钥加密
 98      *
 99      * @param data   待加密数据
100      * @param pubKey 公钥
101      * @return
102      * @throws Exception
103      */
104     public static byte[] encryptByPubKey(byte[] data, byte[] pubKey) throws Exception {
105         X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
106         KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
107         PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
108         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
109         cipher.init(Cipher.ENCRYPT_MODE, publicKey);
110         return cipher.doFinal(data);
111     }
112
113     /**
114      * 私钥加密
115      *
116      * @param data       加密前的字符串
117      * @param privateKey 私钥
118      * @return 加密后的字符串
119      * @throws Exception
120      */
121     public static String encryptByPriKey(String data, String privateKey) throws Exception {
122         byte[] priKey = RSAUtil.decodeBase64(privateKey);
123         byte[] enSign = encryptByPriKey(data.getBytes(), priKey);
124         return Base64.encodeBase64String(enSign);
125     }
126
127     /**
128      * 私钥加密
129      *
130      * @param data   待加密的数据
131      * @param priKey 私钥
132      * @return 加密后的数据
133      * @throws Exception
134      */
135     public static byte[] encryptByPriKey(byte[] data, byte[] priKey) throws Exception {
136         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);
137         KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
138         PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
139         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
140         cipher.init(Cipher.ENCRYPT_MODE, privateKey);
141         return cipher.doFinal(data);
142     }
143
144     /**
145      * 公钥解密
146      *
147      * @param data   待解密的数据
148      * @param pubKey 公钥
149      * @return 解密后的数据
150      * @throws Exception
151      */
152     public static byte[] decryptByPubKey(byte[] data, byte[] pubKey) throws Exception {
153         X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
154         KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
155         PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
156         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
157         cipher.init(Cipher.DECRYPT_MODE, publicKey);
158         return cipher.doFinal(data);
159     }
160
161     /**
162      * 公钥解密
163      *
164      * @param data      解密前的字符串
165      * @param publicKey 公钥
166      * @return 解密后的字符串
167      * @throws Exception
168      */
169     public static String decryptByPubKey(String data, String publicKey) throws Exception {
170         byte[] pubKey = RSAUtil.decodeBase64(publicKey);
171         byte[] design = decryptByPubKey(Base64.decodeBase64(data), pubKey);
172         return new String(design);
173     }
174
175     /**
176      * 私钥解密
177      *
178      * @param data   待解密的数据
179      * @param priKey 私钥
180      * @return
181      * @throws Exception
182      */
183     public static byte[] decryptByPriKey(byte[] data, byte[] priKey) throws Exception {
184         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);
185         KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
186         PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
187         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
188         cipher.init(Cipher.DECRYPT_MODE, privateKey);
189         return cipher.doFinal(data);
190     }
191
192     /**
193      * 私钥解密
194      *
195      * @param data       解密前的字符串
196      * @param privateKey 私钥
197      * @return 解密后的字符串
198      * @throws Exception
199      */
200     public static String decryptByPriKey(String data, String privateKey) throws Exception {
201         byte[] priKey = RSAUtil.decodeBase64(privateKey);
202         byte[] design = decryptByPriKey(Base64.decodeBase64(data), priKey);
203         return new String(design);
204     }
205
206     /**
207      * RSA签名
208      *
209      * @param data   待签名数据
210      * @param priKey 私钥
211      * @return 签名
212      * @throws Exception
213      */
214     public static String sign(byte[] data, byte[] priKey) throws Exception {
215         // 取得私钥
216         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);
217         KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
218         // 生成私钥
219         PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
220         // 实例化Signature
221         Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
222         // 初始化Signature
223         signature.initSign(privateKey);
224         // 更新
225         signature.update(data);
226         return Base64.encodeBase64String(signature.sign());
227     }
228
229     /**
230      * RSA校验数字签名
231      *
232      * @param data   待校验数据
233      * @param sign   数字签名
234      * @param pubKey 公钥
235      * @return boolean 校验成功返回true,失败返回false
236      */
237     public boolean verify(byte[] data, byte[] sign, byte[] pubKey) throws Exception {
238         // 实例化密钥工厂
239         KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
240         // 初始化公钥
241         X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
242         // 产生公钥
243         PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
244         // 实例化Signature
245         Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
246         // 初始化Signature
247         signature.initVerify(publicKey);
248         // 更新
249         signature.update(data);
250         // 验证
251         return signature.verify(sign);
252     }
253
254     public static void main(String[] args) {
255         try {
256             Map<String, String> keyMap = initKey();
257             String publicKeyString = keyMap.get("publicKeyString");
258             String privateKeyString = keyMap.get("privateKeyString");
259             System.out.println("公钥:" + publicKeyString);
260             System.out.println("私钥:" + privateKeyString);
261
262             // 待加密数据
263             String data = "admin123";
264             // 公钥加密
265             String encrypt = RSAUtil.encryptByPubKey(data, publicKeyString);
266             // 私钥解密
267             String decrypt = RSAUtil.decryptByPriKey(encrypt, privateKeyString);
268
269             System.out.println("加密前:" + data);
270             System.out.println("加密后:" + encrypt);
271             System.out.println("解密后:" + decrypt);
272         } catch (Exception e) {
273             e.printStackTrace();
274         }
275     }
276
277 }

原文地址:https://www.cnblogs.com/jun1019/p/9345879.html

时间: 2024-10-24 10:32:32

RSA加密和解密工具类的相关文章

RSA加解密工具类

Java 实现 import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.interfaces.RSAPrivateKey;import java.secur

加密解密工具类(Java,DES)

一个Java版的DES加密工具类,可以用来进行网络数据传输加密,保存密码的时候进行加密. import java.security.Key; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.I

iOS rsa加密与解密

转自 --响铃  IOS rsa加密与解密 ras加密需要两组秘钥,一组公共秘钥,一组私有秘钥. 生成命令: openssl req -x509 -out public_key.der -outform der -new -newkey rsa:2048 -keyout private_key.pem public_key.der为公共秘钥文件,private_key.pem为私有秘钥文件. 生成ios可引用的私有秘钥文件.pfx: 1. OpenSSL rsa -in private_key.

C#实现RSA加密和解密详解

原文:C#实现RSA加密和解密详解 RSA加密解密源码: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography;

通过ios实现RSA加密和解密

在加密和解密中,我们需要了解的知识有什么事openssl:RSA加密算法的基本原理:如何通过openssl生成最后我们需要的der和p12文件. 废话不多说,直接写步骤: 第一步:openssl来生成公钥和私钥证书,最后需要得到公钥证书和私钥证书 . 这是在mac OX系统下显示的证书,如果我们用文本编辑器打开它,会发现里面是----BEGIN RSA 开头  并且----END RSA 结尾的一串字符串. 第二步:我们需要在代码中写我们的加密和机密方法,加密的字符串通过公钥进行加密,加密后的字

AES加密解密工具类封装(AESUtil)

import org.springframework.util.Base64Utils; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.Cipher; import javax.crypto.KeyGenerat

本地加密解密工具类

import java.security.Key; import javax.crypto.Cipher; public class EncryptDecodeUtil { /** * 字符串默认键值 */ private static String strDefaultKey = "national"; /** * 加密工具 */ private Cipher encryptCipher = null; /** * 解密工具 */ private Cipher decryptCiph

自写AES加密解密工具类

此类主要用于加密与解密,采用128位ECB模式,PKCS5Padding填充补位. 可使用方法为加密返回二进制encryptBin(content, key).加密返回十六进制encryptHex(content, key).二进制内容解密decryptBin(content, key).十六进制内容解密decryptHex(content, key). content是需要加密的字符串,key是密钥,随意一个字符串. 1 package com.test; 2 3 import java.io

Maven项目的RSA加密及解密(用户数据)的配置流程:

做过三年多的程序员了,之前同事们都喜欢发表博客文章 而鄙人特例.  一般都是看文章,毕竟有现成的粮食,干嘛还多此一举额,呵呵. 也就没想着注册一下账号  就在前不久注册这个账号了  也是没怎更好的利用起来 : 这不心血来潮 ,突然意识到不发表些博客文章 感觉就不是一个完整的程序员  ,因此就有了以下文章  . 头一次发表  若有人查阅  如有什不足之处,多提意见,  多多见谅... 第一步: 获得RSA公钥私钥(秘钥格式:PKCS#8 测试:建议是无私钥密码的,省一些麻烦) 公钥: -----B