php中rsa加密及解密和签名及验签

  加密的内容长度限制为密钥长度少11位,如128位的密钥最多加密的内容为117个长度。

  公钥加密

    $public_content=file_get_contents(公钥路径);

    $public_key=openssl_get_publickey($public_content);

    

    $original_str='待加密的内容';

    $original_arr=str_split($original_str,117);  //折分

    foreach($original_arr as $o)

    {

      $sub_enc=null;

      openssl_public_encrypt($o,$sub_enc,$public_key);

      $original_enc_arr[]=$sub_enc;

    }

    openssl_free_key($public_key);

    $original_enc_str=base64_encode(implode('',$original_enc_arr));//最终网络传的密文

  私钥解密

    $private_content=file_get_contents(私钥路径);

    $private_key=openssl_get_privatekey($private_content);

    $original_enc_str=base64_decode(密文);

    $orig_dec_str='';

    for($i=0;$i<strlen($original_enc_str)/128;$i++)

    {

       $data=substr($original_enc_str,$i*128,128);

       openssl_private_decrypt($data,$decrypt,$private_key);

       $orig_dec_str.=$decrypt;

    }

    $orig_dec_str为最后解密出来的。

  注:私钥加密及公钥解密同理。

-----------------------------------------------------------------------------------------------------------------------

  私钥签名

    $private_content=file_get_contents(私钥路径);

    $private_key=openssl_get_privatekey($private_content);

    $original_str='';//原数据

    openssl_sign($original_str,$sign,$private_key);

    openssl_free_key($private_key);

    $sign=base64_encode($sign);//最终的签名    

  公钥验签

    $public_content=file_get_contents(公钥路径);

    $public_key=openssl_get_publickey($public_content);

    $sign=base64_decode($sign)'';//得到的签名

    $original_str='';得到的数据

    $result=(bool)openssl_verify($original_str,$sign,$public_key);

    openssl_free_key($public_key);

    $result为真时签验通过,假时未通过