相关介绍

RSA算法属于非对称加密算法,非对称加密算法需要两个秘钥:公开密钥(publickey)和私有秘钥(privatekey).公开密钥和私有秘钥是一对,

如果公开密钥对数据进行加密,只有用对应的私有秘钥才能解密;

如果私有秘钥对数据进行加密那么只有用对应的公开密钥才能解密.

因为加密解密使用的是两个不同的秘钥,所以这种算法叫做非对称加密算法.简单的说就是公钥加密私钥解密,私钥加密公钥解密.

需要注意的地方

1.RSA 加密或签名后的结果是不可读的二进制,使用时经常会转为 BASE64 码再传输

2.RSA 加密时,对要加密数据的大小有限制,最大不大于密钥长度。例如在使用 1024 bit 的密钥时(秘钥生成可以自行百度),最大可以加密 1024/8=128 Bytes 的数据。数据大于 128 Bytes 时,需要对数据进行分组加密(如果数据超限,加解密时会失败,openssl 函数会返回 false),分组加密后的加密串拼接成一个字符串后发送给客户端。

为了保证每次加密的结果都不同,RSA 加密时会在待加密数据后拼接一个随机字符串,再进行加密。不同的填充方式 Padding 表示这个字符串的不同长度,在对超限数据进行分组后,会按照这个 Padding 指定的长度填入随机字符串。例如如果 Padding 填充方式使用默认的 OPENSSL_PKCS1_PADDING(需要占用 11 个字节用于填充),那么明文长度最多只能就是 128-11=117 Bytes。

接收方解密时也需要分组。将加密后的原始二进制数据(对于经过 BASE64 的数据,需要解码),每 128 Bytes 分为一组,然后再进行解密。解密后,根据 Padding 的长度丢弃随机字符串,把得到的原字符串拼接起来,就得到原始报文。

3.openssl_public_encrypt函数 php的默认填充和无填充是有区别的,如果只是php和php对接则不需要关注这个问题,如果是php跟c或java,需要选择无填充然后自行加入填充

4.需要将php的openssl模块打开或安装(win上是打开,linux上是安装,具体自行百度)

为了方便我这里提供一组1024位的公私钥签名:

/*********************测试公钥*******************************

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmkANmC849IOntYQQdSgLvMMGm

8V/u838ATHaoZwvweoYyd+/7Wx+bx5bdktJb46YbqS1vz3VRdXsyJIWhpNcmtKhY

inwcl83aLtzJeKsznppqMyAIseaKIeAm6tT8uttNkr2zOymL/PbMpByTQeEFlyy1

poLBwrol0F4USc+owwIDAQAB

-----END PUBLIC KEY-----

*************************************************************

************************测试私钥*****************************

-----BEGIN PRIVATE KEY-----

MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKaQA2YLzj0g6e1h

BB1KAu8wwabxX+7zfwBMdqhnC/B6hjJ37/tbH5vHlt2S0lvjphupLW/PdVF1ezIk

haGk1ya0qFiKfByXzdou3Ml4qzOemmozIAix5ooh4Cbq1Py6202SvbM7KYv89syk

HJNB4QWXLLWmgsHCuiXQXhRJz6jDAgMBAAECgYAIF5cSriAm+CJlVgFNKvtZg5Tk

93UhttLEwPJC3D7IQCuk6A7Qt2yhtOCvgyKVNEotrdp3RCz++CY0GXIkmE2bj7i0

fv5vT3kWvO9nImGhTBH6QlFDxc9+p3ukwsonnCshkSV9gmH5NB/yFoH1m8tck2Gm

BXDj+bBGUoKGWtQ7gQJBANR/jd5ZKf6unLsgpFUS/kNBgUa+EhVg2tfr9OMioWDv

MSqzG/sARQ2AbO00ytpkbAKxxKkObPYsn47MWsf5970CQQDIqRiGmCY5QDAaejW4

HbOcsSovoxTqu1scGc3Qd6GYvLHujKDoubZdXCVOYQUMEnCD5j7kdNxPbVzdzXll

9+p/AkEAu/34iXwCbgEWQWp4V5dNAD0kXGxs3SLpmNpztLn/YR1bNvZry5wKew5h

z1zEFX+AGsYgQJu1g/goVJGvwnj/VQJAOe6f9xPsTTEb8jkAU2S323BG1rQFsPNg

jY9hnWM8k2U/FbkiJ66eWPvmhWd7Vo3oUBxkYf7fMEtJuXu+JdNarwJAAwJK0YmO

LxP4U+gTrj7y/j/feArDqBukSngcDFnAKu1hsc68FJ/vT5iOC6S7YpRJkp8egj5o

pCcWaTO3GgC5Kg==

-----END PRIVATE KEY-----

下面使用的相关函数功能介绍:

openssl_pkey_get_public() 从证书中提取公钥

openssl_pkey_get_private()从证书中提取私钥

openssl_public_encrypt()公钥加密

openssl_private_decrypt()私钥解密

openssl_private_encrypt()私钥加密

openssl_public_decrypt()公钥解密

base64_encode()使用base64对数据重新编码

base64_decode()将base64的数据解码

好了,准备工作到此结束。下面进行具体的codeing:

第一步:将公私钥签名定义为常量

define('RSA_PUBLIC', '-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmkANmC849IOntYQQdSgLvMMGm

8V/u838ATHaoZwvweoYyd+/7Wx+bx5bdktJb46YbqS1vz3VRdXsyJIWhpNcmtKhY

inwcl83aLtzJeKsznppqMyAIseaKIeAm6tT8uttNkr2zOymL/PbMpByTQeEFlyy1

poLBwrol0F4USc+owwIDAQAB

-----END PUBLIC KEY-----');define('RSA_PRIVATE','-----BEGIN PRIVATE KEY-----

MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKaQA2YLzj0g6e1h

BB1KAu8wwabxX+7zfwBMdqhnC/B6hjJ37/tbH5vHlt2S0lvjphupLW/PdVF1ezIk

haGk1ya0qFiKfByXzdou3Ml4qzOemmozIAix5ooh4Cbq1Py6202SvbM7KYv89syk

HJNB4QWXLLWmgsHCuiXQXhRJz6jDAgMBAAECgYAIF5cSriAm+CJlVgFNKvtZg5Tk

93UhttLEwPJC3D7IQCuk6A7Qt2yhtOCvgyKVNEotrdp3RCz++CY0GXIkmE2bj7i0

fv5vT3kWvO9nImGhTBH6QlFDxc9+p3ukwsonnCshkSV9gmH5NB/yFoH1m8tck2Gm

BXDj+bBGUoKGWtQ7gQJBANR/jd5ZKf6unLsgpFUS/kNBgUa+EhVg2tfr9OMioWDv

MSqzG/sARQ2AbO00ytpkbAKxxKkObPYsn47MWsf5970CQQDIqRiGmCY5QDAaejW4

HbOcsSovoxTqu1scGc3Qd6GYvLHujKDoubZdXCVOYQUMEnCD5j7kdNxPbVzdzXll

9+p/AkEAu/34iXwCbgEWQWp4V5dNAD0kXGxs3SLpmNpztLn/YR1bNvZry5wKew5h

z1zEFX+AGsYgQJu1g/goVJGvwnj/VQJAOe6f9xPsTTEb8jkAU2S323BG1rQFsPNg

jY9hnWM8k2U/FbkiJ66eWPvmhWd7Vo3oUBxkYf7fMEtJuXu+JdNarwJAAwJK0YmO

LxP4U+gTrj7y/j/feArDqBukSngcDFnAKu1hsc68FJ/vT5iOC6S7YpRJkp8egj5o

pCcWaTO3GgC5Kg==

-----END PRIVATE KEY-----');

第二步:进行公钥加密

//公钥加密

$public_key =openssl_pkey_get_public(RSA_PUBLIC);if(!$public_key){die('公钥不可用');

}//第一个参数是待加密的数据只能是string,第二个参数是加密后的数据,第三个参数是openssl_pkey_get_public返回的资源类型,第四个参数是填充方式

$return_en = openssl_public_encrypt("hello world", $crypted, $public_key);if(!$return_en){return('加密失败,请检查RSA秘钥');

}$eb64_cry = base64_encode($crypted);echo "公钥加密数据:".$eb64_cry;echo "


";

第三步:测试使用私钥进行解密

//私钥解密

$private_key =openssl_pkey_get_private(RSA_PRIVATE);if(!$private_key){die('私钥不可用');

}$return_de = openssl_private_decrypt(base64_decode($eb64_cry), $decrypted, $private_key);if(!$return_de){return('解密失败,请检查RSA秘钥');

}echo "私钥解密数据:".$decrypted;echo "


";

跑一下可以看到结果:

私钥加密,公钥解密的方式:

//私钥加密

$private_key =openssl_pkey_get_private(RSA_PRIVATE);if(!$private_key){die('私钥不可用');

}$return_en = openssl_private_encrypt("hello world222222", $crypted, $private_key);if(!$return_en){return('加密失败,请检查RSA秘钥');

}$eb64_cry = base64_encode($crypted);echo "私钥加密数据".$eb64_cry;echo "


";//公钥解密

$public_key =openssl_pkey_get_public(RSA_PUBLIC);if(!$public_key){die('公钥不可用');

}$return_de = openssl_public_decrypt(base64_decode($eb64_cry), $decrypted, $public_key);if(!$return_de){return('解密失败,请检查RSA秘钥');

}echo "公钥解密数据:".$decrypted;echo "


";

跑一下可以看到结果:

以上为使用php的默认填充方式加解密,请知悉

php rsa加密乱码_php RSA加解密相关推荐

  1. php rsa加密乱码_PHP RSA密文过长加密解密 越过1024的解决代码

    namespace helpers;classOpensslRSA{//echo $private_key 私钥; public $private_key = '-----BEGIN RSA PRIV ...

  2. 基于java的rsa加密程序_RSA rsa加密程序,rsa java源码和 rsa的jsp Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...

    文件名称: RSA下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 169 KB 上传时间: 2014-04-23 下载次数: 0 提 供 者: 姚双奇 详细说明: ...

  3. python3 rsa加密_python3产生RSA秘钥对并执行加解密操作详解

    加密使用的是公钥对数据进行加密,而且当你使用一把1024bit的rsa公钥的时候,你一次只能加密最多117byte的数据,如果数据量超过这个数,可能会涉及到对数据进行分段加密的问题.而且现在rsa 1 ...

  4. java中使用openssl生成的rsa公私钥进行数据加解密_使用openssl生成RSA公钥和私钥对...

    在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...

  5. ios下使用rsa算法与php进行加解密通讯

    首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数 ...

  6. Java中使用OpenSSL生成的RSA公私钥进行数据加解密

    本文出处:http://blog.csdn.net/chaijunkun/article/details/7275632,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  7. RSA生成公私钥并加解密

    1.RSA简介 RSA是目前使用最广泛的公钥密码体制之一,可以实现非对称加密.它是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leona ...

  8. C++使用OPENSSL进行RSA加密,java服务端解密

    RSA是一种非对称加密. 加密和解密方式:公钥加密-私钥解密,私钥加密-公钥解密 背景 为了网络数据安全,Web端(Java)要求用RSA加密算法传数据,公钥加密私钥解密方式(RSA有公钥加密私钥解密 ...

  9. Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍

    最近用到企业微信向银行卡转账功能,因为需要使用到:标准RSA算法 故在网上了解一下相关的信息 SA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdlem ...

最新文章

  1. UA MATH564 概率论III 期望
  2. CVPR 2020 | CMU HKUST提出binary网络自动化搜索,同时实现超高压缩与高精度
  3. axios04-文件上传
  4. 3d制作中需要注意的问题_珠宝首饰工艺篇-戒指3D造型设计制作注意要点
  5. javascript 分时函数 分批次添加DOM节点 timeChunk
  6. JavaScript | 声明数组并使用数组索引分配元素的代码
  7. 机器人教练走进驾校_“机器人教练”走进镇江驾校
  8. Spring WebAppInitializer without web.xml
  9. typedef NS_ENUM 等枚举介绍
  10. 技术分享|Javascript高级教程学习指南
  11. 计算机会计学ufo报表,《计算机会计学》教学大纲.pdf
  12. matlab求出拟合曲线的方程,已知数据点,拟合曲线并得到曲线方程。谢谢
  13. springboot中ehcache的使用
  14. 10行代码玩转弹性调度的小把戏
  15. 敏捷迭代管理 --需求变更规范
  16. uni-app APP端引入echart
  17. 朱有鹏 TCP协议(2)
  18. 赵长鹏回复协助洗钱质疑; 欧洲通过区块链监管
  19. 【线性代数的本质|笔记】线性组合、张成的空间、基
  20. 什么是 daemon

热门文章

  1. java面向对象练习题一
  2. 安装第三方插件BeautifulSoup
  3. 编写base64图片文件
  4. 手机页面尺寸设置(二)
  5. 学习第六天@Linq操作
  6. 明天回湖北!今天要开始收拾烂摊子了
  7. 新手学Linux:在VMware14中安装CentOS7详细教程
  8. (转)编码剖析Spring管理Bean的原理
  9. jquery修改a标签的href链接和文字
  10. 数据结构思维 第十四章 持久化