非对称加解密:公钥、私钥和证书

参考:

https://blog.csdn.net/qq_25933249/article/details/100065093

https://www.cnblogs.com/imteck4713/p/12016313.html(https用的是对称加密还是非对称加密)

https://itpika.com/2019/09/24/go/library-rsa (golang标准库crypto/rsa举例)

理解公钥和私钥首先要区分加密和认证这两个概念!

加密和认证

加密是将数据资料加密,使别人即使获取加密数据也无法获取正确的资料内容,重点在于数据的安全性。
认证是是确定数据的真实发送方,使别人无法伪造或冒充,重点在于用户的真实性。

公钥和私钥

要达到数据安全传输的目的,必须发送方和接收方都持有对方的公钥和自己私钥,即任意一方持有自己的私钥和对方的公钥。

秘钥包括公钥和私钥:具有对应关系,一起生成!公钥加密私钥解密,私钥加密公钥解密。

用途

公钥:是公布出去给别人用的,可以被很多人获取。用来加解密和验签
私钥:只能自己持有,并且不可以被其他人知道,用来加解密和签名

为了数据的安全性:数据加密

A需要使用B的公钥来给数据加密,这样只有B的私钥才可以解密数据,这样保证了数据的安全性

为了保证数据发送方的真实性:签名认证

A需要使用自己的私钥来个数据加密,这样其他人用A的公钥进行解密,由于只有A私钥加密的数据,A的公钥才能解密,所以他人用A的公钥若能解密此数据,则证实数据是由A发送的,

若不能解密,则证明数据不是用A的私钥加密,即不是A发送的,这样保证了送法的真实性。

实战:

实现:php

生成公钥和私钥

$config = array(
    "private_key_bits" => 2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// 创建密钥资源
$res = openssl_pkey_new($config);

// 提取私钥
openssl_pkey_export($res, $privKey);

// 提取公钥
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];

// 打印私钥和公钥
echo "私钥:\n";
echo $privKey;
echo "\n公钥:\n";
echo $pubKey;

使用公钥和私钥,加解密

参考:https://www.cnblogs.com/huyihao/p/6082765.html

#私钥加密公钥解密
// 生成密钥资源id
$pi_key = openssl_pkey_get_private($private_key);
$pu_key = openssl_pkey_get_public($public_key);

// 私钥加密
$encrypted = ‘’;
openssl_private_encrypt($data, $encrypted, $pi_key);

// 转码,这里的$encrypted就是私钥加密的字符串
$encrypted = base64_encode($encrypted);

// 公钥解密,$decrypted即为公钥解密后私钥加密前的明文
$decrypted = ‘’;
$encrypted = base64_decode($encrypted);
openssl_public_decrypt($encrypted, $decrypted, $pu_key);


#公钥加密,私钥解密
// 生成密钥资源id
$pi_key = openssl_pkey_get_private($private_key);
$pu_key = openssl_pkey_get_public($public_key);

// 公钥加密
$encrypted = ‘’;
openssl_public_encrypt($data, $encrypted, $pu_key);

// 转码,这里的$encrypted就是公钥加密的字符串
$encrypted = base64_encode($encrypted);

// 私钥解密,$decrypted即为私钥解密后公钥加密前的明文
$decrypted = ‘’;
$encrypted = base64_decode($encrypted);
openssl_private_decrypt($encrypted, $decrypted, $pu_key);

golang版本待补充

证书:

证书是为公钥做认证,为了使公钥真实可信,防止他人伪造公钥;证书颁发 机构(证书中心CA)会用自己的私钥对用户的公钥和相关信息进行加密,生成”数字证书“,然后证书中心会公布自己的公钥给所有人,用来让用户使用此公钥验证”数字证书“是否由CA颁发,即是否真实可信,产生证书的场景:

注意:
以上前提必须是CA是可信赖的,CA证书是不可伪造的!
上边A给B发送数据只实现了身份确认,数据未被修改过,但是没有保证数据是安全的,即数据传输的过程中可以被第三人看到数据内容,要想实现安全的数据传输,A还要做进一步工作,即用B的公钥给数据加密,这样只有B才可以解密,从而保证了数据的安全性。

为什么需要证书

场景一:当A和B进行通信的时候,A使用B的共钥B.PUB对消息M进行加密,B在收到A发送的消息后,使用自己的私钥B.PRi对消息进行解密。

但是场景一有一个问题,就是有一个C可能假冒A向B发送消息,所以需要对A进行身份校验,这就需要对发送者进行身份认证。使用方式如下

场景二:A向B发送消息M,首先A使用自己的私钥A.PRI对M进行加密,再使用B.PUB加密,然后将消息发送给B,B收到消息M后,需要使用自己的私钥B.PRI对M进行第一次解密,再使用A的公钥A.PUB进行解密,如果能获取明文,说明确实是A发送的消息,这样反向使用称为数字签名。

场景二的问题在于,B无法保证获取到正确的A的公钥,如果在协商公钥过程中,C拦截了消息,并把自己的公钥发给B,那么B就会认为C就是A,导致消息泄露。

为了解决场景二的问题,就引入了证书。

场景三:A与B进行通信,B为服务端,那么B首先需要到CA(权威第三方中立机构)申请证书,CA将B的名称、公钥与CA用私钥生成的数字签名等信息携程证书颁发给B,A要与B通信时,B将自己的证书发给A,A对证书进行检查(是否过期,能否用CA的公钥验证签名等),确认无误后,就能够证明B的身份,安全的进行通信了

由上再次总结:

证书分为公钥证书和私钥证书,每个人的公钥,私钥证书不一样,但是肯定是一一对应的。
加密技术:公钥证书加密,私钥证书解密
签名技术:私钥证书加密,公钥证书解密
对于一方来说,持有对方公钥(即证书,因为公钥放在证书里),就可以验证对方身份,并且保证发送给对方数据的安全性。

posted @ 2023-03-01 13:05  小匡程序员  阅读(314)  评论(0编辑  收藏  举报