热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

rsa加密解密方法

rsa算法介绍验证签名的几个算法define(OPENSSL_ALGO_SHA1,1);define(OPENSSL_ALGO_MD5,2);define(

       rsa算法介绍

      验证签名的几个算法

define ('OPENSSL_ALGO_SHA1', 1);
define ('OPENSSL_ALGO_MD5', 2);
define ('OPENSSL_ALGO_MD4', 3);
define ('OPENSSL_ALGO_MD2', 4);
define ('OPENSSL_ALGO_DSS1', 5);
define ('OPENSSL_ALGO_SHA224', 6);
define ('OPENSSL_ALGO_SHA256', 7);
define ('OPENSSL_ALGO_SHA384', 8);
define ('OPENSSL_ALGO_SHA512', 9);
define ('OPENSSL_ALGO_RMD160', 10);

    Alipay支付接口的rsa加密解密函数:

    protected function getSignContent($params) {
ksort($params);

$stringToBeSigned = "";
$i = 0;
foreach ($params as $k => $v) {
if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {

// 转换成目标字符集
$v = $this->characet($v, $this->postCharset);

if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
}

unset ($k, $v);
return $stringToBeSigned;
}

/**
* 读取密钥,并生成rsa签名
* @param $data 签名数据
* @return string
* @throws AuthException
*/
protected function sign($data) {
if(isEmpty($this->rsaPrivateKeyFilePath)){
$priKey = $this->rsaPrivateKey;
$result = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($priKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
}else {
$priKey = file_get_contents($this->rsaPrivateKeyFilePath);
$result = openssl_get_privatekey($priKey);
}

if(!$result){
throw new AuthException(false, "您使用的私钥格式错误,请检查RSA私钥配置");
}

openssl_sign($data, $sign, $result);

if(!isEmpty($this->rsaPrivateKeyFilePath)){
openssl_free_key($result);
}

$sign = base64_encode($sign);

return $sign;
}

/*公钥验签操作*/
function verify($data, $sign, $rsaPublicKeyFilePath) {
if(isEmpty($this->alipayPublicKey)){

$pubKey= $this->alipayrsaPublicKey;
$res = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($pubKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
}else {
//读取公钥文件
$pubKey = file_get_contents($rsaPublicKeyFilePath);
//转换为openssl格式密钥
$res = openssl_get_publickey($pubKey);
}

($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');


$result = (bool)openssl_verify($data, base64_decode($sign), $res);


if(!isEmpty($this->alipayPublicKey)) {
//释放资源
openssl_free_key($res);
}

return $result;
}

public function rsaEncrypt($data, $rsaPublicKeyPem, $charset) {
//读取公钥文件
$pubKey = file_get_contents($rsaPublicKeyPem);
//转换为openssl格式密钥
$res = openssl_get_publickey($pubKey);
$blocks = $this->splitCN($data, 0, 30, $charset);
$chrtext = null;
$encodes = array();
foreach ($blocks as $n => $block) {
if (!openssl_public_encrypt($block, $chrtext , $res)) {
echo "
" . openssl_error_string() . "
";
}
$encodes[] = $chrtext ;
}
$chrtext = implode(",", $encodes);

return $chrtext;
}

public function rsaDecrypt($data, $rsaPrivateKeyPem) {
//读取私钥文件
$priKey = file_get_contents($rsaPrivateKeyPem);
//转换为openssl格式密钥
$res = openssl_get_privatekey($priKey);
$decodes = explode(',', $data);
$strnull = "";
$dcyCOnt= "";
foreach ($decodes as $n => $decode) {
if (!openssl_private_decrypt($decode, $dcyCont, $res)) {
echo "
" . openssl_error_string() . "
";
}
$strnull .= $dcyCont;
}
return $strnull;
}


PHP版本的AES加密实现

/**
* AES加密解密类
* Class Encripty
*/
class AES{
/**
* 加密方法
* @param string $str
* @return string
*/
public function encrypt($str,$screct_key){
//AES, 128 模式加密数据 CBC
$screct_key = base64_decode($screct_key);
$str = trim($str);
$str = $this->addPKCS7Padding($str);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),1);
$encrypt_str = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC);
return base64_encode($encrypt_str);
}

/**
* 解密方法
* @param string $str
* @return string
*/
public function decrypt($str,$screct_key){
//AES, 128 模式加密数据 CBC
$str = base64_decode($str);
$screct_key = base64_decode($screct_key);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),1);
$encrypt_str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC);
$encrypt_str = trim($encrypt_str);

$encrypt_str = $this->stripPKSC7Padding($encrypt_str);
return $encrypt_str;
}

/**
* 填充算法
* @param string $source
* @return string
*/
public function addPKCS7Padding($source){
$source = trim($source);
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

$pad = $block - (strlen($source) % $block);
if ($pad <= $block) {
$char = chr($pad);
$source .= str_repeat($char, $pad);
}
return $source;
}

/**
* 移去填充算法
* @param string $source
* @return string
*/
public function stripPKSC7Padding($source){
$source = trim($source);
$char = substr($source, -1);
$num = ord($char);
if($num==62)return $source;
$source = substr($source,0,-$num);
return $source;
}
}



推荐阅读
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
  • 技术分享:如何在没有公钥的情况下实现JWT密钥滥用
      ... [详细]
  • 现在很多App在与服务器接口的请求和响应过程中,为了安全都会涉及到加密和解密的问题,如果不加的话就会是明文的,即使加了GZIP也可以被直接解压成明文。如果同时有Android和IO ... [详细]
  • 一、前言个人认为,PHP是世界上为数不多,最人性化的语言。虽然是二次开发、弱类型语言,由CC编写的PHP引擎去解析。但是,其 ... [详细]
  • 我认为我的PHPintall可能有问题.当我尝试这样做时,我得到了Warning:mcrypt_decrypt()[function.mcrypt-decrypt]:Modulei ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 【Python 爬虫】破解按照顺序点击验证码(非自动化浏览器)
    #请求到验证码base64编码json_img_datajson_raw.get(Vimage)#获取到验证码编码 #保存验证码图片到本地defbase64_to_img(bstr ... [详细]
  • php实现文件下载代码一例,
    php教程|php手册php,实现,文件下载,代码,一例,php,实现,文件下载,代码,一例,我们,需要,用到,header,函数,来,发送,php教程-php手册php实现文件下 ... [详细]
  • 从C#Byte数组加载图像,并使用AngularJS将图像放在html标记中我正在使用ByteArrayforms的Image,因为我正在使用以下C#方法转换字节数组publicH ... [详细]
author-avatar
GRIROR格雷尔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有