Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >php中的公钥和私钥

php中的公钥和私钥

作者头像
仇诺伊
发布于 2018-09-12 06:24:14
发布于 2018-09-12 06:24:14
1.5K00
代码可运行
举报
文章被收录于专栏:佳爷的后花媛佳爷的后花媛
运行总次数:0
代码可运行

最近公司业务需要用到公钥和私钥,之前接触的很少,不是很了解,刚刚上网了解了下.发现很多地方都要用到加密.有对称加密算法( DES,AES)[加密和解密都使用一个密钥]和不对称加密算法(RSA).这里说的是RSA(非对称加密算法). RSA就涉及到公钥和私钥.

这里写图片描述

这里写图片描述

要记住的就是:公钥加密,私钥解密.私钥加密,公钥解密.

RSA加密:##

SHA-1(杀one)中的RSA算法核心特点:有一个公钥,有一个私钥,二者是一套,且每一套都是独一无二的.再无第二套一模一样的. 公钥可以随便给人,但私钥确是不可外传的. 公钥私钥都可以进行加密解密,哪个加的密,就必须用这一套的另外一个钥进行解密.钥的加密实际就是一个规则

什么是公钥加密?###

假设一下,两个字母,一个是a,一个是b。我喜欢b这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,a是我的公钥。 我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道b就是解密的私钥啊,所以他解不开,只有我可以用 数字b,就是我的私钥,来解密。这样我就可以保护数据了。 某人用我的公钥a加密了字符hello,加密后成了xxxxx,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道b就是我的私钥, 只有我才能解密,解密后就得到hello。这样,我们就可以传送加密的数据了。

私钥签名###

如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道b是我的私钥),结果所有的人都看到我的内容了,因为他们都知道我的公钥是a,那么这种加密有什么用处呢? 某人说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥b,加密,加密后的内容是d,发给某人,再告诉他解密看是不是c。他用我的公钥a解密,发现果然是c。这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名。 公钥和私钥是成对的,它们互相解密。 公钥加密,私钥解密。 私钥数字签名,公钥验证。

这里写图片描述

下面贴上php中使用公钥私钥加密解密的代码以及其中需要注意的地方: 首先公钥和私钥存放的方式有文件和字符串的形式.不过作为小白要注意的是,公钥私钥无论是放在文件中还是字符串里面,千万要记得分行.我刚开始一直不分行,然后就是老是出错,后来才知道要分行.而且不要忘了前后的注释行.-----BEGIN PUBLIC KEY----- 下面这段是错误的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADxdfxfgcghCBiQKBgQCIgm80UzfD9lQ/tnASRCapNNaoTcodUfDzNYLWAxEMp8EtWkD4eZmWbMdaWKyShIOGS48NKdVGsAB+F4usW1VFtrbqOfKgBUxMJKz1YcciBiV3kvhHZI4/jq94E0qy1jxTNdralRhe+0/JklopEM9QWZScpBT4IXBfbMJ3JD5doQIDAQAB
-----END PUBLIC KEY-----

这段代码形式才是正确的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIgm80UzfD9lQ/tnASRCapNNao
TcodUfDzNYLWAxEMp8EtWkD4eZmWbMdaWKyShIOGS48NKdVGsAB+F4usW1VFtrbq
OfKgBUxMJKz1YcciBiV3kvhHZI4/jq94E0qy1jxTNdralRhe+0/JklopEM9QWZSc
pBT4IXBfbMJ3JD5doQIDAQAB
-----END PUBLIC KEY-----

解决的公钥私钥的存放,然后就是代码中需要用到的加密解密了,加签解签了.其中用到的函数可以直接在php手册加密中查看http://php.net/manual/zh/refs.crypto.php 首先是公钥加密:这里用到的函数是openssl_public_encrypt(http://php.net/manual/zh/function.openssl-public-encrypt.php)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function encrypt($data,$key_path){   
 $key = file_get_contents($key_path);
    $encryptedList = array();
    $step          = 117; 
    $encryptedData = ''; 
    $len = strlen($data); 
    for ($i = 0; $i < $len; $i += $step) {        
       $tmpData   = substr($data, $i, $step); 
       $encrypted = '';
        openssl_public_encrypt($tmpData, $encrypted, $key,OPENSSL_PKCS1_PADDING); 
       $encryptedList[] = ($encrypted);
    }    
     $encryptedData = base64_encode(join('', $encryptedList));
    return $encryptedData;
}

用私钥解密(用到的函数openssl_private_decrypt)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private function decrypt($encryptedData){
        if (empty($encryptedData)) {
            return '';
        }
        $encryptedData = base64_decode($encryptedData);
        $decryptedList = array();
        $step          = 128;
        $len = strlen($encryptedData);
        for ($i = 0; $i < $len; $i += $step) {
            $data      = substr($encryptedData, $i, $step);
            $decrypted = '';
            openssl_private_decrypt($data, $decrypted, file_get_contents($this->_key_pri), OPENSSL_PKCS1_PADDING);
            $decryptedList[] = $decrypted;
        }
        return join('', $decryptedList);

用私钥加签,用到的函数(openssl_get_privatekey)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private function rsa_sign($data){
        //私钥加签
        $res = openssl_get_privatekey(file_get_contents($this->_key_priva_mime));
        openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA1);
        openssl_free_key($res);
        $sign = base64_encode($sign);
        return $sign;

公钥验签(openssl_get_publickey)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private function _rsaCheckSign($data, $sign){
        $pubKey = file_get_contents($this->_key_pub_mime);
        $res = openssl_get_publickey($pubKey);
        $result = (bool)openssl_verify($data, base64_decode($sign), $res);
        openssl_free_key($res);    
        return $result;
    }

ps:如果是文件形式的公私钥,需要使用file_get_contents,括号中可以是地址.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.01.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RSA 签名/验签 (PHP为例),以及各个秘钥格式解析
躺平程序员老修
2023/09/05
1.1K0
PHP 加密与解密
在现代 Web 应用中,数据安全是至关重要的,尤其是处理用户的敏感信息时,如密码、个人身份信息、信用卡号等。为了保护这些敏感数据不被黑客窃取或篡改,我们常常需要使用加密技术对数据进行保护。PHP 作为一种广泛使用的服务器端脚本语言,也提供了多种加密和解密的方法,帮助开发者实现数据的安全保护。
繁依Fanyi
2025/02/06
4060
PHP 使用非对称加密算法(RSA)
  以前一直对客户端传给服务器的信息加密这一块一脸懵,如果app里面的用户登录信息被抓包拿到了,大写着 username:root,password:123456,  那不是很尴尬。
Lansonli
2021/10/09
1.9K0
RSA加密传输代码示例
涉及敏感数据的传输,双方最好约定使用加密解密。那RSA非对称加密就大有作为了。 服务端可以保留自己的私钥,发给客户端对应的公钥。这样就可以互相加解密了。php中rsa加解密实现:
Tinywan
2019/07/16
1.4K0
RSA密文过长加密解密 越过1024的解决代码
RSA (详见维基百科)算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法,与 md5 和 sha1 不同,到目前为止,也只有极短的RSA加密被破解。
Tinywan
2019/07/16
5.1K0
PHP7.1实现的AES与RSA加密操作示例
本文实例讲述了PHP7.1实现的AES与RSA加密操作。分享给大家供大家参考,具体如下:
PHP开发工程师
2021/06/03
1.4K0
PHP 实现 SHA256 with RSA 签名 (实例讲解)
泥豆芽儿 MT
2023/10/16
1.3K0
PHP的OpenSSL加密扩展学习(二):非对称加密
上篇文章,我们了解了关于对称和非对称加密的一些相关的理论知识,也学习了使用 OpenSSL 来进行对称加密的操作。今天,我们就更进一步,学习 OpenSSL 中的非对称加密是如何实现的。
硬核项目经理
2020/11/10
9070
基础入门-算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA
密文-有源码直接看源码分析算法(后端必须要有源码才能彻底知道) 密文-没有源码1、猜识别 2、看前端JS(加密逻辑是不是在前端) #算法加密-概念&分类&类型
没事就要多学习
2024/07/18
1650
基础入门-算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA
[Linux] 使用openssl实现RSA非对称加密
参数:genrsa 生成密钥 -out 输出到文件 rsa_private_key.pem 文件名 1024 长度
唯一Chat
2019/09/11
3.6K0
php加密笔记[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/111630.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/19
1.6K0
php加密笔记[通俗易懂]
PHP加密解密方法及常见问题解决方案(php对称加密和非对称加密示例)
php是一种流行的服务器端编程语言,广泛用于web应用程序开发中。在实际应用中,php加密解密是非常常见的操作。本文将介绍php中常见的加密解密方法,以及常见问题的解决方案。
超级小可爱
2024/02/24
9370
PHP的openssl加密扩展使用小结
枕边书
2018/01/04
1.7K0
使用PHP实现RSA或RSA2算法的签名和验签
 使用RSA算法除了加密解密之外(加密解密的代码可以查看本站PHP使用RSA算法加密解密数据 这篇文章),在支付等接口方面通常还会用到生成签名和验证签名操作,下面是PHP代码:
友儿
2022/09/09
8590
php openssl生成证书,php中使用OpenSSL生成证书及加密解密[通俗易懂]
摘要:这篇文章主要介绍了PHP中使用OpenSSL生成证书及加密解密,需要的朋友可以参考下依赖于OpenSSL扩展/*加密解密*/
全栈程序员站长
2022/11/04
2.4K0
PHP RSA密文过长加密解密,PHP RSA证书大小自动适配,PHP RSA分段加密
项目中需要加密超长json内容才发现rsa加密长度有限制,于是换一种思路:我们将原本需要加密的内容拆分为多个字符串,一段一段的加密,解密端也是一段一段的解密即可完成。
高久峰
2024/04/20
3300
前端(JS)与后端(PHP) 通过 RSA 实现加解密
在项目开发过程中,为了安全起见,通常不能以明文形式传递敏感信息,容易被截获,所以引入RSA。 1. 生成公钥和私钥 在终端(基于 Unix 的操作系统)中输入以下内容。生成私钥 openssl genrsa -out rsa_1024_priv.pem 1024 通过执行以下命令获取公钥 openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem 可以使用 cat 命令来查看 cat rsa_1024_priv.pem //
句小芒
2022/12/29
2K0
RSA加密解密(无数据大小限制,php、go、java互通实现)
RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题。明文长度需要小于密钥长度,而密文长度则等于密钥长度。因此当加密内容长度大于密钥长度时,有效的RSA加解密就需要对内容进行分段。
双鬼带单
2019/07/30
5K0
非对称加密笔记
这篇文章是摘抄自某个地方,现在看来这些解释ztm是yts,说了半天都说不清楚,后来我看了MIT的一个老师上课的视频才发现人家几句或说清楚的道理咱们tm的比划了半天 画了这么多图 还说不清。md! 请大家移步这里看 https://my.oschina.net/lilugirl2005/blog/3029999
lilugirl
2019/05/26
7330
Node.js 使用 RSA 做加密
假设 A 与 B 通信。A 和 B 都提供一个公开的公钥。A 把需要传递的信息,先用自己的私钥签名,再用 B 的公钥加密。B 接收到这串密文后,用自己的私钥解密,用 A 提供的公钥验签。
超超不会飞
2020/09/18
6.7K0
推荐阅读
相关推荐
RSA 签名/验签 (PHP为例),以及各个秘钥格式解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验