RSA.php
2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php
namespace Lackoxygen\GzCbec\Utils;
use Lackoxygen\GzCbec\Exception\Exception;
class RSA
{
/**
* @param $key
*
* @return string
*/
public static function trimKey($key): string
{
return wordwrap(preg_replace('/[\r\n]/', '', $key), 64, "\n", true);
}
/**
* @param $data
* @param $key
*
* @return mixed
*/
public static function signPrivate($data, $key)
{
$key = self::trimKey($key);
$key = "-----BEGIN RSA PRIVATE KEY-----\n{$key}\n-----END RSA PRIVATE KEY-----";
openssl_sign($data, $sign, $key, \OPENSSL_ALGO_SHA1);
return $sign;
}
/**
* @param $data
* @param $fileName
*
* @return mixed
* @throws Exception
*/
public static function signPrivateFromFile($data, $fileName)
{
$key = file_get_contents($fileName);
$res = openssl_get_privatekey($key);
if (!$res) {
throw new Exception('Incorrect public key file format');
}
openssl_sign($data, $sign, $res, \OPENSSL_ALGO_SHA1);
openssl_free_key($res);
return $sign;
}
/**
* @param $data
* @param $key
* @param $sign
*
* @return bool
*/
public static function verifyPublic($data, $key, $sign)
{
$key = static::trimKey($key);
$key = "-----BEGIN PUBLIC KEY-----\n{$key}\n-----END PUBLIC KEY-----";
return 1 === openssl_verify($data, $sign, $key, \OPENSSL_ALGO_SHA1);
}
/**
* @param $data
* @param $fileName
* @param $sign
*
* @return bool
* @throws Exception
*/
public static function verifyPublicFromFile($data, $fileName, $sign): bool
{
$key = file_get_contents($fileName);
$res = openssl_get_publickey($key);
if (!$res) {
throw new Exception('Incorrect public key file format');
}
$result = openssl_verify($data, $sign, $res, \OPENSSL_ALGO_SHA1);
openssl_free_key($res);
return 1 === $result;
}
/**
* @param $data
* @param $fileName
*
* @return mixed
* @throws Exception
*/
public static function encryptPublicFromFile($data, $fileName)
{
$res = openssl_get_publickey(file_get_contents($fileName));
if (!$res) {
throw new Exception('公钥文件格式错误');
}
openssl_public_encrypt($data, $result, $res, \OPENSSL_PKCS1_OAEP_PADDING);
openssl_free_key($res);
return $result;
}
/**
* @param $data
* @param $public
*
* @return mixed
*/
public static function encryptPublic($data, $public)
{
openssl_public_encrypt($data, $result, $public, \OPENSSL_PKCS1_OAEP_PADDING);
return $result;
}
}