非对称加密、数字签名、数字证书的参考文章

1. 什么是非对称加密

(1)公钥和私钥成对出现
(2)公钥加密、私钥解密,私钥加密、公钥解密
(3)公钥一般对外公开,私钥保密
(4)主要用于防止通信数据被篡改,保证数据的完整性,也可对明文来实现保密
对称加密:加密和解密使用同一个密钥
非对称加密:加密、解密使用不同的两把密钥,这两把密钥成对

一般通信开始时通过非对称加密将对称加密的密钥发送给另一方,然后双方通过对称加密来进行沟通

2. 常用的非对称加密算法

常用的非对称加密算法有:RSA、ECC
对比:
(1) RSA签名算法适合于:Verify操作频度高,而Sign操作频度低的应用场景。比如,分布式系统中基于capability的访问控制就是这样的一种场景
(2) ECC签名算法适合于:Sign和Verify操作频度相当的应用场景。比如,点对点的安全信道建立。【移动互联网用的比较多

3. 数字签名(digital signature)

数字签名: 数字签名由数字摘要和非对称加密技术组成
(1)明文数据通过摘要算法得到固定长度的摘要信息
(2)用私钥加密摘要信息即可得到数字签名,将明文数据和签名发送到另一方
(3)另一方用公钥解密签名后得到摘要信息,摘要算法提取明文的摘要信息后与解密的摘要信息进行比对,如果相同则证明明文数据完整,未被篡改

4. 数字证书(digital certificate)

(1)证书认证中心(certificate authority,简称CA
)用私钥加密被认证网站的公钥和其他网站信息(如网址),生成数字证书,网站用公钥加密明文数据后,附带数字证书,发送给访问方【客户端】。
(2)本地客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥。客户端使用CA的公钥解密数字证书后获取到网站的公钥,再用公钥解密数据,获取明文

5. java实现RSA加解密

import org.apache.tomcat.util.codec.binary.Base64;import javax.crypto.Cipher;
import java.nio.charset.StandardCharsets;
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.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;public class RSAEncrypt {//用于封装随机产生的公钥与私钥private static Map<Integer, String> keyMap = new HashMap<Integer, String>();public static void main(String[] args) throws Exception {//生成公钥和私钥genKeyPair();//加密字符串String message = "123456";System.out.println("随机生成的公钥为:" + keyMap.get(0));System.out.println("随机生成的私钥为:" + keyMap.get(1));String messageEn = encrypt(message, keyMap.get(0));System.out.println(message + "\t加密后的字符串为:" + messageEn);String messageDe = decrypt(messageEn, keyMap.get(1));System.out.println("还原后的字符串为:" + messageDe);}/*** 随机生成密钥对** @throws NoSuchAlgorithmException*/public static void genKeyPair() throws NoSuchAlgorithmException {// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");// 初始化密钥对生成器,密钥大小为96-1024位keyPairGen.initialize(1024, new SecureRandom());// 生成一个密钥对,保存在keyPair中KeyPair keyPair = keyPairGen.generateKeyPair();// 得到私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 得到公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//得到公钥字符串String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()), StandardCharsets.UTF_8);// 得到私钥字符串String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())), StandardCharsets.UTF_8);// 将公钥和私钥保存到MapkeyMap.put(0, publicKeyString);  //0表示公钥keyMap.put(1, privateKeyString);  //1表示私钥}/*** RSA公钥加密** @param str       加密字符串* @param publicKey 公钥* @return 密文* @throws Exception 加密过程中的异常信息*/public static String encrypt(String str, String publicKey) throws Exception {//base64编码的公钥byte[] decoded = Base64.decodeBase64(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);return Base64.encodeBase64String(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));}/*** RSA私钥解密** @param str        加密字符串* @param privateKey 私钥* @return 铭文* @throws Exception 解密过程中的异常信息*/public static String decrypt(String str, String privateKey) throws Exception {//64位解码加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes(StandardCharsets.UTF_8));//base64编码的私钥byte[] decoded = Base64.decodeBase64(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);return new String(cipher.doFinal(inputByte));}}

非对称加密(RSA、数字签名、数字证书)相关推荐

  1. 对称加密和非对称加密,数字签名和证书

    目录 如何加密解密? 对称加密(对称密码) 非对称加密(公钥密码) 对称加密 DES 3DES AES 密钥配送问题 如何解决密钥配送问题 非对称加密 公钥.私钥 解决密钥配送问题 RSA 混合密码系 ...

  2. 加密与安全:图解非对称加密算法 RSA 数字签名与数字证书

    RSA 加密过程是公钥加密.私钥解密,而数字签名.数字证书都是私钥签名(可以理解为加密),公钥签名验证(可以理解为解密).公钥和私钥都可以用来加密或解密,只要能保证用 A 加密,就用 B 解密即可,至 ...

  3. 【IoT】加密与安全:图解非对称加密算法 RSA 数字签名与数字证书

    RSA 加密过程是公钥加密.私钥解密,而数字签名.数字证书都是私钥签名(可以理解为加密),公钥签名验证(可以理解为解密).公钥和私钥都可以用来加密或解密,只要能保证用 A 加密,就用 B 解密即可,至 ...

  4. 网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)

    网络知识详解之:HTTPS通信原理剖析(对称.非对称加密.数字签名.数字证书) 计算机网络相关知识体系详解 网络知识详解之:TCP连接原理详解 网络知识详解之:HTTP协议基础 网络知识详解之:HTT ...

  5. 加密基础知识二 非对称加密RSA算法和对称加密

    一.RSA的计算过程 上述过程中,出现了公钥(3233,17)和私钥(3233,2753),这两组数字是怎么找出来的呢?参考RSA算法原理(二) 首字母缩写说明:E是加密(Encryption)D是解 ...

  6. 密码学03--go语言与非对称加密RSA算法的实现

    目录 1.对称加密的弊端 2.非对称加密 2.1 非对称加密使用场景 2.2 区分公私钥 2.3 非对称加密通信流程 2.4 非对称加密与对称加密 3.非对称加密RSA算法 3.1 RSA算法 3.2 ...

  7. 计算机网络实验报告9 加密,数字签名与证书

    实验8 加密.数字签名与证书 1. 实验目的 了解对称加密.非对称加密体制概念 了解散列函数.数字签名和数字证书的概念和理论 掌握基于Openssl的对称加密.密钥对的创建和应用 掌握基于Openss ...

  8. IOS 逆向开发(一)密码学 非对称加密RSA

    IOS 逆向开发(一)密码学 RSA 1. 密码学发展简介 2. 非对称加密RSA产生过程 3. RSA 数学原理 3.1 离散对数问题 3.1.1 原根 3.2 欧拉函数Φ 3.3 欧拉定理 3.4 ...

  9. 【工具编写】python实现非对称加密RSA算法

    python实现非对称加密RSA算法 0x01 RSA算法介绍 RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rives ...

最新文章

  1. ThreadLocalRandom 安全吗
  2. 在NodeJS中操作文件常见的API
  3. JS导出 excel
  4. SELinux 引起的 Docker 启动失败
  5. 嵌入式Linux系统编程学习之十六用程序发送信号
  6. mysql查询和缓存原理
  7. idea安装lua插件_IntelliJ EmmyLua 1.1.9发布,IDEA的Lua插件
  8. PIL与opencv相互转换
  9. scrapy -selector
  10. 2022年信息系统管理工程师考试大纲
  11. 阿宁的linux学习---vi/vim
  12. 图片裁切批处理_图片批量处理 如何批量将图片裁剪成一样的大小?按照一定的比例快速裁剪多张照片...
  13. springboot发送qq邮件详细步骤
  14. Mac键盘实现Home End Page UP Page DOWN这几个键
  15. 最全的英语收藏夹(精品)
  16. esp8266 deauther
  17. 详解:化工厂人员定位方案与双重预防机制建设
  18. 【iOS】—— KVC与KVO
  19. 使用python对指定手机号获取各网站登录的验证码。
  20. CT时间与当前时间的大小比较

热门文章

  1. 运行多个mysql service_同时运行多个MySQL服务器的方法
  2. 数据、元数据、数据库、数据仓库、数据中心、数据中台、业务中台 、(垂直数据中心、全域数据中心(公共数据中心)、萃取数据中心)
  3. git(9)Git 内部原理,java入门视频百度网盘
  4. 银行卡编码规则及检验算法详解
  5. 云优化,集大成的可扩展平台是硬道理
  6. Qt编写的项目作品7-视频监控系统
  7. ExtentReports生成自动化测试报告
  8. 七、MySQL 多表查询详解(附练习题及答案----超详细)
  9. day1 计算机基础以及python基础
  10. python爬虫--爬取9某1看剧网电视剧