RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA算法晚于DH算法,这五个字母全都是人名首字母.DH算法是第一个非对称密码体系.

RSA算法运算速度慢,不适宜加密大量数据.一种解决方案是,将RSA跟对称加密方式混合使用,将数据使用对称加密方式加密,对称加密的密钥使用RSA算法加密,因为密钥很短,所以时间费不了太多.实际上,对称加密方式唯一的弊端就是密钥不好传递,对称加密方式也很难破解.

RSA的适用情景一:

(1)服务器生成一个公钥和一个私钥,把公钥公开了.

(2)客户端使用公钥把数据进行加密,上交服务器.别人是没法理解加密后的数据的.

(3)服务器使用私钥将数据解密,查看用户提交的数据.

这种情景下,公钥像是一个信箱,每个人都可以往这个信箱里面放信,但是这个信箱里面的信只有掌握信箱钥匙的人才能开箱查看.

RSA适用情景二:

(1)皇上生成一个公钥和一个密钥,把公钥公开了.

(2)皇上发布了一封诏书,昭告天下.诏书右下角有两串数字,第一串数字是一个随机串,第二串数字是用私钥加密第一串数字所得的结果.

(3)有人不相信这诏书是皇上写的,就把第二串数字使用公钥解密,解密之后发现跟第一串数字一样,说明确实是皇上写的,因为一般人没有密钥,也就没法加密那些能够用公钥解密的数据.

这种情境下,公钥用于解密,私钥用于加密,这可以用于发布公告时,证明这个公告确实是某个人发的.相当于签名.

实际上,签名没有必要特别长,一般情况下,签名是定长的,要想定长,可以使用MessageDigest算法,如MD5和SHA系列.所以就有了多种签名算法,如MD5withRSA等.

下面给出java库中RSA的用法,这个程序包括六部分:公钥加密解密,私钥加密解密,私钥签名公钥验证.

public class RSA {/*** 定义加密方式*/private final static String KEY_RSA = "RSA";/*** 定义签名算法*/private final static String KEY_RSA_SIGNATURE = "MD5withRSA";static PrivateKey toPrivateKey(byte[] b)throws NoSuchAlgorithmException, InvalidKeySpecException {// 构造PKCS8EncodedKeySpec对象PKCS8EncodedKeySpec pkcs = new PKCS8EncodedKeySpec(b);// 指定的加密算法KeyFactory factory = KeyFactory.getInstance(KEY_RSA);// 取私钥对象return factory.generatePrivate(pkcs);}static PublicKey toPublicKey(byte[] b) throws Exception {X509EncodedKeySpec keySpec = new X509EncodedKeySpec(b);KeyFactory factory = KeyFactory.getInstance(KEY_RSA);return factory.generatePublic(keySpec);}// 用私钥对data签名public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);signature.initSign(toPrivateKey(privateKey));signature.update(data);return signature.sign();}// 公钥解密数据public static boolean verify(byte[] data, byte[] publicKey, byte[] sign)throws Exception {Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);signature.initVerify(toPublicKey(publicKey));signature.update(data);return signature.verify(sign);}public static byte[] decryptByPrivateKey(byte[] data, byte[] key)throws Exception {Cipher cipher = Cipher.getInstance(KEY_RSA);cipher.init(Cipher.DECRYPT_MODE, toPrivateKey(key));return cipher.doFinal(data);}public static byte[] decryptByPublicKey(byte[] data, byte[] key)throws Exception {Cipher cipher = Cipher.getInstance(KEY_RSA);cipher.init(Cipher.DECRYPT_MODE, toPublicKey(key));return cipher.doFinal(data);}public static byte[] encryptByPublicKey(byte[] data, byte[] key)throws Exception {Cipher cipher = Cipher.getInstance(KEY_RSA);cipher.init(Cipher.ENCRYPT_MODE, toPublicKey(key));return cipher.doFinal(data);}public static byte[] encryptByPrivateKey(byte[] data, byte[] key)throws Exception {Cipher cipher = Cipher.getInstance(KEY_RSA);cipher.init(Cipher.ENCRYPT_MODE, toPrivateKey(key));return cipher.doFinal(data);}static String tos(byte[] b) {String ans = "";for (int i = 0; i < b.length; i++) {ans += String.format("%02X", b[i]);}return ans;}public static void main(String[] args) throws Exception {KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_RSA);// generator.initialize(1024);//默认为1024KeyPair keyPair = generator.generateKeyPair();RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();System.out.println("公钥:" + tos(publicKey.getEncoded()));System.out.println("私钥:" + tos(privateKey.getEncoded()));byte[] data = "你好,世界!".getBytes();System.out.println("公钥加密-------私钥解密");byte[] enc = encryptByPublicKey(data, publicKey.getEncoded());byte[] dec = decryptByPrivateKey(enc, privateKey.getEncoded());System.out.println("加密前:" + tos(data));System.out.println("解密后:" + tos(dec));System.out.println("私钥加密--------公钥解密");enc = encryptByPrivateKey(data, privateKey.getEncoded());dec = decryptByPublicKey(enc, publicKey.getEncoded());System.out.println("加密前:" + tos(data));System.out.println("解密后:" + tos(dec));System.out.println("私钥签名--------公钥验证签名");byte[] sign = sign(data, privateKey.getEncoded());boolean status = verify(data, publicKey.getEncoded(), sign);System.out.println("签名:" + tos(sign));System.out.println("状态:" + status);}
}

转载于:https://www.cnblogs.com/weiyinfu/p/5923475.html

非对称加密算法RSA相关推荐

  1. 非对称加密算法RSA公钥私钥的模数和指数提取方法

    生成非对称加密算法RSA公钥.私钥的方法: 1. 通过OpenSSL库生成,可参考  https://github.com/fengbingchun/OpenSSL_Test/blob/master/ ...

  2. python实现非对称加密算法_Python3非对称加密算法RSA实例详解

    本文实例讲述了Python3非对称加密算法RSA.分享给大家供大家参考,具体如下: python3 可以使用 Crypto.PublicKey.RSA 和 rsa 生成公钥.私钥. 其中 python ...

  3. 网络安全_密码学实验_非对称加密算法RSA

    网络安全_密码学实验_非对称加密算法RSA 一.实验环境 二.非对称加密RSA 1.理解RSA算法原理 2.加密过程 解密过程 一.实验环境 PyCharm 2019.2.4 (Professiona ...

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

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

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

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

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

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

  7. 非对称加密算法-RSA

    2019独角兽企业重金招聘Python工程师标准>>> 1.概述 RSA有两个密钥,一个是公开的,称为公开密钥:一个是私密的,称为私密密钥. 特点: 公开密钥是对大众公开的,私密密钥 ...

  8. 在非对称加密算法RSA中,假设“大”素数p=5,q=11,试给出计算过程。

    文章目录 1. 题目在非对称加密算法RSA中,假设"大"素数p=5,q=11,试给出计算过程. 2. 分析步骤 3. 抄作业简单粗暴看这里 4. 参考 1. 题目在非对称加密算法R ...

  9. 非对称加密算法 --- RSA签名算法

    目录 RSA原理 RSA应用场景 RSA加密场景 RSA签名场景 RSA加解密和签名算法的java实现 RSA原理 通过一定的规则,生成公钥和私钥,公钥和私钥总是成对出现. 公钥可以公开出去,任何人都 ...

  10. 第十二章 非对称加密算法-RSA

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章"高等加密算法--非对称加密算法" 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥 ...

最新文章

  1. 在winform中从外部拖动节点到树形结构(treeview和listview相互拖动)(一)
  2. Git 配置命令设置
  3. word2vec_文本相似度
  4. python界面设置-PYTHON图形化操作界面的编程七__创建菜单
  5. 我是一只IT小小鸟读书笔记3
  6. android分辨率 x y,Android - 确定不同分辨率的位图上的特定位置(X,Y坐标)?
  7. 前端知识点总结——JS高级(持续更新中)
  8. 潜流式湿地计算_人工湿地计算书
  9. python中os模块教程_python os模块功能和方法总结
  10. Bootstrap 可切换的标签导航
  11. android上层应用apk到G-sensor driver的大致流程
  12. intellij IDEA 控制台中文乱码
  13. 【元胞自动机】基于元胞自动机模拟生命游戏含Matlab源码
  14. CSGO中最新骗术!新老玩家须知-CSGO防骗指南
  15. Some file crunching failed, see logs for details解决方案 以及.9patch点9图片的报错的详细修改方法
  16. PaddleX语义分割
  17. 案例效果:实现移动端端轮播图效果
  18. 一刀斩 :“SVN” failed to start 服务启动失败
  19. gcms基峰有什么用_GC-MS与常规GC有什么不同,数据处理应该注意些什么?
  20. oracle clob 类型条件,Oracle中Clob类型如何处理?

热门文章

  1. nodejs中使用node-sass
  2. 20165212任胤第四周课上作业补做
  3. windows下PostgreSQL 安装与配置
  4. 【NOIP模拟赛】超级树 DP
  5. Java业务代理模式~
  6. 大型网站系统架构实践(一)从简单到复杂
  7. 经典算法题每日演练——第二十四题 梳排序
  8. Nuget官方包源问题
  9. 【Java从0到架构师】SpringMVC - 特殊的请求参数
  10. 执行mount挂载命令 报错:mount: you must specify the filesystem type