--------php 源码-------------$mailcont = "邮件正文………超过1024字节………邮件正文";
$crtpath = "/usr/nc-home/webpost/mailbox/d00/1/y/u/yushuai.niu/.user/certkey/wxd.crt";
exec("chmod 777 {$crtpath}");
$fp = fopen($crtpath, "r");
$crt = fread($fp, 8192);
fclose($fp);
$pubKey = openssl_get_publickey($crt);
//从证书中解析公钥
$keyData = openssl_pkey_get_details($pubKey);
$blocks = str_split($mailcont, 1000);
foreach ($blocks as $block) {
//公钥加密
if (!openssl_public_encrypt($block, $chrtext, $keyData['key'])) {
echo "<br/>" . openssl_error_string() . "<br/>";
}
$chrtext .= $chrtext;
}
echo "chrtext-->>>$chrtext<br/>"; $keypath = "/usr/nc-home/webpost/mailbox/d00/1/y/u/yushuai.niu/.user/secretkey/wxd.key";
exec("chmod 777 {$keypath}");
$fp = fopen($keypath, "r");
$key = fread($fp, 8192);
fclose($fp);
$cipher = openssl_pkey_get_private($key);
openssl_private_decrypt($chrtext, $dcyCont, $cipher);
echo "dcyCont-->>>$dcyCont<br/>";
-------------------错误响应----------------
error:0906D06C:PEM routines:PEM_read_bio:no start lineerror:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key sizechrtext-->>>叔��騈蕈50后帞 氧(蘗因T繥r'Um淤€<�/閥f貸f�,�� %vY筊諬�粁`樇昀�煲� �枹��妎5傊(䦟-|Q@祯�)Q耂o瑂駾鉌t饧k[F0鴎叔��騈蕈50后帞 氧(蘗因T繥r'Um淤€<�/閥f貸f�,�� %vY筊諬�粁`樇昀�煲� �枹��妎5傊(䦟-|Q@祯�)Q耂o瑂駾鉌t饧k[F0鴎
dcyCont-->>>
--------------------
证书及私钥 绝对正确,只是openssl_public_encrypt()函数貌似不能循环加密?求解!!!
$crtpath = "/usr/nc-home/webpost/mailbox/d00/1/y/u/yushuai.niu/.user/certkey/wxd.crt";
exec("chmod 777 {$crtpath}");
$fp = fopen($crtpath, "r");
$crt = fread($fp, 8192);
fclose($fp);
$pubKey = openssl_get_publickey($crt);
//从证书中解析公钥
$keyData = openssl_pkey_get_details($pubKey);
$blocks = str_split($mailcont, 1000);
foreach ($blocks as $block) {
//公钥加密
if (!openssl_public_encrypt($block, $chrtext, $keyData['key'])) {
echo "<br/>" . openssl_error_string() . "<br/>";
}
$chrtext .= $chrtext;
}
echo "chrtext-->>>$chrtext<br/>"; $keypath = "/usr/nc-home/webpost/mailbox/d00/1/y/u/yushuai.niu/.user/secretkey/wxd.key";
exec("chmod 777 {$keypath}");
$fp = fopen($keypath, "r");
$key = fread($fp, 8192);
fclose($fp);
$cipher = openssl_pkey_get_private($key);
openssl_private_decrypt($chrtext, $dcyCont, $cipher);
echo "dcyCont-->>>$dcyCont<br/>";
-------------------错误响应----------------
error:0906D06C:PEM routines:PEM_read_bio:no start lineerror:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key sizechrtext-->>>叔��騈蕈50后帞 氧(蘗因T繥r'Um淤€<�/閥f貸f�,�� %vY筊諬�粁`樇昀�煲� �枹��妎5傊(䦟-|Q@祯�)Q耂o瑂駾鉌t饧k[F0鴎叔��騈蕈50后帞 氧(蘗因T繥r'Um淤€<�/閥f貸f�,�� %vY筊諬�粁`樇昀�煲� �枹��妎5傊(䦟-|Q@祯�)Q耂o瑂駾鉌t饧k[F0鴎
dcyCont-->>>
--------------------
证书及私钥 绝对正确,只是openssl_public_encrypt()函数貌似不能循环加密?求解!!!
$blocks = str_split($mailcont, 100);
这也太多段了吧,
chrtext-->>>綔 峲]昖蝚觶Tf)飩峍浰G㖞峚�宴嵢展y5^.╝C\%耴>vgL5�<果F3-碑#tm@吴8� �ZV(巈g�#�.楗�>贞艼雺貫8|蘰�$�/)W穑=�綔 峲]昖蝚觶Tf)飩峍浰G㖞峚�宴嵢展y5^.╝C\%耴>vgL5�<果F3-碑#tm@吴8� �ZV(巈g�#�.楗�>贞艼雺貫8|蘰�$�/)W穑=�
dcyCont-->>>
而且也没有解密出来啊,
您能不能给个分段加密和对应解密的实例呢?感激不尽啊。
有汉字的话这么切会不会一个汉字给切成了两块?导致无法解密? 你可以用英文试一下的,如果英文没问题那就证实我的想法是正确的.可以先将汉字做一个编码,然后在解码后再进行还原,不过这增加了字符的长度...不好意思,我跟你一样对这个openssl_public_encrypt 很陌生,所以也就没有实例提供了.
----------php code---------$mailcont = "邮件正文………超过1024字节………邮件正文";
$mailcont_english = "mail content………more than 1024 KB………mail content";
$crtpath = "/usr/nc-home/webpost/mailbox/d00/1/y/u/yushuai.niu/.user/certkey/wxd.crt";
exec("chmod 777 {$crtpath}");
$fp = fopen($crtpath, "r");
$crt = fread($fp, 8192);
fclose($fp);
$pubKey = openssl_get_publickey($crt);
//从证书中解析公钥
$keyData = openssl_pkey_get_details($pubKey);
$blocks = str_split($mailcont, 100);
$decodes = array();
foreach ($blocks as $block) {
//公钥加密
if (!openssl_public_encrypt($block, $chrtext, $keyData['key'])) {
echo "<br/>" . openssl_error_string() . "<br/>";
}
$decodes[] = $chrtext;
$chrtext .= $chrtext;
}
echo "chrtext-->>>$chrtext<br/>";$keypath = "/usr/nc-home/webpost/mailbox/d00/1/y/u/yushuai.niu/.user/secretkey/wxd.key";
exec("chmod 777 {$keypath}");
$fp = fopen($keypath, "r");
$key = fread($fp, 8192);
fclose($fp);
$cipher = openssl_pkey_get_private($key);
foreach($decodes as $decode){
openssl_private_decrypt($decode, $dcyCont, $cipher);
$dcyCont .= $dcyCont;
}echo "dcyCont-->>>$dcyCont<br/>";---------中文结果--------
chrtext-->>>€-扉�弻Eげ竄黹���蘂蔁^柮��入X勝>~稍礘eD@:�弿瀭歀�/詣劷�勔:I飤虄�Xo.mX-"/0奌m涫濍 ld犔倚b��<摸ィ��#汻€-扉�弻Eげ竄黹���蘂蔁^柮��入X勝>~稍礘eD@:�弿瀭歀�/詣劷�勔:I飤虄�Xo.mX-"/0奌m涫濍 ld犔倚b��<摸ィ��#汻
dcyCont-->>>岄叆鑴嗕笉鐨紝鏄崈鐧惧勾鏉ヤ汉浠枩鐖辩殑椋熷搧銆倢閰ヨ剢涓嶇毊锛屾槸鍗冪櫨骞存潵浜轰滑鍠滅埍鐨勯鍝併€�
---------英文结果--------
chrtext-->>>!�騅�|戟蚝_瑧媁yr鲟=Hm櫖�騈螨\7◣<伂<槼=,o@嘃�奭活湀旵以嚓��dQ �#6緲0eI�0礹N釫�-V浡恿F.N霠瞯怵k�瘉)岾!�騅�|戟蚝_瑧媁yr鲟=Hm櫖�騈螨\7◣<伂<槼=,o@嘃�奭活湀旵以嚓��dQ �#6緲0eI�0礹N釫�-V浡恿F.N霠瞯怵k�瘉)岾
dcyCont-->>> Linux RedHat 9 Linux RedHat 9
---------
求各位大侠正解!!!
* $crtpath 证书[绝对路径/证书名称]
* $mailcont 需要加密的内容
* $sign 分界符
* 需要 splitCN(),subCNchar(),is_utf8()三个函数
**/
function public_encrypt($crtpath, $mailcont, $sign = false) {
$fp = fopen($crtpath, "r");
$crt = fread($fp, 8192);
fclose($fp);
$pubKey = openssl_get_publickey($crt);
//从证书中解析公钥
$keyData = openssl_pkey_get_details($pubKey);
$blocks = $this->splitCN($mailcont, 0, 30);
$chrtext = null;
$encodes = array ();
foreach ($blocks as $n => $block) {
if (!openssl_public_encrypt($block, $chrtext, $keyData['key'])) {
echo "<br/>" . openssl_error_string() . "<br/>";
}
$encodes[] = $chrtext;
}
$chrtext = implode($sign, $encodes);
return $chrtext;
} /** 私钥解密
* $keypath 私钥[绝对路径/私钥名称]
* $chrtext 需要解密的内容
* $sign 分界符
**/
function private_decrypt($keypath, $chrtext, $sign = false) {
$fp = fopen($keypath, "r");
$key = fread($fp, 8192);
fclose($fp);
$cipher = openssl_pkey_get_private($key);
$decodes = explode($sign, $chrtext);
$strnull = "";
$dcyCont = null;
foreach ($decodes as $n => $decode) {
openssl_private_decrypt($decode, $dcyCont, $cipher);
$strnull .= $dcyCont;
}
return $strnull;
} /** 截取汉字 *
* $str 要截取的字符串
* $start 截取的起始位置
* $length 要截取的长度
* $charset 字符串编码
**/
function subCNchar($str, $start = 0, $length, $charset = "utf-8") {
if (strlen($str) <= $length)
return $str; $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match); $slice = join("", array_slice($match[0], $start, $length)); return $slice;
} /** 将字符串按规定长度分段截取并放入数组
* $cont 要处理的字符串
* $n 起始位置
* $subnum 限定的截取长度(字节)
**/
function splitCN($cont, $n = 0, $subnum) {
//$len = strlen($cont) / 3;
for ($i = $n; $i < strlen($cont); $i += $subnum) {
$res = $this->subCNchar($cont, $i, $subnum);
if (!empty ($res)) {
$arrr[] = $res;
}
}
return $arrr;
}
//------------具体调用-------------
/**************** 公钥加密 ****************/
$crtpath = "/path/xxx.crt";
//邮件正文段落连接符
$sign = "%^&_&^%";
//加密
$chrtext = $referen->public_encrypt($crtpath,$mailcont,$sign);
//-------------私钥解密------------
$keyname = "xxx.key";
$keypath = "/path/" . $keyname;
$dcyCont = $referen->private_decrypt($keypath,$phcont,$sign);
$chrtext = base64_encode($chrtext);
和private_decrypt()函数中加入:
$chrtext = base64_decode($chrtext);
不然加密数据在传输的过程中会丢失数据。