一、公钥加密
假设一下,我找了两个数字,一个是1,一个是2。我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥。

我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用
数字2,就是我的私钥,来解密。这样我就可以保护数据了。

我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥,
只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。

二、私钥签名
如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知
道我的公钥是1,那么这种加密有什么用处呢?

但是我的好朋友x说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,发给x,再告诉他
解密看是不是c。他用我的公钥1解密,发现果然是c。
这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。
这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名

总结:公钥和私钥是成对的,它们互相解密。

公钥加密,私钥解密。

私钥数字签名,公钥验证。

举例

比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:

  1. Bob将他的公开密钥传送给Alice。
  2. Alice用Bob的公开密钥加密她的消息,然后传送给Bob。
  3. Bob用他的私人密钥解密Alice的消息。

  上面的过程可以用下图表示,Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。

例子和图出自《网络安全基础 应用与标准第二版》

RSA算法

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

实例演示:

关于PHP生成证书密钥的资料真是好少啊,查了半天,最终还是在官方文档找到了相关资料,又根据自己的理解,整理成了以下代码,分成两部分:生成证书密钥、加密解密数据。直接复制下来做成两个文件运行就好啦。已经写了详细的注释,相信PHP程序员都能看得懂。

generate.php

$dn = array(  "countryName" => 'XX', //所在国家名称  "stateOrProvinceName" => 'State', //所在省份名称  "localityName" => 'SomewhereCity', //所在城市名称  "organizationName" => 'MySelf',   //注册人姓名  "organizationalUnitName" => 'Whatever', //组织名称  "commonName" => 'mySelf', //公共名称  "emailAddress" => 'user@domain.com' //邮箱
);  $privkeypass = '111111'; //私钥密码  $numberofdays = 365;     //有效时长  $cerpath = "./test.cer"; //生成证书路径  $pfxpath = "./test.pfx"; //密钥文件路径  //生成证书  $privkey = openssl_pkey_new(); $csr = openssl_csr_new($dn, $privkey);  $sscert = openssl_csr_sign($csr, null, $privkey, $numberofdays);  openssl_x509_export_to_file($sscert, $cerpath); //导出证书到文件openssl_pkcs12_export_to_file($sscert, $pfxpath, $privkey, $privkeypass); //生成密钥文件  

crypt.php

   //私钥加密$cer_key = file_get_contents($pfxpath); //获取密钥内容openssl_pkcs12_read($cer_key, $certs, $privkeypass);openssl_sign($data, $signMsg, $certs['pkey'],OPENSSL_ALGO_SHA1); //注册生成加密信息$signMsg = base64_encode($signMsg); //base64转码加密信息echo $signMsg;//公钥解密$cer_key = file_get_contents($cerpath); //获取证书内容$unsignMsg=base64_decode($signMsg);//base64解码加密信息$cer = openssl_x509_read($cer_key); //读取公钥$res = openssl_verify($data, $unsignMsg, $cer); //验证echo $res; //输出验证结果,1:验证成功,0:验证失败

一个简单的加密解密类:

class RsaCrypt {const PRIVATE_KEY_FILE_PATH = './rsa_private_key.pem';const PUBLIC_KEY_FILE_PATH = './rsa_public_key.pem';public static function encode($orignData) {//密钥文件的路径$privateKeyFilePath = self::PRIVATE_KEY_FILE_PATH;extension_loaded('openssl') or die('php需要openssl扩展支持');(file_exists($privateKeyFilePath)) or die('密钥的文件路径不正确');//生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false$privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));($privateKey) or die('密钥不可用');//加密以后的数据,用于在网路上传输$encryptData = '';///用私钥加密if (openssl_private_encrypt($orignData, $encryptData, $privateKey)) {return $encryptData;} else {die('加密失败');}}public static function decode($encryptData) {//公钥文件的路径$publicKeyFilePath = self::PUBLIC_KEY_FILE_PATH;extension_loaded('openssl') or die('php需要openssl扩展支持');(file_exists($publicKeyFilePath)) or die('公钥的文件路径不正确');//生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));($publicKey) or die('公钥不可用');//解密以后的数据$decryptData = '';///用公钥解密if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) {return $decryptData;} else {die('解密失败');}}
}


特别说明:

x509,公钥证书,只有公钥。
p7,签名或加密。可以往里面塞x509,同时没有签名或加密内容。
p12,含有私钥,同时可以有公钥,有口令保护。
p7的作用就是电子信封。
X509是基本规范
P7和P12是两个实现规范,P7是数字信封,P12是带有私钥的证书规范。
x509是数字证书的规范,P7和P12是两种封装形式。比如说同样的电影,有的是avi格式,有的是mpg,大概就这个意思。

P7一般是把证书分成两个文件,一个公钥一个私钥,有PEM和DER两种编码方式。PEM比较多见,就是纯文本的,P7一般是分发公钥用,看到的就是一串可见字符串,扩展名经常是.crt,.cer,.key等。DER是二进制编码。
P12是把证书压成一个文件,.pfx 。主要是考虑分发证书,私钥是要绝对保密的,不能随便以文本方式散播。所以P7格式不适合分发。.pfx中可以加密码保护,所以相对安全些。
在实践中要中,用户证书都是放在USB Key中分发,服务器证书经常还是以文件方式分发。服务器证书和用户证书,都是X509证书,就是里面的属性有区别。

X509 是证书规范
PKCS#7 是消息语法 (常用于数字签名与加密)
PKCS#12 个人消息交换与打包语法 (如.PFX .P12)打包成带公钥与私钥

转载于:https://www.cnblogs.com/baocheng/p/5910448.html

PHP通过OpenSSL生成证书、密钥并且加密解密数据,以及公钥,私钥和数字签名的理解...相关推荐

  1. 转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名...

    转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 July 20, 20 ...

  2. 如何利用OpenSSL生成证书

    此文已由作者赵斌授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.前言 最近为了测试内容分发网络(Content Delivery Network,简称 CDN)添加的新功 ...

  3. openssl生成证书linux,Linux下使用openssl生成证书

    利用OpenSSL生成库和命令程序,在生成的命令程序中包括对加/解密算法的测试,openssl程序,ca程序.利用openssl,ca可生成用于C/S模式的证书文件以及CA文件. 证书文件的生成步骤: ...

  4. SSL数字证书(三)使用 openssl 生成证书

    数字证书原理(〇)认识SSL SSL数字证书(一)CA.根证书与数字证书 SSL数字证书(二)使用makecert.exe签发证书 SSL数字证书(三)使用 openssl 生成证书 转载自<使 ...

  5. OpenSSL 生成证书

    OpenSSL 生成证书 作者:Bright Xu 在当前目录创建配置文件,用于定义后面创建证书的相关配置 创建server.conf文件,并写入一下内容: oid_section = new_oid ...

  6. Apache OpenSSL生成证书使用

    最近在学习SSL协议,这次是基于Apache服务器自带的openssl来实现的 TLS:传输层安全协议 SSL:安全套接字层 KEY:私钥 CSR:证书签名请求,即公钥,生成证书时需要将此提交给证书机 ...

  7. openssl生成证书linux,linux中openssl生成证书和自签证书linux操作系统 -电脑资料

    下面来给大家介绍关于linux中openssl生成证书和自签证书的例子,整个过程都讲述的非常详细有兴趣的朋友可进入参考, 1.首先要生成服务器端的私钥(key文件):代码如下复制代码 openssl ...

  8. Java实现基于国密SM2、SM4生成证书密钥进行字串的加解密

    目录 流程说明: DTO层 生成证书密钥所需参数封装类 最终密文封装类 controller层 service层 serviceImp层 加密工具类 测试 发送生成证书请求 发送生成密文请求 发送解读 ...

  9. Openssl生成证书流程

    Openssl生成证书流程 偶然想到在内网配置https,就梳理了下利用openssl与ca生成证书的过程. 生成过程分为服务端跟客户端,这里我在一台上测试. 一.介绍 CA是Certificate ...

最新文章

  1. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊
  2. 软件项目管理0831:不要自我评价过高
  3. CF1070L Odd Federalization 高斯消元
  4. CentOS 关闭、启动网卡
  5. springboot中的mybatis是如果使用pagehelper的
  6. HTML <div> 标签介绍
  7. __builtin_expect详解
  8. 创建线程的方式_创建线程有几种不同的方式?
  9. 云+X案例展 | 电商零售类:WakeData助力叁拾加数字化变革
  10. 重磅!深度学习的顶级会议ICLR 2020 数据图文详解
  11. 史上最简单JS复制功能,兼容安卓ios!
  12. .NET 工具生成引擎概述
  13. ios xib 初始化高度_iOS图片伸缩技巧
  14. 浮点数 字符串 java_Java如何将浮点数转换为字符串
  15. sublime Text3下sass环境配置(windows)
  16. 轉APUE:mmap函数
  17. Mysql(8)_存储引擎之InnoDB
  18. Java的三种技术架构是什么?
  19. IT培训分享:11种热门编程语言的主要用途
  20. 计算机内存不足16g内存,高手亲自教你win10 16g内存显示内存不足的修复要领

热门文章

  1. Python学习之面向对象
  2. 前后端分离重复提交_阿里一面:如何保证API接口数据安全?
  3. java中四类八中_JAVA中的八中基本数据类型
  4. Java笔记-DH密钥交换获取密钥及AES加解密
  5. Java|达梦工作笔记-达梦数据库同步工具(JDBC)
  6. Spring Boot笔记-目前对Web后端开发的认识
  7. js导出的xlsx无法打开_vue将数据导出为excel文件就是如此简单
  8. mysql 建表语句 stored as_Druid 解析Hive建表语句解析报错
  9. php图片中不显示文字内容,水印效果 只有图片,文字不显示
  10. oracle触发器无效且,oracle创建触发器成功但是插值失败