最近的一个项目中,要用到加密的知识。于是上网查了一些资料,翻看了一本很久以前买的书《JAVA加密与解密的艺术》,然后自己琢磨了一下,最后决定用了RSA典型非对称加密算法。下面就自己研究的代码分享一下。
package com.security.rsa; import java.io.FileOutputStream; import java.io.ObjectOutputStream; 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; /** * RSA安全编码组件 * @author Administrator * */ public abstract class RSACoder { //非对称加密密钥算法 public static final String KEY_ALGORITHM="RSA"; //公钥 private static final String PUBLIC_KEY="RSAPublicKey"; //私钥 private static final String PRIVATE_KEY="RSAPrivateKey"; private static FileOutputStream public_file_out = null; private static ObjectOutputStream public_object_out = null; private static FileOutputStream private_file_out = null; private static ObjectOutputStream private_object_out = null; /** * RSA密钥长度 * 默认1024位 * 密钥长度必须是64的倍数 * 范围在512-65536 */ private static final int KEY_SIZE=512; /** * 私钥解密 * @param data 待解密数据 * @param key 私钥 * @param byte[] 解密数据 * @throws Exception * */ 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 公钥 * @param byte[] 解密数据 * @throws Exception */ public static byte[] decryptByPublicKey(byte[] data,byte[] key) throws Exception{ //取得公钥 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); //生成公钥 PublicKey publickey = keyFactory.generatePublic(x509KeySpec); //对数据解密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, publickey); return cipher.doFinal(data); } /** * 公钥加密 */ public static byte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception{ //取得公钥 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PublicKey publickey = keyFactory.generatePublic(x509KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, publickey); return cipher.doFinal(data); } /** * 私钥加密 */ 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); } /** *取得私钥 */ public static byte[] getPrivateKey(Map<String,Object> keyMap) throws Exception{ Key key =(Key) keyMap.get(PRIVATE_KEY); return key.getEncoded(); } /** * 取得公钥 */ public static byte[] getPublicKey(Map<String,Object> keyMap) throws Exception{ Key key =(Key) keyMap.get(PUBLIC_KEY); return key.getEncoded(); } /** * 初始化密钥 */ public static Map<String,Object> initKey() throws Exception{ //实例化密钥对生成器 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); //初始化密钥对生成器 keyPairGen.initialize(KEY_SIZE); //生成密钥对 KeyPair keyPair = keyPairGen.generateKeyPair(); //公钥 RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic(); //私钥 RSAPrivateKey privateKey =(RSAPrivateKey) keyPair.getPrivate(); //封装密钥 Map<String,Object> keyMap = new HashMap<String, Object>(2); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); // //将公钥放到D盘根目录下 // public_file_out = new FileOutputStream("d:/" + "/public_key.cer"); // public_object_out = new ObjectOutputStream(public_file_out); // public_object_out.writeObject(publicKey); // saveKey(publicKey, "publicKey.cer"); // // // //将私钥放到D盘根目录下 // private_file_out = new FileOutputStream("d:/" + "/private_key.key"); // private_object_out = new ObjectOutputStream(private_file_out); // private_object_out.writeObject(publicKey); saveKey(publicKey, "public_key.cer"); saveKey(privateKey, "private_key.key"); return keyMap; } /** * 保存密钥的方法 * @param key * @param keyName * @throws Exception */ public static void saveKey(Key key,String keyName) throws Exception{ FileOutputStream foskey=new FileOutputStream(keyName); ObjectOutputStream oos=new ObjectOutputStream(foskey); oos.writeObject(key); oos.close(); foskey.close(); } }
RSACoder 是基础类。下面是测试类,不过测试类写的比较简单。
package com.security.rsa.test; import java.util.Map; import org.apache.commons.codec.binary.Base64; import org.junit.Before; import org.junit.Test; import com.security.rsa.RSACoder; /** * RSA校验 * @author Administrator * */ public class RSACoderTest { //公钥 private byte[] privateKey; //私钥 private byte[] publicKey; /** * 初始化密钥 */ @Before public void initKey() throws Exception{ Map<String,Object> keyMap = RSACoder.initKey(); publicKey = RSACoder.getPublicKey(keyMap); privateKey = RSACoder.getPrivateKey(keyMap); System.err.println("公钥:\n"+Base64.encodeBase64String(publicKey)); System.err.println("私钥:\n"+Base64.encodeBase64String(privateKey)); } /** * 校验 * */ @Test public void test() throws Exception{ System.err.println("\n-----私钥加密-----公钥解密"); String inputStr1 = "RSA算法加密"; byte[] data1 = inputStr1.getBytes(); System.err.println("原文:\n"+inputStr1); //加密 byte[] encodeData1 = RSACoder.encryptByPrivateKey(data1, privateKey); System.err.println("加密后:\n"+Base64.encodeBase64String(encodeData1)); //解密 byte[] decodeData1 = RSACoder.decryptByPublicKey(encodeData1, publicKey); String outputStr1 = new String(decodeData1); System.err.println("解密后:\n"+outputStr1); } }
写这篇文章记录一下最近的历程。当然加密解密的路远不止这么简单,希望自己接下来能多学习,多成长,共勉!
相关推荐
主要介绍RSA非对称加密算法的由来和应用场景,以及加密原理
.net RSA非对称加密例子
AES对称和RSA非对称加密解密的java实现
C#和Java关于RSA非对称加密互通类,包括提供RSA加密、解密方法,Java到c#的RSA私钥格式转换,Java到c#的RSA公钥格式转换等,使用PKCS1填充算法
RSA非对称加密 通过私钥加密,公钥解密来实现数据的安全交互。公钥私钥存放在单独的文本中,自己替换即可。
RSA非对称加密工具类,用于网络信息传输中
java rsa非对称加密算法3个实例源代码
登录时,用户的密码用明文传输...非对称加密算法常用RSA算法,秘钥使用base64编码成字符串,后端使用jdk8的标准API,前端使用jsencrypt.js进行RSA的对应操作。经过测试,本例中的前后端代码的加密解密计算结果是一致的。
项目中使用过的一个rsa非对称加密类,用着很不错 ,需要注意的是里边的密钥长度最小是128,不能再小了,还有里边用到了base64的编码,我们用的是jdk 1.8自带的工具类,如果要用的童靴的项目是不jdk 1.8的项目也可以...
secruity.js jsencrypt.js RSAjs 三种RSA加解密JS,vue的和正常版本的
RSA非对称 C#解密、js加密实现登陆密文,传输RSA非对称 C#解密、js加密实现登陆密文传输,RSA非对称 C#解密、js加密实现登陆密文传输
本程序实现了一个AES对称加密类和一个RSA非对称加密类,既可单独使用AES或RSA加密数据,也可结合使用,本程序给的示例是结合使用的,即用RSA加密AES的密钥,然后用AES的密钥进行数据加密,是一种更安全的技术.
基于.Net的MVC模拟登录,RSA非对称加密,web前端加密,C#后端解密。
RSA非对称加密解密Delphi源码,亲测XE10.2.3可用!RSA控件,内含密钥对生成,无须DLL!
用JAVA实现Rsa非对称加密算法 不算简单的算法 既可以加密又可以解密
C#-RSA非对称加密公钥加密 这是一个完整的实例,不像一些网站只有局部代码,有的又只有代码,没有库文件等等。真正的拿到COPY下就用
RSA非对称加密算法加密器
基于Python语言、RSA非对称加密的IRC聊天室客户端源码与应用程序 服务器与客户端之间通过IRC协议进行通信,在IRC协议中,用户可以加入到频道Channel中,在频道中发送消息,频道中的所有人都能接收到信息。 但大多数...
RSA非对称加密是基于数字证书的加密体系中的一种加密方式。当发送信息时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有...