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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值