只用10分钟,一次性搞懂公钥和私钥

关于什么是公钥和私钥,网上有一篇很经典的文章:http://www.youdzone.com/signature.html

我参考了这篇文章的主要内容,向你介绍下公钥和私钥的工作原理。

公钥和私钥

在这里插入图片描述
Bob有两把钥匙,一把是公钥,另一把是私钥。

在这里插入图片描述

Bob的公钥是公开的,谁都可以拿到,但是私钥只有Bob自己知道,是要绝对保密的。

我们先来看下公钥和私钥的区别:

  • 公钥:公钥是用来加密信息的。当某人想要给你发送一条加密的信息时,他们会使用你的公钥进行加密,这样只有拥有对应私钥的你才能解密并阅读信息。公钥还可以用于验证数字签名。如果有人使用他的私钥对信息进行了签名,并声称这个签名是他创建的,你可以使用他的公钥来验证签名,如果验证成功,那么这个签名确实是用对应的私钥创建的。

  • 私钥:私钥是用来解密信息的。当某人使用你的公钥加密了一条信息并发送给你时,只有你的私钥能够解密这条信息,因为它是唯一的,只有你知道。此外,私钥还可以用来创建数字签名。当你对一份文件或一条信息进行签名时,你实际上是使用私钥对信息的特定表示形式(如信息的哈希值)进行加密,这样接收者就可以使用你的公钥来验证签名的有效性,从而确认信息确实来自于你,并且未被篡改。

简单来说,公钥是用来加密信息和验证数字签名的,而私钥是用来解密接收到的加密信息和创建数字签名的。

加密解密

Susan如果想给Bob发一条加密的该如何做呢?

  • 首先,Susan要先拿到Bob的公钥,因为公钥是公开的,所以Susan和其他任何人都可以轻易拿到;
  • 然后,Susan用Bob的公钥把要发的信息加密,得到一段加密后的密文;
  • 接着,Susan把加密后密文发给Bob;
  • 最后,Bob用自己的私钥解密密文,得到原文。
    在这里插入图片描述

其他人就算获取到了密文也无法破解,因为用Bob的公钥加密的密文只能用Bob的私钥才能解开,而Bob的私钥只有Bob自己才有。

数字签名

不知道你有没有发现一个问题?

Bob收到Susan发给他的信息的时候,如何知道这个信息就是Susan发给他的原信息呢?

会不会有人篡改了原来的信息?

会不会有人冒充Susan发信息?

因为Bob的公钥是公开的,谁都可以用Bob的公钥来加密信息。

也就是说Susan如何证明,这条信息就是她发的呢?

这就需要用到数字签名了。

哈希函数

数字签名的过程通常开始于哈希函数,例如MD5、SHA、RIPEMD-160等。哈希函数的特点是能将任何大小的数据转换成固定长度(比如32位、64位)的字符串,这个字符串被称为哈希值或摘要。哈希函数的一个重要特性是,即使是微小的数据变化也会导致生成一个完全不同的哈希值。

即使只改动了一个字符,哈希函数生成的摘要也会有很大的不同。

数字签名主要步骤如下:

  1. 创建签名:Susan首先使用哈希函数对原始数据(如文档或消息)进行哈希处理,生成哈希值。
    在这里插入图片描述

  2. 然后,Susan使用自己的私钥对这个哈希值进行加密,生成的结果就是数字签名。
    在这里插入图片描述

  3. 附加签名:数字签名随后被附加到原始数据上,两者一起发送给Bob。
    在这里插入图片描述

  4. 验证签名:Bob收到带有数字签名的数据后,会使用Susan的公钥对数字签名进行验证(Susan的公钥也是公开的,很容易获得),并得到一个哈希值。

    Bob用Susan的公钥可以验证成功,证明这条信息的确是Susan发的,因为只有用Susan的私钥生成的数字签名才能用Susan的公钥验证成功,而Susan的私钥只有Susan自己才有。

    同时,Bob也会对原始数据执行相同的哈希处理,生成另一个哈希值。如果两个哈希值相同,则证明数据在传输过程中未被篡改。如果两个哈希值不同,那么意味着数据在传输过程中被篡改。

在这里插入图片描述

Susan通过数字签名,就能证明文档是自己发的,并且在传输的过程中没有被篡改。

证书颁发机构(CA)

最后,还有个重要的问题,不知道你有没有发现?

既然公钥都是公开的,谁都可以轻易获取, 那么如何保证公钥没有被动手脚呢?

Bob和Susan如何确定手上的公钥就是对方的呢?

如果一个坏蛋冒充Bob,给Susan发送自己的公钥,让Susan以为自己一直在和Bob聊天,这该如何破解?

这时候就要引入证书颁发机构 了。

证书颁发机构(Certificate Authority,简称CA)可以理解为网络安全中的“身份验证中心”,类似于网络世界的护照官。它的主要任务是为数字通信中的参与者(比如网站、应用程序等)提供数字证书,以确保其身份的真实性、数据传输的保密性和完整性。

证书颁发机构工作原理如下:

  1. 身份验证:当你想要获得一个数字证书时,你需要向CA申请。CA会通过一系列验证流程来确认你的身份。例如,如果你是一个公司,CA可能会要求看你的营业执照和其他法律文件。
  2. 证书生成:一旦身份得到验证,CA会为你创建一个数字证书。这个证书包含了你的公钥(用来加密信息的密钥)和一些身份信息,比如你的名字、公司名或网站地址。
  3. 证书签名:为了让其他人能够信任这个证书,CA会用自己的私钥对这个证书进行签名。这个签名就像是CA对这个证书真实性的担保。
  4. 证书分发:你将获得的数字证书安装在你的服务器或网站上。当用户访问你的网站时,他们的浏览器会检查这个证书。浏览器已经内置了信任的CA列表,所以它能够验证CA的签名。
  5. 安全通信:如果证书验证通过,用户的浏览器就会相信你的网站是安全的,然后就可以开始安全的通信了。比如,用户输入的信息会被用户的电脑使用网站的公钥加密,然后安全地发送到服务器。只有服务器用自己的私钥才能解密这些信息。
    在这里插入图片描述

有了证书颁发机构,Bob和Susan就可以从证书颁发机构那里获取对方的公钥了,这样就能保证能够获得公钥是可信任的。

非对称加密算法的应用

对称加密和非对称加密

对称加密

对称加密,又称为私钥加密,是指加密和解密使用相同密钥的加密方法。这种加密方式的特点是效率较高,因为算法相对简单,计算速度快,适合大量数据的加密。

非对称加密

非对称加密,就是本文介绍的公钥和私钥加密,是指加密和解密使用一对密钥的加密方法。公钥可以公开,任何人都可以使用它来加密信息;私钥必须保密,只有私钥的拥有者才能用它来解密信息。

对称加密算法简单,速度很快,适合传输大量的数据,而非对称加密算法复杂,速度比较慢,只适合传输重要的数据。

比如我们平时上网,需要传输大量的数据,很适合使用对称加密算法,但是对称加密算法中加密和解密使用的秘钥是同一个,这里有个难点,就是如何把秘钥安全地传送给对方?

其实这个问题已经被完美解决了,这就是HTTPS协议,我们来看下,HTTPS协议是怎么做的。

HTTPS的工作原理

  1. 建立连接:当你在浏览器中输入一个使用HTTPS的网址时,客户端会向服务器发起一个连接请求。
  2. 返回数字证书:服务器收到请求后,会返回CA颁发的数字证书,其中包含公钥等信息。
  3. 证书验证:客户端会验证服务器的证书合法性,包括检查证书颁发机构、有效期等,确认服务器的身份没问题之后,就会获取服务器的公钥。
  4. 发送对称密钥:客户端会生成对称加密所需的对称密钥(session key),然后用服务的公钥加密,发送给服务器。
  5. 解密信息:服务器收到加密的对称密钥后,会用自己的私钥来解密,这样服务器就获得了对称密钥。
  6. 建立安全通道:一旦服务器获得对称秘钥,客户端和服务器之间的“安全通道”就建立起来了,之后的所有通信都会通过这个通道进行对称加密传输,保证传输过程的安全性。

https://github.com/ByteByteGoHq/system-design-101

图片来源:https://github.com/ByteByteGoHq/system-design-101

HTTPS通过使用非对称加密(公钥和私钥)来传递对称加密所需的对称秘钥(session key),一旦服务器拿到对称秘钥之后,接下来的所有通信都会使用对称加密传输,确保了网站和用户之间的信息传输是加密的、安全的。这样,即使信息在传输过程中被截获,黑客也无法阅读这些信息,因为他们没有用来解密的秘钥。

HTTPS网站加密传输完美结合了对称加密和非对称加密算法的优点,在HTTPS协议中,非对称加密用于初始的密钥交换和身份验证,而对称加密用于后续的数据传输,以此来兼顾效率和安全性。

如此设计,令人赞叹~

参考资料:

http://www.youdzone.com/signature.html

https://time.geekbang.org/column/article/99636?utm_source=u_nav_web&utm_medium=u_nav_web&utm_term=pc_interstitial_1413

https://github.com/ByteByteGoHq/system-design-101

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RSA算法是一种非对称加密算法,它由公钥私钥组成。公钥可以用于加密数据,而私钥用于解密加密的数据。 首先,我们需要生成一组RSA公钥私钥。下面是一个使用Python编写的生成公钥私钥的代码示例: ```python from Crypto.PublicKey import RSA # 生成密钥对 key = RSA.generate(2048) # 获取公钥 public_key = key.publickey().export_key() print("公钥:", public_key.decode()) # 获取私钥 private_key = key.export_key() print("私钥:", private_key.decode()) ``` 以上代码使用了Python的`Crypto`库,首先通过`RSA.generate(2048)`生成一个2048位的RSA密钥对,然后通过`key.publickey().export_key()`获得公钥,通过`key.export_key()`获得私钥。 执行以上代码,会打印出生成的公钥私钥。由于密钥长度为2048位,生成的公钥私钥都会比较长。 以上就是求出一组RSA算法的公钥私钥的代码示例。通过这组密钥,我们可以使用RSA算法对数据进行加解密操作。 ### 回答2: RSA算法是一种非对称加密算法,其公钥私钥是一对密钥,用于加密和解密数据。 首先,我们需要生成一对RSA密钥对,其中包括公钥私钥。具体代码如下: ```python from Crypto.PublicKey import RSA # 生成RSA密钥对 key = RSA.generate(2048) # 获取公钥私钥 public_key = key.publickey().export_key() private_key = key.export_key() # 将公钥私钥保存到文件 with open('public_key.pem', 'wb') as f: f.write(public_key) with open('private_key.pem', 'wb') as f: f.write(private_key) ``` 上述代码使用了`Crypto`库来生成RSA密钥对,并将公钥私钥保存到了`public_key.pem`和`private_key.pem`文件中。 生成密钥对后,可以使用公钥对数据进行加密,私钥对数据进行解密。具体代码如下: ```python from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP # 加载公钥私钥 with open('public_key.pem', 'rb') as f: public_key = RSA.import_key(f.read()) with open('private_key.pem', 'rb') as f: private_key = RSA.import_key(f.read()) # 使用公钥进行加密 data = b'Hello World!' cipher_rsa = PKCS1_OAEP.new(public_key) encrypted_data = cipher_rsa.encrypt(data) # 使用私钥进行解密 cipher_rsa = PKCS1_OAEP.new(private_key) decrypted_data = cipher_rsa.decrypt(encrypted_data) print('原始数据:', data) print('加密后数据:', encrypted_data) print('解密后数据:', decrypted_data) ``` 上述代码中,使用`Crypto`库中的`RSA`模块加载公钥私钥文件,并使用`PKCS1_OAEP`模块对数据进行加密和解密。加密后的数据为`encrypted_data`,解密后的数据为`decrypted_data`。 ### 回答3: RSA算法是一种非对称加密算法,由三个部分组成:公钥私钥和加解密算法。下面是一个简单的Python代码示例来生成RSA公钥私钥: ```python from Crypto.PublicKey import RSA # 生成RSA密钥对,key_size为密钥长度,一般选择1024位或2048位 key = RSA.generate(2048) # 获取公钥私钥 public_key = key.public_key().export_key() private_key = key.export_key() print("公钥:") print(public_key.decode()) print("\n私钥:") print(private_key.decode()) ``` 以上代码使用了Python的`Crypto`库,需要先安装该库才能运行。 运行代码后,会输出生成的RSA公钥私钥。RSA公钥可以用于加密数据,私钥则用于解密数据。 需要注意的是,RSA算法的档案中有许多参数,例如模数(n),公钥指数(e),私钥指数(d),指数的选择对于算法的安全性至关重要。以上代码示例生成的RSA密钥对是具有较高安全性的默认参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值