文章目录

  • 前言
  • 一、什么是非对称密码体制
  • 二、非对称加密算法家谱
  • 三、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实现非对称加密算法相关推荐

  1. Java实现非对称加密算法-RSA加解密

    RSA是由三位数学家Rivest.Shamir 和 Adleman 发明的非对称加密算法,这种算法非常可靠,秘钥越长,就越难破解. 目前被破解的最长RSA秘钥是768个二进制位,长度超过768位的秘钥 ...

  2. java js 非对称加密算法_Java加密技术(四)——非对称加密算法RSA

    Java非对称加密算法rsa 接下来我们介绍典型的非对称加密算法--RSA RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字 ...

  3. Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

    [最简单的加密] 1.简单的概念 明文:加密前的信息 密文:机密后的信息 算法:加密或解密的算法 密钥:算法使用的钥匙(读作miyao,正确应该是miyue,但是大家都读miyao) 2.简单的例子 ...

  4. python能解密java的_实现Java加密,Python解密的RSA非对称加密算法功能

    摘要 因为最近业务需要使用到openssl的rsa非对称加密算法,研究了下它的使用方式,但是特殊在于前端分IOS和android两端,所以前端部门要求使用java给他们做一个加密工具包,但是因为服务端 ...

  5. 非对称加密算法 - Java加密与安全

    非对称加密算法我们从DH算法中可以看到密钥对是一种非常有用的加密算法 密钥对中publicKey是可以公开的,而privateKey则是需要保密的,由此奠定了非对称加密的基础 非对称加密就是加密和解密 ...

  6. java python rsa加密_实现Java加密,Python解密的RSA非对称加密算法功能

    摘要 因为最近业务需要使用到openssl的rsa非对称加密算法,研究了下它的使用方式,但是特殊在于前端分IOS和android两端,所以前端部门要求使用java给他们做一个加密工具包,但是因为服务端 ...

  7. Java 实现 RSA 非对称加密算法-加解密和签名验签

    1. 非对称加密算法简介 非对称加密算法又称现代加密算法,是计算机通信安全的基石,保证了加密数据不会被破解.与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(pr ...

  8. 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 ...

  9. Java加密技术(四)——非对称加密算法RSA

    转自:http://snowolf.iteye.com/blog/381767 接下来我们介绍典型的非对称加密算法--RSA RSA     这种算法1978年就出现了,它是第一个既能用于数据加密也能 ...

  10. Java进阶(七)Java加密技术之非对称加密算法RSA

    Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...

最新文章

  1. 测一测你的blog魔症有多严重
  2. Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化
  3. 【Python基础】5个Pandas技巧
  4. windows下kafka源码阅读环境搭建
  5. 面向对象开发的五大基本原则
  6. 服务器怎么控制忽略样式_使用JavaScript来编写你的CSS样式代码——JSS
  7. 为什么使用接口编程{转载}
  8. python opencv 利用 GrabCut 算法(opencv已经实现)从图像中分离出前景
  9. 西南科技大学OJ系统 #941: 有序顺序表的合并操作的实现
  10. 魔方怎么更改计算机名,软媒魔方怎么通过设置向导进行设置
  11. linux 以太网 mac,苹果Mac以太网卡的连接速度查看方法
  12. 《写给大家看的设计书》
  13. 服务器光猫一直亮不响应,光猫光信号正常,且光猫和路由器都重启过,还是上不了网咋办?...
  14. webview在android8.0,解决Android8.0系统应用打开webView报错
  15. [Linux] 10. shell编程基础《updating》
  16. 数控车床铣床仿真加工操机视频教程
  17. mac IDEA java 没有javap 安装 The operation couldn’t be completed. Unable to locate a Java Runtime.
  18. java工程师报考费用_java工程师工资一般有多少
  19. 短视频APP相关推荐资源位的高扩展高可用工程实践
  20. 禁用http请求缓存from disk cache

热门文章

  1. C语言数据类型大小分析(基于VC2005编译器)
  2. 字节码指令之同步控制指令
  3. 商城项目数据库表设计中商品表
  4. Redis主从架构和哨兵架构模式
  5. 获取客户端用户真实 IP 地址
  6. memcached命令
  7. 今天同学跟我说刚入门前端,想到我目前实习的公司涨涨经验
  8. Android Eclipse 导入 AS Gradle AAR 库手册
  9. php多克,php对象克隆
  10. 信号与系统研讨(一)匹配滤波器