一、常用加密类型分类

1、对称加密:采用单钥对信息进行加密和解密,即同一个秘钥既可以对信息进行加密,也可以进行解密。此类型称之为对称加密。特点速度快,常用于对大量数据信息或文件加密时使用。常用例子:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES。

2、非对称加密:采用公钥和私钥双钥形式对信息进行加密和解密,其中公钥和私钥是成对存在的,即使用公钥对信息加密后的密文只用使用其相应的私钥才可以进行解密,反之也毅然。相对对称加密而言叫做非对称加密。安全性非常好,但加密和解密耗时较长,比较适用于小数据量加密解密。常用例子:数字签名、RSA。

加密介质 公钥私钥对或者证书

公钥加密  私钥解密

私钥签名  公钥验签

公钥私钥

一般格式是.pem的

公钥内容(注意格式不能变)
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmA6wtOBV6O+zwfteu9fKrF1iA
H1q28yMiWDsb2iScRG3JZJWsDz+hVP9Qp7w3Bzqkt0PaC+XNCFVGksqEXZ0lQGgQ
vz4626ibXRt2eLOAgKIrUUbVTccQJhGhAOqFlPSgxdWx/B1cSRp73Lt89WfNISh/
/A81649guFe3PII2wwIDAQAB
-----END PUBLIC KEY-----
私钥内容
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCmA6wtOBV6O+zwfteu9fKrF1iAH1q28yMiWDsb2iScRG3JZJWs
Dz+hVP9Qp7w3Bzqkt0PaC+XNCFVGksqEXZ0lQGgQvz4626ibXRt2eLOAgKIrUUbV
TccQJhGhAOqFlPSgxdWx/B1cSRp73Lt89WfNISh//A81649guFe3PII2wwIDAQAB
AoGAOggcnq31LAZYm/Tq9jj5O/9sK1VKg5tYU8Ad4W2O0KVG71hezYeDCaVJnmsT
6vR29m8to8H28YYRMRtM+ZozvOp1Tk6t+Ng+fcFt8I/bzb+ncq/gznm01gOZ0ihp
zljIhsmH4v7Cnp5/WNkdbrwR0XAXqgIGcMQhENCvQy5WeTECQQDa0XCgC0iTeL5V
MhR4SuZRxHACs7iDuoppDWsu0VgPS+mVrO8Fb2574aR/8y8q5NwJ5XZpG3p+Iie7
CNipZtnZAkEAwjlGbFLEFWT5/DzQFdZlx7A8YbM8UYEnxA7t7nt730UcDML3QPNO
3QMe8Srdrm9B7eRl75t0atjhOgIF26U3+wJBAIVX9hsBZUPA47PFJeY8NmiDnYJ4
BKv5hBkKfVN1bQU9TGXSkYGtaxWA5p62EftApbo+I89fWGD+7VkzxdxNedkCQATh
iZqJTfI3smybXqNd2vr0u9+8sGRf+Y7czS/0HH3U78qGT85rDu1Q+cMXz7BljWOc
HM+zuW5B+w8JI/qMIWcCQDEB/MsM4THgEQIuHStNJw2knA2ah3kQi6jESMQbGflK
YKJlRNwrz+FfwIWQAo1XVf9IdmNjVsDXXosQKInIPZo=
-----END RSA PRIVATE KEY-----

证书规范

证书也是用加密解密算法,只不过多了一些认证参数,比如国家地区等

x509,公钥证书,只有公钥。
p7,签名或加密。可以往里面塞x509,同时没有签名或加密内容。
p12,含有私钥,同时可以有公钥,有口令保护。
p7的作用就是电子信封。
X509是基本规范
P7和P12是两个实现规范,P7是数字信封,P12是带有私钥的证书规范。
x509是数字证书的规范,P7和P12是两种封装形式。比如说同样的电影,有的是avi格式,有的是mpg,大概就这个意思。

P7一般是把证书分成两个文件,一个公钥一个私钥,有PEM和DER两种编码方式。PEM比较多见,就是纯文本的,P7一般是分发公钥用,看到的就是一串可见字符串,扩展名经常是.crt,.cer,.key等。DER是二进制编码。
P12是把证书压成一个文件,.pfx。主要是考虑分发证书,私钥是要绝对保密的,不能随便以文本方式散播。所以P7格式不适合分发。.pfx中可以加密码保护,所以相对安全些。
在实践中要中,用户证书都是放在USBKey中分发,服务器证书经常还是以文件方式分发。服务器证书和用户证书,都是X509证书,就是里面的属性有区别。

X509 是证书规范
PKCS#7 是消息语法 (常用于数字签名与加密)
PKCS#12 个人消息交换与打包语法 (如.PFX .P12)打包成带公钥与私钥

看着有点费劲。。只需要记住x509就是个公钥,pkcs12就是私钥,和私钥不同的是这个私钥是加密的,需要密码才能获取到私钥内容

总结以上证书和密钥都可以对数据进行加密解密以及验签,只是使用的方式不同而已。。。

公私钥的生成

(也可以在linux用openssl命令生成)

//生成密钥

$config = array(
"digest_alg" => "sha512",
"private_key_bits" =>2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
); //创建密钥对
$res = openssl_pkey_new($config);
//生成私钥
openssl_pkey_export($res,$priKey);
//生成公钥
$pubKey = openssl_pkey_get_details($res)['key']; file_put_contents('private.key',$priKey);
file_put_contents('public.key',$pubKey);

证书的生成

$dn = array(
"countryName" => "GB",
"stateOrProvinceName" => "Somerset",
"localityName" => "Glastonbury",
"organizationName" => "The Brain Room Limited",
"organizationalUnitName" => "PHP Documentation Team",
"commonName" => "Wez Furlong",
"emailAddress" => "wez@example.com"
); $config = array(
"digest_alg" => "sha512",
"private_key_bits" =>2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
); //创建密钥对
$res = openssl_pkey_new($config); //证书
$csr = openssl_csr_new($dn,$res); //证书签名
$usercert = openssl_csr_sign($csr, null, $res, 365); //导出证书公钥
openssl_x509_export_to_file($usercert,'csr.public.cert');
//导出证书私钥
openssl_pkcs12_export_to_file($usercert,'csr.private.pfx',$res,'123');

rsa的公私钥加密解密

//公钥加密

//$pubKey = file_get_contents('public.key');

//返回资源型的
$pubKey = openssl_pkey_get_public(file_get_contents('public.key'));
openssl_public_encrypt('123456',$crypted,$pubKey,OPENSSL_PKCS1_PADDING); base64_encode($crypted); //私钥解密 //$priKey = file_get_contents('private.key'); //返回资源型的
$priKey = openssl_pkey_get_private(file_get_contents('private.key')); $crypted = base64_decode($crypted); openssl_private_decrypt($crypted,$decrypted,$priKey,OPENSSL_PKCS1_PADDING);
//参数的意义: 密文数据, 加密解密后的数据,密钥,加密解密的填充

证书的加密解密

//加密
$pubKey = file_get_contents('csr.public.cert'); $pubKey = openssl_x509_read($pubKey); openssl_public_encrypt('1234',$crypted,$pubKey,OPENSSL_PKCS1_PADDING);
//参数的意义: 密文数据, 加密解密后的数据,密钥,加密解密的填充
$data =  base64_encode($crypted);

//解密
$data = base64_decode($data); openssl_pkcs12_read(file_get_contents('csr.private.pfx'),$priKey,'123'); openssl_private_decrypt($data,$decrypt,$priKey['pkey'],OPENSSL_PKCS1_PADDING);
//参数的意义: 密文数据, 加密解密后的数据,密钥,加密解密的填充

签名以及验签(证书以及密钥一样的)

//签名
openssl_sign($crypted, $sign, $priKey, OPENSSL_ALGO_SHA1); //验签
$res = openssl_verify($crypted, $sign, $pubKey,OPENSSL_ALGO_SHA1);

另一种验签MD5或者sha1

//对请求的字符串进行加密 当做签名 发送过去
$username = 'liudehua';
$age = 23;
$stamp = time(); $str = ['username'=>$username,'age'=>$age,'stamp'=>$stamp]; //字典排序
ksort($str); $str = http_build_query($str); $sign = md5($str); $str .='&sign='.$sign; echo $str; //接受到数据后开始进行验签 $age = $_GET['age']; $stamp = $_GET['stamp']; $username = $_GET['username']; $sign = $_GET['sign']; $str = ['age'=>$age,'stamp'=>$stamp,'username'=>$username]; ksort($str); $str = http_build_query($str); $check_sign = md5($str); echo $sign;
echo '<br>'; echo $check_sign;

转: http://lampol-blog.com/detail/aid/NzQ5NjhEVEJpcU9CV3hoRXRGZ1RxdmxmUFQ1bWNhcURrWFlGZHp6cQ%3D%3D

相关 : https://www.cnblogs.com/fps2tao/p/8685294.html

支付接口中常用的加密解密以及验签rsa,md5,sha的更多相关文章

  1. C#开发中常用的加密解密方法

    转载自:https://www.cnblogs.com/bj981/p/11203711.html C#开发中常用的加密解密方法 相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天 ...

  2. password学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)

    Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又称为数字摘要(Digital Digest). 它是一个唯一相应一个消息或文本的固定长度 ...

  3. RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

    原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 C#在using System.Security.Cryptograph ...

  4. C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic

    C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider DESCryptoS ...

  5. js rsa sign使用笔记(加密,解密,签名,验签)

    你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...

  6. Java RSA 加密 解密 签名 验签

    原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...

  7. 转 关于Https协议中的ssl加密解密流程

    关于Https协议中的ssl加密解密流程 2016年09月28日 09:51:15 阅读数:14809 转载自:http://www.cnblogs.com/P_Chou/archive/2010/1 ...

  8. Java常用的加密解密类(对称加密类)

    Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...

  9. RSA加密解密与加签验签

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...

随机推荐

  1. [转] Compile、Make和Build的区别

    针对Java的开发工具,一般都有Compile.Make和Build三个菜单项,完成的功能的都差不多,但是又有区别.   编译,是将源代码转换为可执行代码的过程.编译需要指定源文件和编译输出的文件路径 ...

  2. Run Test Case on Spark

        今天有哥们问到怎样对Spark进行单元測试.如今将Sbt的測试方法写出来,例如以下:     对Spark的test case进行測试的时候能够用sbt的test命令:     一.測试所有t ...

  3. JavaIO流原理之常用字节流和字符流详解以及Buffered高效的原理

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html      Java的流体系十分庞大,我们来看看体系图:        这么庞大的体系里面 ...

  4. Oracle11g口令过期的解决

    今天发现服务器上的Oracle11g突然登录不上去了,提示ORA-28002错误,说是口令过期. 1. 用DBA账户登录SQL PLUS.我用的是SYS. 2. 系统会提示口令失效,但是会马上让你重置 ...

  5. Java通过Fork/Join来优化并行计算

    Java代码: package Threads; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Recur ...

  6. PRM路径规划算法

    路径规划作为机器人完成各种任务的基础,一直是研究的热点.研究人员提出了许多规划方法:如人工势场法.单元分解法.随机路标图(PRM)法.快速搜索树(RRT)法等.传统的人工势场.单元分解法需要对空间中的 ...

  7. countif

    countif(range,criteria) range:表示要计算其中非空单元格数目的区域 criteria:表示统计条件 eg:求得分大于等于80分小于90分的学生数

  8. docker-machine为节点安装指定版本的docker-ce的思路

    对于指定版本的问题,翻遍官网文档和github上的issue,始终没有一个好的回答,而且该产品的开发人员不知道为什么总不正面提供方法,也许是为了推广新版本, 但是这样真的好吗?docker swarm ...

  9. Linux软硬连接

     曾经对软硬连接一直搞不明白,关键是怕操作错误. 硬链接不能跨区实现连接,硬链接是对原始文件的镜像,同一个inode,软连接是快捷方式,inode保存的是快捷方式的.原始文件删除,导致软连接文件无效. ...

  10. Ubuntu与Windows7双系统下, 系统时间不一致的问题

    Ubuntu使用的UTC时间, 而Windows使用的是Local Time, 就导致每次切换系统后, Windows时间都会正好晚8个小时. 有两种解决办法, 一个是修改Ubuntu, 另一个是修改 ...