21,887
社区成员
发帖
与我相关
我的任务
分享
$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/>";
/** 公钥加密
* $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);
$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/>";