日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

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

發(fā)布時間:2023/12/2 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php16进制密钥签名对接支付,简单理解rsa的加密和签名-PHP实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們先動手在linux上生成一下rsa

Ps:openssl是一堆加密算法和安全協(xié)議的開源集合,像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$

我們?yōu)榱藴y試,新建了一個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$

應(yīng)用:

一、服務(wù)端/移動端(ios,android)加密:流程

1、生成rsa公鑰,私鑰

2、移動端保留私鑰,通過http將公鑰傳輸給服務(wù)端(如http,需要base64_e(d)ncode函數(shù)對,因為會有特殊字符)

3、服務(wù)端接受公鑰后,用公鑰把對稱加密aes的key加密,

4、服務(wù)端把需要給移動端的數(shù)據(jù)data用對稱加密算法aes 加密

5、服務(wù)端把加密的data和加密的aes key給移動端

6、移動端通過私鑰把服務(wù)端用公鑰加密的key解密,然后用aes解密data數(shù)據(jù)

但是這個怎么交互,怎么識別,包括怎么不影響傳輸效率,最小減輕服務(wù)器壓力。本人還沒有概念。。不知道支付寶啥的怎么做的。希望大神指教

二、驗證簽名

1

發(fā)送方用一個hash算法對數(shù)據(jù)生成數(shù)據(jù)的摘要,然后用私鑰對摘要進(jìn)行簽名,將此摘要和整體數(shù)據(jù)給接收方。接收方收到摘要和整體數(shù)據(jù),用公鑰解密,得到摘要。到此只能證明消息確實由發(fā)送方發(fā)出,但是怎么確定中途有沒有被篡改呢?

2

接收方在對消息進(jìn)行文件hash,生成摘要,如果接收方生成的摘要和用公鑰解密后的摘要相等。那么就證明了文件確實為發(fā)送方發(fā)送,而且沒有被篡改。

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="原始數(shù)據(jù)為: 用私鑰加密origin data1";

$method="AES-128-CBC";

//通過私鑰加密,生成$crypted;

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

// 由于php 進(jìn)行openssl_public_encrypt 加密后返回的是二進(jìn)制數(shù)據(jù),需要對其返回的加密后的數(shù)據(jù)進(jìn)行二進(jìn)制16進(jìn)制編碼base64_encode才可以顯示,$crypted為加密后的串

$crypted=base64_encode($crypted);

echo "私鑰加密后的結(jié)果為:".$crypted."\n";

//相應(yīng)的:加密后生產(chǎn)的16進(jìn)制加密字符串需要進(jìn)行base64_decode進(jìn)行解密后在進(jìn)行openssl_private_decrypt

$crypted=base64_decode($crypted);

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

echo "用公鑰解密的結(jié)果為".($decrypted)."\n";

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

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

$method="AES-128-CBC";

//通過公鑰加密,生成$crypted;

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

// 由于php 進(jìn)行openssl_public_encrypt 加密后返回的是二進(jìn)制數(shù)據(jù),需要對其返回的加密后的數(shù)據(jù)進(jìn)行二進(jìn)制16進(jìn)制編碼base64_encode才可以顯示,$crypted為加密后的串

$crypted=base64_encode($crypted);

echo "公鑰加密后的結(jié)果為:".$crypted."\n";

//相應(yīng)的:加密后生產(chǎn)的16進(jìn)制加密字符串需要進(jìn)行base64_decode進(jìn)行解密后在進(jìn)行openssl_private_decrypt

$crypted=base64_decode($crypted);

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

echo "用私鑰解密的結(jié)果為".($decrypted)."\n";

大php執(zhí)行結(jié)果:

HELP

不知道具體參數(shù)有哪些,可以這樣簡單看一下。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.

總結(jié)

以上是生活随笔為你收集整理的php16进制密钥签名对接支付,简单理解rsa的加密和签名-PHP实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。