PHP --- RSA アルゴリズムの使用

php rsa の暗号化と復号化、
[WeChat 支払い v3 の暗号化、復号化、署名、および署名の検証に役立ちます
]

//res は秘密鍵の暗号化を実行します。秘密鍵はすべて左揃えにする必要があり、右は Enter キーであることに注意してください。

function Rsacheck($data){
    
    
	$PRIVATEkey="-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDRCtcvAda7ieyk
U3RUj+wYGWfyxcJ8043afywnYjj9+S0TJCPI65l7SvCr6q8s3Epsisxt2r/j5chB
x8YEwj/w0xUf8Gnuuz5puJpPAgIOwJcjyA+mvXa1YrS/PuvqlMtTxH0q+CoJjQs1
+3vdRr07dKSvc1s0A4n/EDwe3vAr2wc7vAfGAzRdZpSFnLRrGuCuydjcc2aQ2fQd
w1Lpl2vi8RP5q/KVlDuQ4WfW7gSG9hRjA6+gOVr93G+iNRalr1qO9imy6dU/WDlM
jKELoOENEYUMQCDc711iDg77Fpo1rSZHqSYvKXLMb8eMrG1T55sQQtSm+kMxqb34
rLSjPxPzAgMBAAECggEBAJ8rHu+2+bbwbRQuSzx8Hau35JNRCyaaur8s6ATQ4E5Z
pX2WnfzFj6b2R8zPNDT3Q1/kS4Y18rhnZRTZNSi4c5E+WC5qk25oejxriGsyPzjW
Yf6nvWsbhkDUeIXKNj32r98HlLrcHL4K/AdNhmHVFA8qYJ8LOd2f+DoTNYPYAo2Q
pyvqzFPa6tq1EQdZfTC5AZQdbidREj1U21ao1CewxmZrCNLCHT2J/2p8CtP7kvIW
dLNC2KJqFDNvdKUWuijI05GW5Q9c706hrVcyVff5d12b5aTeoA6Q5jvsARJHhfml
Kq8aUe7+tBdPA8BI9bO4HHIbP63KWZKKeyByEvpDWEkCgYEA79muQpRreJ7WSJrZ
SrtQkmLCPHEsNQrRH4bF73U6rZ5k6s6MJ6BDNOJlWGS496LOmYihs4Bz14uXHvCt
Z+GGNJKhrMrkMFDxsax4yFabF61nJukRjpwC3jukrE2n9hK+Pa6ETM74+tFiEgH9
5SiFDIm5yw80wTXjBXvoKdYCCj8CgYEA3x4e0llmxxwPqhGV8QTnWJulBKzoNKqS
K+xHHr0RNiIGQeBY6shMU708kWHz7GIWV1QCx6lqRox7hSGTbKF5ztup9+kqhYLh
+2dB71w85J1MQPFh0Rt5UL5ZrpzT9JDy4K0F9dNzUG6mnkpR/oN7I718acsajbts
XBlHDm34QU0CgYBUXmDy4JxxQIYl4fpfVEaCR6UFd9XSDq0DBvhnQ/hRDC95fRBF
/BTH7H8zubJqwWUlEq+2oY+eGWceJhEJQoZfxdiDHJdp+38ZPY77AaPqjz+Cq2dW
n8BOhfJl/acAYxVyQwocro1cRPzXUsYJrtgmUef96qpm8FqcGjrPRI1RJwKBgQCZ
LvHUU4MH4tEyX16FmmtHX5z9R8UpG469zzvI89/UPan0IpaJozkcKQlje0/gFDvo
ewppkHwhsaPAdJvl8jtR9WiNh60k+wYx9+PB9Z7tCr3mvJL+4RD6iaXDB3NSLw5B
iSlVbHZ4W2/Tr4z548VwdVDsxYAWnP45gTVSx9ew5QKBgQCq60Ym/8QPDBf1dibF
KDmpblAitO+IqCZ21wih6vDT2G0V9vYYNPS679CaSlYKDgm5sD1+XCI/ceaUE/UM
tqsjYVdHHbXjQz2ScLmO599R5SbTUQ3nOUYVVvyPqhpLiuUYUoZycGNoI5UwwWJ7
4ijzU25Oyk/EhatM9zZZyJ3yGw==
-----END PRIVATE KEY-----";
	$data="ceshi";
	//必须通过openssl的方法进行读取rsa的私钥否则如果直接用私钥进行加密的话会会出现乱
	$res=openssl_get_privatekey($PRIVATEkey);
	//ras使用私钥进行加密,第一个是需要加密的参数,第二个是一个空参数【存放结果】,第三个是私钥
	$res=openssl_private_encrypt($data,$decrypt,$res);
	//经过上面的加密后还是需要最后一步进行base64_encode的加密,encode是加密,decode是解密
	$sign=base64_encode($decrypt);
	var_dump($sign);die;
}

//rsa 公開鍵復号化 ----- 公開鍵を適切に保管する

function check2($data){
    
    
	$publickey="-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0QrXLwHWu4nspFN0VI/s
GBln8sXCfNON2n8sJ2I4/fktEyQjyOuZe0rwq+qvLNxKbIrMbdq/4+XIQcfGBMI/
8NMVH/Bp7rs+abiaTwICDsCXI8gPpr12tWK0vz7r6pTLU8R9KvgqCY0LNft73Ua9
O3Skr3NbNAOJ/xA8Ht7wK9sHO7wHxgM0XWaUhZy0axrgrsnY3HNmkNn0HcNS6Zdr
4vET+avylZQ7kOFn1u4EhvYUYwOvoDla/dxvojUWpa9ajvYpsunVP1g5TIyhC6Dh
DRGFDEAg3O9dYg4O+xaaNa0mR6kmLylyzG/HjKxtU+ebEELUpvpDMam9+Ky0oz8T
8wIDAQAB
-----END PUBLIC KEY-----"
	$data1="加密完内容";
	//拿到已经加密的密文,首先进行base64_decode的解密
	$data=base64_decode($data1);
	//对经过base64_decode解密的密文,进行rsa公钥解密,跟加密的时候参数位置一样
	$res=openssl_public_decrypt($data,$decrypt,$publickey);
	var_dump($decrypt);die;
}

//秘密鍵署名用のras

//以下は rsa を使用して署名し、open_sign メソッドを呼び出して署名します. 注: これは署名であり、暗号化ではありません. 署名された暗号文と暗号化された暗号文は異なります, 覚えておいてください!

function check3($data){
    
    
	$PRIVATEkey="-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDRCtcvAda7ieyk
U3RUj+wYGWfyxcJ8043afywnYjj9+S0TJCPI65l7SvCr6q8s3Epsisxt2r/j5chB
x8YEwj/w0xUf8Gnuuz5puJpPAgIOwJcjyA+mvXa1YrS/PuvqlMtTxH0q+CoJjQs1
+3vdRr07dKSvc1s0A4n/EDwe3vAr2wc7vAfGAzRdZpSFnLRrGuCuydjcc2aQ2fQd
w1Lpl2vi8RP5q/KVlDuQ4WfW7gSG9hRjA6+gOVr93G+iNRalr1qO9imy6dU/WDlM
jKELoOENEYUMQCDc711iDg77Fpo1rSZHqSYvKXLMb8eMrG1T55sQQtSm+kMxqb34
rLSjPxPzAgMBAAECggEBAJ8rHu+2+bbwbRQuSzx8Hau35JNRCyaaur8s6ATQ4E5Z
pX2WnfzFj6b2R8zPNDT3Q1/kS4Y18rhnZRTZNSi4c5E+WC5qk25oejxriGsyPzjW
Yf6nvWsbhkDUeIXKNj32r98HlLrcHL4K/AdNhmHVFA8qYJ8LOd2f+DoTNYPYAo2Q
pyvqzFPa6tq1EQdZfTC5AZQdbidREj1U21ao1CewxmZrCNLCHT2J/2p8CtP7kvIW
dLNC2KJqFDNvdKUWuijI05GW5Q9c706hrVcyVff5d12b5aTeoA6Q5jvsARJHhfml
Kq8aUe7+tBdPA8BI9bO4HHIbP63KWZKKeyByEvpDWEkCgYEA79muQpRreJ7WSJrZ
SrtQkmLCPHEsNQrRH4bF73U6rZ5k6s6MJ6BDNOJlWGS496LOmYihs4Bz14uXHvCt
Z+GGNJKhrMrkMFDxsax4yFabF61nJukRjpwC3jukrE2n9hK+Pa6ETM74+tFiEgH9
5SiFDIm5yw80wTXjBXvoKdYCCj8CgYEA3x4e0llmxxwPqhGV8QTnWJulBKzoNKqS
K+xHHr0RNiIGQeBY6shMU708kWHz7GIWV1QCx6lqRox7hSGTbKF5ztup9+kqhYLh
+2dB71w85J1MQPFh0Rt5UL5ZrpzT9JDy4K0F9dNzUG6mnkpR/oN7I718acsajbts
XBlHDm34QU0CgYBUXmDy4JxxQIYl4fpfVEaCR6UFd9XSDq0DBvhnQ/hRDC95fRBF
/BTH7H8zubJqwWUlEq+2oY+eGWceJhEJQoZfxdiDHJdp+38ZPY77AaPqjz+Cq2dW
n8BOhfJl/acAYxVyQwocro1cRPzXUsYJrtgmUef96qpm8FqcGjrPRI1RJwKBgQCZ
LvHUU4MH4tEyX16FmmtHX5z9R8UpG469zzvI89/UPan0IpaJozkcKQlje0/gFDvo
ewppkHwhsaPAdJvl8jtR9WiNh60k+wYx9+PB9Z7tCr3mvJL+4RD6iaXDB3NSLw5B
iSlVbHZ4W2/Tr4z548VwdVDsxYAWnP45gTVSx9ew5QKBgQCq60Ym/8QPDBf1dibF
KDmpblAitO+IqCZ21wih6vDT2G0V9vYYNPS679CaSlYKDgm5sD1+XCI/ceaUE/UM
tqsjYVdHHbXjQz2ScLmO599R5SbTUQ3nOUYVVvyPqhpLiuUYUoZycGNoI5UwwWJ7
4ijzU25Oyk/EhatM9zZZyJ3yGw==
-----END PRIVATE KEY-----";
	$data="ceshi";
	//必须通过openssl的方法进行读取rsa的私钥否则如果直接用私钥进行加密的话会会出现乱
	$res=openssl_get_privatekey($PRIVATEkey);
	//ras使用私钥进行加密,第一个是需要加密的参数,第二个是一个空参数【存放结果】,第三个是私钥,这里出现了第四个参数,OPENSSL_ALGO_MD5,这个是MD5实现的是MD5withRSA签名的算法
	openssl_sign($data,$sign,$res,OPENSSL_ALGO_MD5);
	//经过上面的加密后还是需要最后一步进行base64_encode的加密,encode是加密,decode是解密
	$sign=base64_encode($sign);
	var_dump($sign);die;
}

//署名検証用のRSA公開鍵

function check4($data){
    
    
	$publickey="-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0QrXLwHWu4nspFN0VI/s
GBln8sXCfNON2n8sJ2I4/fktEyQjyOuZe0rwq+qvLNxKbIrMbdq/4+XIQcfGBMI/
8NMVH/Bp7rs+abiaTwICDsCXI8gPpr12tWK0vz7r6pTLU8R9KvgqCY0LNft73Ua9
O3Skr3NbNAOJ/xA8Ht7wK9sHO7wHxgM0XWaUhZy0axrgrsnY3HNmkNn0HcNS6Zdr
4vET+avylZQ7kOFn1u4EhvYUYwOvoDla/dxvojUWpa9ajvYpsunVP1g5TIyhC6Dh
DRGFDEAg3O9dYg4O+xaaNa0mR6kmLylyzG/HjKxtU+ebEELUpvpDMam9+Ky0oz8T
8wIDAQAB
-----END PUBLIC KEY-----"
	$data1="ceshi";
	$sign="**************签名********************"
	//必须调用openssl的方式获得公钥,否则不行
	$res=openssl_get_publickey($publickey);
	//$data是签名参数,$sign是需要验签的签名,先对签名进行base64_decode解密,然后对签名密文进行MD5withRSA进行验签,验签是调用openssl内置方法验签,返回bool值
	$result=(bool)openssl_verify($data,base64_decode($sign),$res,OPENSSL_ALGO_MD5);
	var_dump($result);die;
}

おすすめ

転載: blog.csdn.net/wkj001/article/details/129093672