http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
立即拥有一个新博

一、公钥加密
假设一下,我找了两个数字,一个是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:验证失败

/*实现.pfx文件转为.pem文件*/
$file = $pfxpath;
$results = array();
$worked = openssl_pkcs12_read(file_get_contents($file), $results, $privkeypass);
var_dump($file, $privkeypass, $worked);die;
$certificateCApem =$file.'.pem';
@file_put_contents($certificateCApem, $results);
/*实现.cer文件转为.pem文件*/
$certificateCAcer = $cerpath;
$certificateCAcerContent = file_get_contents($certificateCAcer);
$certificateCApem=$cerpath.'.pem';
file_put_contents($certificateCApem,$certificateCAcerContent);


php 需要使用pem类型 必须转
一个简单的加密解密类:

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('公钥不可用');
        //解密以后的数据

php 生成证书 签名及验签相关推荐

  1. 数字证书应用综合揭秘(包括证书生成、加密、解密、签名、验签)

    引言 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件.为现实网络安全化标准如今大部分的 B2B.B2C.P2P.O2O 等商业网站含有重要企业资料个人资料的信息资信网站 ...

  2. PHP SHA1withRSA加密生成签名及验签

    最近公司对接XX第三方支付平台的代付业务,由于对方公司只有JAVA的demo,所以只能根据文档自己整合PHP的签名加密,网上找过几个方法,踩到各种各样的坑,还好最后算是搞定了,话不多说,代码分享出来. ...

  3. Java开发中的加密、解密、签名、验签,密钥,证书,这篇就够了,赶紧收藏起来

    OpenSSL和keytool 先说一下两个重要的工具 OpenSSL:OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl.应用程序命令工具以及密码算法库libcrypt ...

  4. php pfx加密,php基于sha1withRSA算法的签名和验签(pfx证书)

    在和第三方支付接口对接时经常会对数据进行签名和验签,sha1WithRSA也算是比较常用的一种签名加密算法.php开启openssl库后实现起来也算比较简单. 我在这里使用sha1withRSA算法来 ...

  5. 使用RSA、MD5对参数生成签名与验签

    在日常的工作中,我们对外提供的接口或调用三方的接口往往有一步生成签名或验签的步骤,这个步骤主要是验证调用方是 不是合法的以及内容是否被修改.比如:对于某些网上公开下载的软件,视频,尤其是镜像文件.如果 ...

  6. 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥

    测试: public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.ini ...

  7. 记录微信获取平台证书支付错误 错误的签名,验签失败

    错误的签名,验签失败 前言 解决方案 前言 我这里使用的是 微信支付 v3 sdk,sdk会帮我拼接签名,所以我初步判断是公司给我证书序列号错误 // 加载平台证书(mchId:商户号,mchSeri ...

  8. Java 解析CA证书 对数据进行签名和验签

    Java 解析CA证书 对数据进行签名和验签 话不多说直接上代码(pfx证书) pom依赖 <dependency><groupId>org.apache.commons< ...

  9. 微信支付API v3签名与验签-APP支付问题

    目录 使用API v3微信支付遇到的问题: 1.微信请求客户端配置 2.生成预付款订单 3.拼接字符串使用API v3签名 4.微信支付成功后通知 使用API v3微信支付遇到的问题: 1.jdk版本 ...

最新文章

  1. PHP开发框架之YII框架学习——碾压ThinkPHP不是梦
  2. 容量法和库仑法的异同点_【图文专辑】第十讲:容量法高锰酸盐指数的测定
  3. 电脑教程从入门到精通_HALCON机器视觉软件零基础入门学习到精通实用教学视频教程...
  4. 江苏省2013年会计从业资格考试《会计基础》全真模拟试题
  5. c++无继承情况下的对象构造
  6. C# winform bin文件夹、obj文件夹、Properties文件夹下分别存放什么文件?
  7. SpringCloud(二) 服务注册到Eureka
  8. 从零开始学视觉Transformer (10):目标检测DETR-1
  9. 在notepad++中配置java编译环境
  10. Linux——SSH服务器
  11. vhg电路是什么意思_电路板打样是什么意思?
  12. Nginx惊群问题分析及解决
  13. 交互式电子杂志_电子杂志形式与交互问题分析
  14. 装上这 10个vscode插件,python才真的是无敌的存在!
  15. 中国 AI 天才养成计划:清华姚班和 100 个「张小龙」
  16. 散讲:IT 技术团队的绩效考核
  17. python散点图获取边界_获取离散点的边界点
  18. Python教程:while 循环用法讲解
  19. 基于XC7K325T光纤传输的PCIE光纤卡、2路光纤的资料
  20. RuntimeError: einsum(): operands do not broadcast with remapped shapes [original->remapped]

热门文章

  1. 「一出好戏」带给我的启示录
  2. 【网安神器篇】——WPScan漏洞扫描工具
  3. matlab转子位置检测,永磁同步电机的转子初始位置检测
  4. react 中 Rap2的使用
  5. 群晖设置存储空间和共享文件夹
  6. 2018年中国研究生数学建模竞赛E题 第一问解析与探讨(含matlab源码)
  7. BUUOJ-sqli_labs做题笔记
  8. vue中params与query区别
  9. 挖掘视频网站【优酷】上被截断的视频的地址--002
  10. 计算圆弧上任意一点绕圆心旋转α角度后的新点坐标