php16进制密钥签名对接支付,简单理解rsa的加密和签名-PHP实现

我们先动手在linux上生成一下rsa

Ps:openssl是一堆加密算法和安全协议的开源集合,像RSA,DES,MD5,RC4等等,都能在openssl里面找到源代码.

用openssl指定生成test.key文件,其中包含公钥+私钥,1024为生成密钥长度

tb@tb:~/mimi$ openssl genrsa -out test.key 1024

Generating RSA private key, 1024 bit long modulus

.++++++

....................................................++++++

e is 65537 (0x10001)

可以简单查看下,注意这里包括私钥+公钥

vim test.key

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

MIICXQIBAAKBgQCpS7mxdU6svbDcs10qbq9f9t5D4yfqC1jLmZD3GDD4D/8TbNkf

vcYDvde6nyPRSxrnzl9YmZhJKlP2iCIwdwwmW6yulXZyvPurfN/1AJt4JYDxnN/q

u1bSG5DZMribLsR2dlfA5J0D6lQ7g40eSgp4D6UWy8ezLy6UWFQCrnUHEQIDAQAB

AoGAQCQeoKtvOWdNIPEb9T2mWFdx8oqXzsapx8nQ8K1LsFBvNe7hfHMsGLLOjzhI

G7223eiEm07mMaJF2XvOaEpSYX/qQ1LZRSdBrzCec1lcDbB95dcRg9NmgBuCpUxE

3SGYm3VB8rurfsrRUUYoIbjWz8qyuIGdMbaNkHG/CpnUYpkCQQDfWYDYtQ3DxCt+

JBoLfuCykk8+nIV12CIYb023naoR2s/aQQRk9BkGCkDrdOAgZAN3BGOHYseKAfTP

nARDzfiDAkEAwgtYfgCDTOfW5/kJK1lZO21CdCCZnePwGYmWDLPzNiJIn8k0U6Ig

9GmxG+0GKzY71XO8W3Nh18ilZbX9dYel2wJASQ+AJGNlc0pyZ7rrgiMo4YEWxwZw

adIfpRqTs6KxhVGseFqYU2W94cns3pjG0BGnSIF5BUp8t1pYeKkyg/OWfQJBAK1w

mq41IycQaoR5kfqPKDT32dgWc3gvDqKk2duM1KzkQ+meXAkM90u/VLDTURo6pYyK

oCdVoHTRQRUCcAQnNNUCQQCO/zDRaY+5ssjPqj77eJqWfAhtbSDRRw+NurmUSas1

FT1cD5nil+uT48bIRoC5nk/XWfvAvMg/Yw5bslGUNx7f

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

~

通过下面命令生成公钥出来

tb@tb:~/mimi$ openssl rsa -in test.key -pubout -out test_pub.key

writing RSA key

此时我们有公钥test_pub.key和公钥+私钥test.key

tb@tb:~/mimi$ ls

test.key test_pub.key

可以查看下公钥,短了点

tb@tb:~/mimi$ vim test_pub.key

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

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpS7mxdU6svbDcs10qbq9f9t5D

4yfqC1jLmZD3GDD4D/8TbNkfvcYDvde6nyPRSxrnzl9YmZhJKlP2iCIwdwwmW6yu

lXZyvPurfN/1AJt4JYDxnN/qu1bSG5DZMribLsR2dlfA5J0D6lQ7g40eSgp4D6UW

y8ezLy6UWFQCrnUHEQIDAQAB

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

tb@tb:~/mimi$

我们为了测试,新建了一个demo.php

tb@tb:~/mimi$ cat demo.php

echo 'tb';

tb@tb:~/mimi$

我们加密下demo.php,-in指定加密文件,-inkey 指定密钥,-pubin 意思用公钥加密-out输出文件

tb@tb:~/mimi$ openssl rsautl -encrypt -in demo.php -inkey test_pub.key -pubin -out demo.en

tb@tb:~/mimi$ ls

demo.en demo.php test.key test_pub.key

我们看加密后的demo.php,完全看不懂。。看来加密成功。

tb@tb:~/mimi$ cat demo.en

z0?!1I¢+i2?Y? 縏,°?¨IB?}?¤9§???stBI

??]〢sk膷j-???1日T-′.)

J?qz+{°Qˉ3

tb@tb:~/mimi$

然后我们需要把加密后的demo.php解密回来,-inkey指定解密文件,

tb@tb:~/mimi$ openssl rsautl -decrypt -in demo.en -inkey test.key -out demo.cn

下面的demo.cn就是解密后的文件,

tb@tb:~/mimi$ ls

demo.cn demo.php test_pub.key

demo.en test.key

tb@tb:~/mimi$ cat demo.cn

echo 'tb';

tb@tb:~/mimi$

应用:

一、服务端/移动端(ios,android)加密:流程

1、生成rsa公钥,私钥

2、移动端保留私钥,通过http将公钥传输给服务端(如http,需要base64_e(d)ncode函数对,因为会有特殊字符)

3、服务端接受公钥后,用公钥把对称加密aes的key加密,

4、服务端把需要给移动端的数据data用对称加密算法aes 加密

5、服务端把加密的data和加密的aes key给移动端

6、移动端通过私钥把服务端用公钥加密的key解密,然后用aes解密data数据

但是这个怎么交互,怎么识别,包括怎么不影响传输效率,最小减轻服务器压力。本人还没有概念。。不知道支付宝啥的怎么做的。希望大神指教

二、验证签名

1

发送方用一个hash算法对数据生成数据的摘要,然后用私钥对摘要进行签名,将此摘要和整体数据给接收方。接收方收到摘要和整体数据,用公钥解密,得到摘要。到此只能证明消息确实由发送方发出,但是怎么确定中途有没有被篡改呢?

2

接收方在对消息进行文件hash,生成摘要,如果接收方生成的摘要和用公钥解密后的摘要相等。那么就证明了文件确实为发送方发送,而且没有被篡改。

3

简而言之:

一-->公钥加密,私钥解密。

二-->私钥签名,公钥验证。

EXAMPLE WITH PHP

$private_key = "-----BEGIN RSA PRIVATE KEY-----

MIICXQIBAAKBgQCpS7mxdU6svbDcs10qbq9f9t5D4yfqC1jLmZD3GDD4D/8TbNkf

vcYDvde6nyPRSxrnzl9YmZhJKlP2iCIwdwwmW6yulXZyvPurfN/1AJt4JYDxnN/q

u1bSG5DZMribLsR2dlfA5J0D6lQ7g40eSgp4D6UWy8ezLy6UWFQCrnUHEQIDAQAB

AoGAQCQeoKtvOWdNIPEb9T2mWFdx8oqXzsapx8nQ8K1LsFBvNe7hfHMsGLLOjzhI

G7223eiEm07mMaJF2XvOaEpSYX/qQ1LZRSdBrzCec1lcDbB95dcRg9NmgBuCpUxE

3SGYm3VB8rurfsrRUUYoIbjWz8qyuIGdMbaNkHG/CpnUYpkCQQDfWYDYtQ3DxCt+

JBoLfuCykk8+nIV12CIYb023naoR2s/aQQRk9BkGCkDrdOAgZAN3BGOHYseKAfTP

nARDzfiDAkEAwgtYfgCDTOfW5/kJK1lZO21CdCCZnePwGYmWDLPzNiJIn8k0U6Ig

9GmxG+0GKzY71XO8W3Nh18ilZbX9dYel2wJASQ+AJGNlc0pyZ7rrgiMo4YEWxwZw

adIfpRqTs6KxhVGseFqYU2W94cns3pjG0BGnSIF5BUp8t1pYeKkyg/OWfQJBAK1w

mq41IycQaoR5kfqPKDT32dgWc3gvDqKk2duM1KzkQ+meXAkM90u/VLDTURo6pYyK

oCdVoHTRQRUCcAQnNNUCQQCO/zDRaY+5ssjPqj77eJqWfAhtbSDRRw+NurmUSas1

FT1cD5nil+uT48bIRoC5nk/XWfvAvMg/Yw5bslGUNx7f

-----END RSA PRIVATE KEY-----";

$public_key = "-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpS7mxdU6svbDcs10qbq9f9t5D

4yfqC1jLmZD3GDD4D/8TbNkfvcYDvde6nyPRSxrnzl9YmZhJKlP2iCIwdwwmW6yu

lXZyvPurfN/1AJt4JYDxnN/qu1bSG5DZMribLsR2dlfA5J0D6lQ7g40eSgp4D6UW

y8ezLy6UWFQCrnUHEQIDAQAB

-----END PUBLIC KEY-----";

//获取所有支持算法,cipher 就是密码,算法计算的意思

$methods=openssl_get_cipher_methods();

// var_dump($methods);

$data="原始数据为: 用私钥加密origin data1";

$method="AES-128-CBC";

//通过私钥加密,生成$crypted;

openssl_private_encrypt($data, $crypted, $private_key);

// 由于php 进行openssl_public_encrypt 加密后返回的是二进制数据,需要对其返回的加密后的数据进行二进制16进制编码base64_encode才可以显示,$crypted为加密后的串

$crypted=base64_encode($crypted);

echo "私钥加密后的结果为:".$crypted."\n";

//相应的:加密后生产的16进制加密字符串需要进行base64_decode进行解密后在进行openssl_private_decrypt

$crypted=base64_decode($crypted);

openssl_public_decrypt($crypted, $decrypted , $public_key);

echo "用公钥解密的结果为".($decrypted)."\n";

echo"===================我是分割线==============\n";

$data="用公钥加密origin data2\n";

$method="AES-128-CBC";

//通过公钥加密,生成$crypted;

openssl_public_encrypt($data, $crypted, $public_key);

// 由于php 进行openssl_public_encrypt 加密后返回的是二进制数据,需要对其返回的加密后的数据进行二进制16进制编码base64_encode才可以显示,$crypted为加密后的串

$crypted=base64_encode($crypted);

echo "公钥加密后的结果为:".$crypted."\n";

//相应的:加密后生产的16进制加密字符串需要进行base64_decode进行解密后在进行openssl_private_decrypt

$crypted=base64_decode($crypted);

openssl_private_decrypt($crypted, $decrypted , $private_key);

echo "用私钥解密的结果为".($decrypted)."\n";

大php执行结果:

0818b9ca8b590ca3270a3433284dd417.png

HELP

不知道具体参数有哪些,可以这样简单看一下。openssl rsa --hunknown option --hrsa [options] outfilewhere options are -inform arg input format - one of DER NET PEM -outform arg output format - one of DER NET PEM -in arg input file -sgckey Use IIS SGC key format -passin arg input file pass phrase source -out arg output file -passout arg output file pass phrase source -des encrypt PEM output with cbc des -des3 encrypt PEM output with ede cbc des using 168 bit key -seed encrypt PEM output with cbc seed -aes128, -aes192, -aes256 encrypt PEM output with cbc aes -camellia128, -camellia192, -camellia256 encrypt PEM output with cbc camellia -text print the key in text -noout don't print key out -modulus print the RSA key modulus -check verify key consistency -pubin expect a public key in input file -pubout output a public key -engine e use engine e, possibly a hardware device.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中字符和字节的转换_Java最佳实践–字符到字节和字节到字符的转换

java中字符和字节的转换在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优。 特别是,我们将着重于使用默认编码时如何有效地处理字符到字节和字节到字符的转换。 本文总结了两种建议的自定义方法与两…

Android实现简单短信发送器

布局&#xff1a; <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:id"id/container"android:layout_width"match_parent"android:layout_heigh…

linux 查看文件哈希码,使用linux的sha1sum命令查看效验文件哈希值命令

服务器今天小编给大家分享的是使用linux的sha1sum命令查看效验文件哈希值命令&#xff0c;相信很多人都不太了解&#xff0c;为了让大家更加了解&#xff0c;所以给大家总结了以下内容&#xff0c;一起往下看吧。一定会有所收获的哦。sha1sum命令用于生成和校验文件的sha1值。它…

Java中的传值与传引用

曾经对java中传值还是传引用的问题十分困惑&#xff0c;而且也被问到过许多次&#xff0c;无论是面试&#xff0c;还是平时我们平时的讨论中。 在stackoverflow上面浏览时&#xff0c;无意中发现了跟这个问题有关的论题&#xff0c;于是深入地查看了&#xff0c;感觉获益匪浅&a…

java高性能序列化_Java最佳实践–高性能序列化

java高性能序列化在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论并演示如何将对象序列化用于高性能应用程序。 所有讨论的主题均基于用例&#xff0c;这些用例源于电信行业关键任务超高性能生产系统的开发。 在阅读本文的…

linux进程属主6,20150917 Linux进程查看与管理以及作业管理

第一、基础知识MBR引导--内核--内核程序--》协调其它程序一般内核运行在硬件之上&#xff0c;各应用也在硬件之前1)OS的基本功能&#xff1a;文件系统、网络功能、进程管理、内存管理、驱动程序、安全功能以上为通用目的设置的程序。&#xff0c;程序指令数据&#xff0c;程序运…

在javaweb中通过servlet类和普通类读取资源文件

javaweb有两种方式读取资源文件 在Servlet中读取&#xff0c;可以使用servletContext&#xff0c;servletContext可以拿到web所有的资源文件&#xff0c;然后随便读&#xff0c;但是这种方法不常用&#xff0c;尽量少在Servlet中读取资源文件 在普通Java类中&#xff08;DAO中&…

数学图形(1.43)贝壳形曲线与鱼形曲线

贝壳形曲线 #http://curvebank.calstatela.edu/naturalcurves/slide7.jpgvertices 12000t from 0 to (2*PI)r 10*(0.7 2.6*cos(t) 1.3*pow(sin(90*t), 3))x r*sin(t) y r*cos(t) 鱼形曲线 #http://www.2dcurves.com/quartic/quarticfi.html vertices 1000 t from 0 to…

linux下编译ios,为iOS安装OpenCV

一&#xff0c;要求CMake 2.8.8 或者更高Xcode 4.2 或者更新二&#xff0c;从Git库取得最新的 OpenCV使用 git 客户端从 http://github.com/itseez/opencv clone Open 库。在 max os x 下&#xff0c;可以通过以下命令行完成cd ~/git clone https://github.com/Itseez/opencv…

学习使用资源文件[11] - DLL 中的资源文件

本例将把一张 bmp 图片, 以资源文件的方式嵌入 dll, 然后再调用.第一步: 建一个 DLL 工程, 如图:然后保存, 我这里使用的名称都是默认的.第二步: 建一个资源原文件, 如图:编辑内容如下(路径中的文件一定要存在):img1 BITMAP "c:\temp\test.bmp"然后, 取个名(后缀须是…

linux 自动安装 yum,LINUX6安装YUM仓库和实现开机自动挂载

# LINUX6安装YUM仓库和实现开机自动挂载---------------------------------安装环境-------------------------------Redhat6镜像文件&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1DKH6adbrsipM-cTzH-wBgA 百度网盘 密码是hxcbVmware Workstation虚拟机工具&#x…

.NET Framework 4.0源代码

原文出处&#xff1a;http://blogs.microsoft.co.il/blogs/arik/archive/2010/07/12/step-into-net-framework-4-0-source-code.aspx 本文将向你展示如何配置Visual Studio 2010逐语句执行.NET Framework 4.0源代码。 为啥? 因为很酷。 因为能帮助调试。 你不仅能看到源代码…

linux blender骨骼绑定,在Linux系统中安装开源3D创建套件Blender的方法

Blender是免费的开源3D创建套件&#xff0c;它可在Linux系统中安装&#xff0c;可使用snap或flatpak命令安装Blender。简介Blender也称为开源3D建模软件&#xff0c;支持整个3D管道&#xff0c;建模&#xff0c;装配&#xff0c;动画&#xff0c;模拟&#xff0c;渲染&#xff…

配置源码管理工具(2)

源码管理是开发中最重要的事情之一&#xff0c;在vs.net里我们通常采用vss进行版本控制&#xff0c;在Eclipse里看帖子说用svn的比例很大&#xff0c;和IDE的集成性也很好。 1&#xff1a;服务器部署 下载地址是&#xff1a;http://subversion.apache.org/packages.html 下载的…

编写下载服务器。 第六部分:描述您发送的内容(内容类型等)

就HTTP而言&#xff0c;客户端下载的只是一堆字节。 但是&#xff0c;客户真的很想知道如何解释这些字节。 它是图像吗&#xff1f; 或者也许是ZIP文件&#xff1f; 本系列的最后一部分描述了如何向客户端提示她下载的内容。 设置 内容类型描述了要返回的资源的MIME类型 。 此…

ruby中的self

self&#xff0c;自己&#xff0c;在ruby中表示当前对象或默认对象。程序执行的任一时刻&#xff0c;有且仅有一个self。 1.谁成为self&#xff0c;在什么位置成为self&#xff1f; 要知道哪个对象是self&#xff0c;就必须知道当前的上下文。上下文主要有顶层上下文&#xff0…

二手宏碁上网本装linux,Acer国内20日首发“上网本” 放弃Linux使用XP

据相关媒体报道 8月20日将在国内正式推出XP系统版的8.9英寸超便携笔记本电脑Aspire One&#xff0c;放弃使用Linux系统&#xff0c;硬件配置方面&#xff0c;除了依然采用英特尔Atom处理器之外&#xff0c;推出120GB传统硬盘和SSD两个版本。其中&#xff0c;XP系统 120G传统硬盘…

免费WiFi,仅仅为好久没联系的你们

昨日&#xff0c;认识五年的朋友搬来与我一起住了&#xff0c;说不上来&#xff0c;没有激动&#xff0c;仅仅是突然感觉生活又多了一点生机。兴致上来&#xff0c;晚上立马联系了已经近四个月没有联系的好友&#xff0c;才知道他们的生活也因这几个月发生了翻天覆地的变化。究…

五猴分桃c语言课程设计,c语言程序设计五猴分桃问题实验报告.doc

c语言程序设计五猴分桃问题实验报告.doc 课程设计报告学院、系&#xff1a;吉林大学珠海学院计算机科学与技术系专业名称&#xff1a;软件工程课程设计科目C语言程序课程设计所在班级&#xff1a;10班学生学号&#xff1a;04121010学生姓名&#xff1a;赵学文指导教师&#xff…

c语言100以内奇数的和为多少,编写C#程序,计算100以内所有奇数的和。谢谢了,大神帮忙啊...

编写C#程序&#xff0c;计算100以内所有奇数的和。谢谢了&#xff0c;大神帮忙啊以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;编写C#程序&#xff0c;计算100以内所有奇数的和。谢谢了&am…