公钥、私钥介绍

article/2025/11/9 2:40:22

公钥私钥

什么是公钥私钥

1)鲍勃有两把钥匙,一把是公钥,另一把是私钥
img
2)鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
img
3)苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。
img
4)鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
img
5)鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。
img

6)然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。
img

7)鲍勃将这个签名,附在信件下面,一起发给苏珊。
img

8)苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。

img

9)苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
img

10)复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。
img

11)后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。
img

12)鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
img

13)苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。
img

公私钥特征

  1. 公钥和私钥是成对存在的,它们互相解密
  2. 公钥加密,私钥解密
  3. 私钥数字签名,公钥验证

RSA算法

RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

package cn.aizichan.utils.digest;  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;  public class RSACoder {  //非对称密钥算法    public static final String KEY_ALGORITHM="RSA";    /**  * 密钥长度,DH算法的默认密钥长度是1024  * 密钥长度必须是64的倍数,在512到65536位之间  * */    private static final int KEY_SIZE=512;    //公钥    private static final String PUBLIC_KEY="xiaoxiaorenzhe";    //私钥    private static final String PRIVATE_KEY="dadapangzi";    /**  * 初始化密钥对  * @return Map 甲方密钥的Map  * */    public static Map<String,Object> initKey() throws Exception{    //实例化密钥生成器    KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(KEY_ALGORITHM);    //初始化密钥生成器    keyPairGenerator.initialize(KEY_SIZE);    //生成密钥对    KeyPair keyPair=keyPairGenerator.generateKeyPair();   //甲方公钥    RSAPublicKey publicKey=(RSAPublicKey) keyPair.getPublic();    System.out.println("系数:"+publicKey.getModulus()+"  加密指数:"+publicKey.getPublicExponent());  //甲方私钥    RSAPrivateKey privateKey=(RSAPrivateKey) keyPair.getPrivate();   System.out.println("系数:"+privateKey.getModulus()+"解密指数:"+privateKey.getPrivateExponent());  //将密钥存储在map中    Map<String,Object> keyMap=new HashMap<String,Object>();    keyMap.put(PUBLIC_KEY, publicKey);    keyMap.put(PRIVATE_KEY, privateKey);    return keyMap;    }    /**  * 私钥加密  * @param data待加密数据  * @param key 密钥  * @return byte[] 加密数据  * */    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);    }    /**  * 公钥加密  * @param data待加密数据  * @param key 密钥  * @return byte[] 加密数据  * */    public static byte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception{    //实例化密钥工厂    KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);    //初始化公钥    //密钥材料转换    X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);    //产生公钥    PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);    //数据加密    Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());    cipher.init(Cipher.ENCRYPT_MODE, pubKey);    return cipher.doFinal(data);    }    /**  * 私钥解密  * @param data 待解密数据  * @param key 密钥  * @return byte[] 解密数据  * */    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 密钥  * @return byte[] 解密数据  * */    public static byte[] decryptByPublicKey(byte[] data,byte[] key) throws Exception{    //实例化密钥工厂    KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);    //初始化公钥    //密钥材料转换    X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);    //产生公钥    PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);    //数据解密    Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());    cipher.init(Cipher.DECRYPT_MODE, pubKey);    return cipher.doFinal(data);    }    /**  * 取得私钥  * @param keyMap 密钥map  * @return byte[] 私钥  * */    public static byte[] getPrivateKey(Map<String,Object> keyMap){    Key key=(Key)keyMap.get(PRIVATE_KEY);    return key.getEncoded();    }    /**  * 取得公钥  * @param keyMap 密钥map  * @return byte[] 公钥  * */    public static byte[] getPublicKey(Map<String,Object> keyMap) throws Exception{    Key key=(Key) keyMap.get(PUBLIC_KEY);   return key.getEncoded();    }    /**  * @param args  * @throws Exception   */    public static void main(String[] args) throws Exception {    //初始化密钥    //生成密钥对    Map<String,Object> keyMap=RSACoder.initKey();    //公钥    byte[] publicKey=RSACoder.getPublicKey(keyMap);  //byte[] publicKey = b;  //私钥    byte[] privateKey=RSACoder.getPrivateKey(keyMap);    System.out.println("公钥:"+Base64.encode(publicKey));         System.out.println("私钥:"+Base64.encode(privateKey));    System.out.println("================密钥对构造完毕,甲方将公钥公布给乙方,开始进行加密数据的传输=============");    String str="aattaggcctegthththfef/aat.mp4";    System.out.println("===========甲方向乙方发送加密数据==============");    System.out.println("原文:"+str);    //甲方进行数据的加密    byte[] code1=RSACoder.encryptByPublicKey(str.getBytes(), publicKey);  System.out.println("甲方 使用乙方公钥加密后的数据:"+Base64.encode(code1));    System.out.println("===========乙方使用甲方提供的公钥对数据进行解密==============");    //乙方进行数据的解密    //byte[] decode1=RSACoder.decryptByPublicKey(code1, publicKey);    byte[] decode1=RSACoder.decryptByPrivateKey(code1, privateKey);    System.out.println("乙方解密后的数据:"+new String(decode1)+"");    System.out.println("===========反向进行操作,乙方向甲方发送数据==============");    str="乙方向甲方发送数据RSA算法";    System.out.println("原文:"+str);    //乙方使用公钥对数据进行加密    byte[] code2=RSACoder.encryptByPublicKey(str.getBytes(), publicKey);    System.out.println("===========乙方使用公钥对数据进行加密==============");    System.out.println("加密后的数据:"+Base64.encode(code2));    System.out.println("=============乙方将数据传送给甲方======================");    System.out.println("===========甲方使用私钥对数据进行解密==============");    //甲方使用私钥对数据进行解密    byte[] decode2=RSACoder.decryptByPrivateKey(code2, privateKey);    System.out.println("甲方解密后的数据:"+new String(decode2));   }    
}  

http://chatgpt.dhexx.cn/article/iCH8w3wN.shtml

相关文章

公钥和秘钥

公钥与私钥&#xff0c;HTTPS详解 1.公钥与私钥原理1)鲍勃有两把钥匙&#xff0c;一把是公钥&#xff0c;另一把是私钥2)鲍勃把公钥送给他的朋友们—-帕蒂、道格、苏珊—-每人一把。3)苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密&#xff0c;就可以达到保密的效果…

国密(3)- 预主密钥/主密钥计算和Finished消息的加解密

本文给的例子是ECC-SM3-SM4-CBC&#xff1b; GBT-38636-2020&#xff08;传输层密码协议TLCP&#xff09; 定义了pre-master key 和 master key&#xff1b; Pre- master Key 48字节长度&#xff0c;version 2字节&#xff0c;随机数46字节&#xff0c;由客户端产生。采用SM2加…

BitLocker 秘钥如何获取

在装双系统的过程中&#xff0c;遇到一个问题&#xff0c;就是在双系统安装之后&#xff0c;每次切换到windows&#xff08;我的win11&#xff09;的时候&#xff0c;就会出现以下界面&#xff0c;让输入BitLocker秘钥。 首先&#xff0c;我切换到安全模式打开了windows系统&am…

git 配置ssh 秘钥

git支持http和ssh两种Clone方式&#xff1b; PS&#xff1a;Clone即下载源码 如何配置git的ssh key&#xff0c;以便我们可以通过git方式下载源码。 需要经过以下几个步骤 1.配置账户和邮箱&#xff1a; 通过以下命令&#xff0c;查看是否配置账户和邮箱&#xff1a; git …

密钥管理概述

目录 层次化的密钥结构&#xff1a; 密钥的分类&#xff1a; 密钥托管技术&#xff1a; 系统的组成&#xff1a; 密钥协商&#xff1a; 密钥共享&#xff1a; 密钥分配技术&#xff1a; 现代密码体加密和解密算法是可以公开评估的&#xff0c;整个密码系统的安全性并不取决…

公钥和密钥

一、公钥与私钥 在非对称加密中&#xff0c;我们会用到两个密钥&#xff0c;一个是公钥&#xff0c;另一个是私钥。 公钥是给别人的&#xff0c;别人持有的&#xff1b;而私钥是你自己的&#xff0c;只能你持有&#xff0c;别人是不可以持有的。 二、签名验证算法和加密算法 …

如何获取SSH秘钥

从github拉取/上传代码&#xff0c;需要在github添加电脑SSH公钥&#xff0c;如何获取电脑SSH公钥&#xff1a; 1.一般SSH秘钥在目录~/.ssh。没有安装git并生成秘钥是没有这个目录的。 2.安装git&#xff0c;我使用的是git bash软件&#xff0c;git bash官网下载&#xff1a;h…

SSH公钥原理(密钥,秘钥,私钥)(看了还是懵逼啊!)

文章目录 1. 初见SSH2. SSH工作原理1. 基于口令的认证2.基于公钥认证3. SSH实践4 总结3. 为什么需要known_hosts&#xff1f; 1. 初见SSH SSH是一种协议标准&#xff0c;其目的是实现安全远程登录以及其它安全网络服务。 SSH仅仅是一协议标准&#xff0c;其具体的实现有很多&a…

秘钥是什么

密钥&#xff08;secret key&#xff09;是一种参数&#xff0c;它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥。 注&#xff1a;秘钥是一把钥匙。密码算法是锁的内部构造。加密是通过钥匙上锁的过程&#xff0c;解码是通过钥匙开…

JavaScript基础(详细总结)

目录 1、JavaScript简介 1.2、JavaScript的发展史 1.3、JavaScript的功能 1.4、JavaScript的特点 1.5、JavaScript组成 2、JavaScript基础语法 2.1、HTML引入JS 2.1.1、内部引入 2.1.2、外部引入 2.2、JS输出数据的三种方式 2.2.1、浏览器弹窗 2.2.2、输出HTML页面…

JavaScript学习手册(12)

对象&#xff08;Object&#xff09;--------- 基本数据类型的数据都是独立的&#xff0c;不能成为一个整体。 Object属于一种复合的数据类型&#xff0c;在对象中可以保存多个不同数据类型的属性。 对象分类 **内建对象&#xff1a;**由ES标准中定义的对象&#xff0c;在任…

前端之JavaScript

目录 一.初始JavaScript 1.什么是JavaScript 2.JS和HTML以及CSS的关系 3.JS的组成 二.第一份JS代码 几种JS的书写形式 JS的输入输出 三.JS的核心语法 1.变量(几种类型) 1.1 number数字类型 1.2 boolean类型 1.3 string字符串类型 1.4 undefined:未定义的数据类型 1.…

JavaScript基础介绍

一.javaScript是什么 JavaScript&#xff08;简称“JS”&#xff09; 是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。 二.javaScript的作用 1.嵌入动态文本于HTML页面。 2.对浏览器事件做出响应。 3.读写HTML元素。 4.在数据被提交到服务器之前验…

【JavaScript】基本语法大全

前言&#xff1a; 大家好&#xff0c;我是程序猿爱打拳。在学习C和Java这样的后端编程语言后&#xff0c;我们大概率会学习一些关于前端的语言如HTMLJavaScript。又因为前后端基本语法有些许不同&#xff0c;因此我整理出来。今天给大家讲解的是JS中的数据类型、运算符、选择结…

【JavaScript】JavaScript基础篇

目录 &#x1f34a;一. 初识JavaScript &#x1f348;二. JavaScript的书写格式 &#x1f96d;三. JavaScript的基础语法 &#x1f334;1. 变量的用法 &#x1f33e;2. 基本数据类型 &#x1f335;3. 运算符 &#x1f334;4. 条件语句 &#x1f33e;5. 循环语句 &am…

前端基础语言HTML、CSS 和 JavaScript 学习指南

对于任何有兴趣学习前端 Web 开发的人来说&#xff0c;了解 HTML、CSS 和JavaScript 之间的区别至关重要。这三种前端语言都是您访问过的每个网站的用户界面构建块。而且&#xff0c;虽然每种语言都有不同的功能重点&#xff0c;但它们都可以共同创建令人兴奋的交互式网站&…

JavaScript基础入门

一&#xff0c;什么是JavaScript 1&#xff0c;与Java无关&#xff01;与Java无关&#xff01;与Java无关&#xff01; JavaScript是一种为网站添加互动以及自定义行为的客户端脚本语言&#xff0c; 通常只能通过Web浏览器去完成操作&#xff0c; 而无法像普通意义上的程序那样…

javascript小白学习指南2

好啦 好啦 &#xff0c;美女看够了&#xff0c;我们开始继续上一次讲的内容把&#xff08;上一节的内容&#xff09; 控制语句&#xff1a; 首先我先给大家总结一下在javascript中一共有 9 种控制语句它们分别是 if 语句do-while 语句while 语句for 语句for-in 语句label 语句b…

JavaScript学习手册(10)

流程控制语句 条件判断语句&#xff08;if语句&#xff09; 在执行某个语句之前进行判断&#xff0c;条件成立才会执行语句&#xff0c;条件不成立则语句不成立 ​ 语法一&#xff1a;if&#xff08;条件表达式&#xff09; ​ 语句 ​ **语法二&#xff1a;**if&#xff08;条…

十本经典JavaScript书籍

十本经典JavaScript书籍 同步滚动&#xff1a; 一&#xff1a;《JavaScript权威指南&#xff08;第六版&#xff09;》 这本书是程序员学习核心JavaScript语言和由Web浏览器定义的JavaScript API的指南和综合参考手册。第6版涵盖HTML 5和ECMAScript 5。很多章节完全重写&…