java实现非对称加密算法
文章目录
- 前言
- 一、什么是非对称密码体制
- 二、非对称加密算法家谱
- 三、java实现RSA加密解密
- 1.通信模型
- 2.实现
- 3.测试
- 总结
前言
常用的RSA算法即为非对称加密算法。本文主要介绍什么是非对称加密以及java如何实现RSA加密与解密
一、什么是非对称密码体制
非对称密码体制的保密通信模型如下图
非对称密码体制有两个密钥,一个为公开的密钥(公钥),一个保密的密钥(私钥)。非对称密码体制的主要优点是可以适应开放性的使用环境,密钥管理问题相对简单,可以方便安全地实现数字签名和验证。RSA是非对称密码体制的典范。
二、非对称加密算法家谱
三、java实现RSA加密解密
1.通信模型
2.实现
sun实现与Bouncy Castle实现细节如下
算法 | 密钥长度 | 密钥长度默认值 | 工作模式 | 填充方式 | 备注 |
---|---|---|---|---|---|
RSA |
512~6553 (必须是64的倍数) |
1024 | ECB |
NoPadding、PKCS1Padding OAEPWITHMD5AndMGF1Padding OAEPWITHSHA1AndMGF1Padding OAEPWITHSHA256AndMGF1Padding等 |
jdk实现 |
RSA | 同上 | 2048 | NONE | 同上 | Bouncy Castle实现 |
public class RSAUtil {private static final String KEY_ALGORITHM = "RSA";private static final String PUBLIC_KEY = "RSAPublicKey";private static final String PRIVATE_KEY = "RSAPrivateKey";private static final int KEY_SIZE = 512;/*** 初始化密钥** @return map* @throws Exception Exception*/public static Map<String, Object> initKey() throws Exception {// 实例化密钥对生成器KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);// 初始化密钥对生成器keyPairGen.initialize(KEY_SIZE);// 生成密钥对KeyPair keyPair = keyPairGen.generateKeyPair();// 公钥RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();// 私钥RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();Map<String, Object> keyMap = new HashMap<>();keyMap.put(PUBLIC_KEY, pubKey);keyMap.put(PRIVATE_KEY, priKey);return keyMap;}/*** 获取私钥** @param keyMap keyMap* @return 私钥*/public static byte[] getPrivateKey(Map<String, Object> keyMap) {return ((Key) keyMap.get(PRIVATE_KEY)).getEncoded();}/*** 获取公钥** @param keyMap keyMap* @return 公钥*/public static byte[] getPublicKey(Map<String, Object> keyMap) {return ((Key) keyMap.get(PUBLIC_KEY)).getEncoded();}/*** 私钥解密** @param data 加密数据* @param key 密钥* @return 明文* @throws Exception Exception*/public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(key);KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);PrivateKey privateKey = factory.generatePrivate(keySpec);Cipher cipher = Cipher.getInstance(factory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 公钥解密** @param data 加密数据* @param key 密钥* @return 明文* @throws Exception Exception*/public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {X509EncodedKeySpec keySpec = new X509EncodedKeySpec(key);KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);PublicKey publicKey = factory.generatePublic(keySpec);Cipher cipher = Cipher.getInstance(factory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** 公钥加密** @param data 明文* @param key 密钥* @return 明文* @throws Exception Exception*/public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {X509EncodedKeySpec keySpec = new X509EncodedKeySpec(key);KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);PublicKey publicKey = factory.generatePublic(keySpec);Cipher cipher = Cipher.getInstance(factory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** 私钥加密** @param data 明文* @param key 密钥* @return 密文* @throws Exception Exception*/public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(key);KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);PrivateKey privateKey = factory.generatePrivate(keySpec);Cipher cipher = Cipher.getInstance(factory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);}
}
3.测试
public class RSACoderTest {private byte[] publicKey;private byte[] privateKey;public static void main(String[] args) throws Exception {RSACoderTest coderTest = new RSACoderTest();coderTest.init();System.out.println("=========私钥加密,公钥解密begin=============");String plainTxt = "helloWorld";byte[] encryptData = RSAUtil.encryptByPrivateKey(plainTxt.getBytes(), coderTest.privateKey);System.out.println("加密后:" + Base64.encodeBase64String(encryptData));byte[] decryptData = RSAUtil.decryptByPublicKey(encryptData, coderTest.publicKey);System.out.println("解密后:" + new String(decryptData));System.out.println("=========私钥加密,公钥解密end=============");System.out.println("=========公钥加密,私钥钥解密begin=============");plainTxt = "worldHello";encryptData = RSAUtil.encryptByPublicKey(plainTxt.getBytes(), coderTest.publicKey);System.out.println("加密后:" + Base64.encodeBase64String(encryptData));decryptData = RSAUtil.decryptByPrivateKey(encryptData, coderTest.privateKey);System.out.println("解密后:" + new String(decryptData));System.out.println("=========公钥加密,私钥钥解密end=============");}private void init() throws Exception {Map<String, Object> keyMap = RSAUtil.initKey();publicKey = RSAUtil.getPublicKey(keyMap);privateKey = RSAUtil.getPrivateKey(keyMap);System.out.println("公钥:" + Base64.encodeBase64String(publicKey));System.out.println("私钥:" + Base64.encodeBase64String(privateKey));}
}
总结
目前,非对称加密算法(主要是RSA算法)主要应用于B2B等多种电子商务平台,但非对称加密算法并不直接对网络数据进行加密解密,而是用于交换对称加密算法的秘密密钥。最终使用对称加密算法进行真正的加密解密。
java实现非对称加密算法相关推荐
- Java实现非对称加密算法-RSA加解密
RSA是由三位数学家Rivest.Shamir 和 Adleman 发明的非对称加密算法,这种算法非常可靠,秘钥越长,就越难破解. 目前被破解的最长RSA秘钥是768个二进制位,长度超过768位的秘钥 ...
- java js 非对称加密算法_Java加密技术(四)——非对称加密算法RSA
Java非对称加密算法rsa 接下来我们介绍典型的非对称加密算法--RSA RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字 ...
- Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA
[最简单的加密] 1.简单的概念 明文:加密前的信息 密文:机密后的信息 算法:加密或解密的算法 密钥:算法使用的钥匙(读作miyao,正确应该是miyue,但是大家都读miyao) 2.简单的例子 ...
- python能解密java的_实现Java加密,Python解密的RSA非对称加密算法功能
摘要 因为最近业务需要使用到openssl的rsa非对称加密算法,研究了下它的使用方式,但是特殊在于前端分IOS和android两端,所以前端部门要求使用java给他们做一个加密工具包,但是因为服务端 ...
- 非对称加密算法 - Java加密与安全
非对称加密算法我们从DH算法中可以看到密钥对是一种非常有用的加密算法 密钥对中publicKey是可以公开的,而privateKey则是需要保密的,由此奠定了非对称加密的基础 非对称加密就是加密和解密 ...
- java python rsa加密_实现Java加密,Python解密的RSA非对称加密算法功能
摘要 因为最近业务需要使用到openssl的rsa非对称加密算法,研究了下它的使用方式,但是特殊在于前端分IOS和android两端,所以前端部门要求使用java给他们做一个加密工具包,但是因为服务端 ...
- Java 实现 RSA 非对称加密算法-加解密和签名验签
1. 非对称加密算法简介 非对称加密算法又称现代加密算法,是计算机通信安全的基石,保证了加密数据不会被破解.与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(pr ...
- JAVA加密解密→术语、密码分类、OSI与TCP/IP安全体系、Base64、消息摘要算法MD/SHA/MAC、对称加密算法DES/AES/PBE、非对称加密算法DH/RSA/EIGamaI
术语 密码分类 OSI与TCP/IP安全体系 JAVA安全 Base64算法 消息摘要算法MD 消息摘要算法MD图解 消息摘要算法SHA 消息摘要算法SHA图解 消息摘要算法MAC 消息摘要算法MAC ...
- Java加密技术(四)——非对称加密算法RSA
转自:http://snowolf.iteye.com/blog/381767 接下来我们介绍典型的非对称加密算法--RSA RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能 ...
- Java进阶(七)Java加密技术之非对称加密算法RSA
Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...
最新文章
- 测一测你的blog魔症有多严重
- Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化
- 【Python基础】5个Pandas技巧
- windows下kafka源码阅读环境搭建
- 面向对象开发的五大基本原则
- 服务器怎么控制忽略样式_使用JavaScript来编写你的CSS样式代码——JSS
- 为什么使用接口编程{转载}
- python opencv 利用 GrabCut 算法(opencv已经实现)从图像中分离出前景
- 西南科技大学OJ系统 #941: 有序顺序表的合并操作的实现
- 魔方怎么更改计算机名,软媒魔方怎么通过设置向导进行设置
- linux 以太网 mac,苹果Mac以太网卡的连接速度查看方法
- 《写给大家看的设计书》
- 服务器光猫一直亮不响应,光猫光信号正常,且光猫和路由器都重启过,还是上不了网咋办?...
- webview在android8.0,解决Android8.0系统应用打开webView报错
- [Linux] 10. shell编程基础《updating》
- 数控车床铣床仿真加工操机视频教程
- mac IDEA java 没有javap 安装 The operation couldn’t be completed. Unable to locate a Java Runtime.
- java工程师报考费用_java工程师工资一般有多少
- 短视频APP相关推荐资源位的高扩展高可用工程实践
- 禁用http请求缓存from disk cache