opensslphprsa
❶ php 当中 openssl_private_encrypt 加密的时候 为什么只能加密117个字符的长度的字符串,超过这个长度的字
PHP RSA使用非对称加解密就是 密钥/8 -11的长度。你可以使用AES/DES对称加解密这个不限制长度
❷ c++rsa加密,php如何解密
举例:
function rsaSign($data,$private_key) { $res = openssl_get_privatekey($private_key); // $data=sha1($data); //sha1加密(如果需要的话,如果进行加密,则对方也要进行加密后做对比) openssl_sign($data, $sign, $res,OPENSSL_ALGO_SHA1);//加签,可以指定加密方式 openssl_free_key($res); //base64编码 $sign = base64_encode($sign); return $sign;}
❸ php openssl rsa 加密长度大于117,返回false,无法加密,求解决办法
把你自己的字符串分开,每100个字符串成一个,然后分开加密相连,解密的时候也是如此
❹ php5.5怎么配置openssl
配置如下
1:编辑openssl,php5需要0.96以上版本
2:将编译好的libeay32.dll,ssleay32.dll放到system32目录下
3:将php.ini中的openssl.dll前面的;去掉
4:将php目录下的php_openssl.dll拷贝到system32目录下
5:设置环境变量
OPENSSL_CONF=c:opensslopenssl.cnf
其中php自带了一个cnf示例,在phpextrasopenssl目录下
编写测试代码:
$config = array(
"digest_alg" => "sha1",
"private_key_bits" => 1024,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
"encrypt_key" => false
);
$privkey = openssl_pkey_new($config);
openssl_pkey_export($privkey, $keydata);
echo $keydata;
其它函数参见php的openssl帮助
❺ php rsa密钥经过pkcs8编码的怎么进行签名
static protected function sign($data,$priKey) {
$res = openssl_get_privatekey($priKey);
//调用openssl内置签名方法,生成签名$sign
openssl_sign($data, $sign, $res);
//释放资源
openssl_free_key($res);
//base64编码
$sign = base64_encode($sign);
return $sign;
}
❻ php rsa/no/padding加密怎么实现
Java和PHP RSA加密实现互通
1:通过openssl 生成公钥和密钥文件(Linux)
(1) 生产私钥文件命令
openssl genrsa -out rsa_private_key.pem 1024
(2) 通过私钥文件生成公钥命令
openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout
(3) 将传统格式的私钥转换成 PKCS#8 格式的的密钥文件
openssl pkcs8 -topk8 -in rsa_private_key.pem -outpkcs8_rsa_private_key.pem -nocrypt
❼ php 支付宝接口官方给的md5签名版本和rsa签名版本的区别
虽然支付宝官方还未提供相关SDK,PHP确实可以实现RSA方式的签名,这点其实很重要,由于不熟悉,在遇到困难的时候,经常会不由自主地想到是否PHP不支持RSA签名,干脆用MD5得了,这样就没有了前进的动力。其实说穿了MD5和RSA签名,不同的只是签名方式的区别,其他的都一样,因此我这里主要说一下如何用RSA进行签名和验签。
首先你需要准备下面的东西:
php的openssl扩展里已经封装好了验签的方法openssl_verify。
如果在Windows下的php.ini需要开启Openssl模块: extension=php_openssl.dll
商户私钥:
即RSA私钥,按照手册,按以下方式生成:
openssl genrsa -out rsa_private_key.pem 1024
商户公钥:
即RSA私钥,按照手册,按以下方式生成:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成之后,按照手册的说明,需要在签约平台上传公钥,需要注意的是,上传的时候需要把所有的注释和换行都去掉。
另外手册中还有如下命令:
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
该命令将RSA私钥转换成PKCS8格式,对于PHP来说,不需要。
支付宝公钥:
根据手册,在签约平台获得。
如果你直接复制下来的话,会得到一个字符串,需要进行下面的转换;
1)把空格变成换行
2)添加注释
比如你复制下来的公钥是:
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB,那转换之后为:
-----BEGIN PUBLIC KEY-----
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB
-----END PUBLIC KEY-----
把公钥保存在文件里。
注意这个是2048位的公钥应该是9行或者10行,不能为1行,不然PHP的openssl_pkey_get_public无法读取,pub_key_id的结果为false,如果没有-----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY----- 可以自己加上,最后保存到一个rsa_public_key.pem文件中。
好了,现在已经有了所有的东西,先看签名函数:
复制代码
1 <?php
2 /**
3 * 签名字符串
4 * @param $prestr 需要签名的字符串
5 * return 签名结果
6 */
7 function rsaSign($prestr) {
8 $public_key= file_get_contents('rsa_private_key.pem');
9 $pkeyid = openssl_get_privatekey($public_key);
10 openssl_sign($prestr, $sign, $pkeyid);
11 openssl_free_key($pkeyid);
12 $sign = base64_encode($sign);
13 return $sign;
14 }
15 ?>
复制代码
注意点:
1.$prestr的内容和MD5一样(参见手册,但不包含最后的MD5密码)
2.签名用商户私钥
3.最后的签名,需要用base64编码
4.这个函数返回的值,就是这次请求的RSA签名。
验签函数:
复制代码
1 <?php
2 /**
3 * 验证签名
4 * @param $prestr 需要签名的字符串
5 * @param $sign 签名结果
6 * return 签名结果
7 */
8 function rsaVerify($prestr, $sign) {
9 $sign = base64_decode($sign);
10 $public_key= file_get_contents('rsa_public_key.pem');
11 $pkeyid = openssl_get_publickey($public_key);
12 if ($pkeyid) {
13 $verify = openssl_verify($prestr, $sign, $pkeyid);
14 openssl_free_key($pkeyid);
15 }
16 if($verify == 1){
17 return true;
18 }else{
19 return false;
20 }
21 }
22 ?>
复制代码
注意点:
1.$prestr的内容和MD5一样(参见手册)
2.$sign是支付宝接口返回的sign参数用base64_decode解码之后的二进制
3.验签用支付宝公钥
4.这个函数返回一个布尔值,直接告诉你,验签是否通过
支付宝官方提供的PHP版SDK demo中只对MD5加密方式进行了处理,但android 端和ios端 请求支付宝加密方式只能用RSA加密算法,这时服务端PHP就无法验证签名了,所以需要对demo进行一些修改。
1、修改alipay_notify.class.php文件
verifyNotify 函数第46行
$isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
改成
$isSign = $this->getSignVeryfy($_POST, $_POST["sign"], $_POST["sign_type"]);
verifyReturn 函数第83行
$isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
改成
$isSign = $this->getSignVeryfy($_GET, $_GET["sign"], $_GET["sign_type"]);
getSignVeryfy 函数 116行
function getSignVeryfy($para_temp, $sign) {
改成
function getSignVeryfy($para_temp, $sign, $sign_type) {
getSignVeryfy 函数 127行
switch (strtoupper(trim($this->alipay_config['sign_type']))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
break;
default :
$isSgin = false;
}
改成
switch (strtoupper(trim($sign_type))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
break;
case "RSA" :
$isSgin = rsaVerify($prestr, $sign);
break;
default :
$isSgin = false;
}
2、新建一个alipay_rsa.function.php文件
复制代码
1 <?php
2 /* *
3 * RSA
4 * 详细:RSA加密
5 * 版本:3.3
6 * 日期:2014-02-20
7 * 说明:
8 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
9 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
10 */
11 /**
12 * 签名字符串
13 * @param $prestr 需要签名的字符串
14 * return 签名结果
15 */
16 function rsaSign($prestr) {
17 $public_key= file_get_contents('rsa_private_key.pem');
18 $pkeyid = openssl_get_privatekey($public_key);
19 openssl_sign($prestr, $sign, $pkeyid);
20 openssl_free_key($pkeyid);
21 $sign = base64_encode($sign);
22 return $sign;
23 }
24 /**
25 * 验证签名
26 * @param $prestr 需要签名的字符串
27 * @param $sign 签名结果
28 * return 签名结果
29 */
30 function rsaVerify($prestr, $sign) {
31 $sign = base64_decode($sign);
32 $public_key= file_get_contents('rsa_public_key.pem');
33 $pkeyid = openssl_get_publickey($public_key);
34 if ($pkeyid) {
35 $verify = openssl_verify($prestr, $sign, $pkeyid);
36 openssl_free_key($pkeyid);
37 }
38 if($verify == 1){
39 return true;
40 }else{
41 return false;
42 }
43 }
44 ?>
❽ php openssl生成的rsa密钥给android和ios使用注意哪些问题
主要是规定好数据的编码即可,例如用UTF-8或者用GBK两边同步就行了。
❾ ios开发rsa加密怎么生成秘钥
1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以) 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令: 代码如下: openssl genrsa -out rsa_private_key.pem 1024 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem 从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端 2、php中用生成的公钥、私钥进行加密解密,直接上代码 代码如下: $fp=fopen("rsa/rsa_private_key.pem","r"); //你的私钥文件路径 $private_key=fread($fp,8192); fclose($fp); $fp1=fopen("rsa/rsa_public_key.pem","r"); //你的公钥文件路径 $public_key=fread($fp1,8192); fclose($fp1); //echo $private_key; $pi_key=openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id $pu_key=openssl_pkey_get_public($public_key );//这个函数可用来判断公钥是否是可用的 print_r($pi_key);echo "n"; echo "<br>"; print_r($pu_key);echo "n"; echo "<br>"; echo "<hr>"; $data='php ras加密算法'; $encrypted = ""; $decrypted = ""; echo "加密的源数据:".$data."n"; echo "<br>"; echo "private key encrypt:n"; echo "<br>"; openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密 $encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的 echo '私钥加密后:'.$encrypted."n"; echo "<br>";echo "<br>"; echo "public key decrypt:n"; echo "<br>"; openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来 echo '公钥解密后:'.$decrypted."n"; echo "<br>"; echo "<hr>"; echo "public key encrypt:n"; echo "<br>"; openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密 $encrypted = base64_encode($encrypted); echo $encrypted,"n"; echo "<br>"; echo "private key decrypt:n"; echo "<br>"; openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密 echo $decrypted,"n"; echo "<br>"; PHP的RSA配置常见问题: ●PHP开发语言的代码示例中openssl文件夹中的3个DLL文件用法 1、如果你的系统是windows系统,且system32文件目录下没有libeay32.dll、ssleay32.dll这两个文件 那么需要拷贝这两个文件到system32文件目录。 2、如果您的php安装目录下(phpext)中没有php_openssl.dll 那么请把php_openssl.dll放在这个文件夹中 喜欢加密解密的小伙伴一定要好好看看这篇文章,受益匪浅。。。