常见加密方式

对称加密

对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。

对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。

对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

优点:算法公开、计算量小、加密速度快、加密效率高、可逆

缺点:双方使用相同钥匙,安全性得不到保证

现状:对称加密的速度比公钥加密快很多,在很多场合都需要对称加密,

算法: 在对称加密算法中常用的算法有:DES(数据加密标准,速度较快,适用于加密大量数据的场合)、3DES、AES(基于排列和置换运算)等。

非对称加密

非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。非对称加密的缺点是加解密速度要远远慢于对称加密。不适合进行大量数据的加密操作

常见的非对称加密算法有:RSA、ECC(椭圆曲线密码编码学)、DSA(数字签名算法,是一种标准的 DSS(数字签名标准))

ECC与RSA的比较

ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面:

Ø  抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。

Ø  计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。

Ø  存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。

Ø  带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。

 

Hash算法(摘要算法)

Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA

MD5和SHA比较

Ø  对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。

Ø  对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。

Ø  速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

加密算法的选择

由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。

对称加密算法不能实现签名,因此签名只能非对称算法

由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

 

RSA 签名机制

1、 组合发送数据

2、 使用发送数据和商户私钥生成基于 SHA1 的 RSA 数字签并将签名整合到发送数据中

3、 将签名使用随机生成的aeskey进行aes加密

4、 将aeskey使用rsa加密

5、 发送数据

MD5签名机制:

在MD5签名时,需要私钥参与签名。

MD5的私钥是以英文字母和数字组成的32位字符串。商户可提供给由第三方初始化到系统中。数据交互之前进行验签操作

公钥加密算法RSA

openssl_pkey_get_private ( mixed $key [, string$passphrase = “” ] ) 此方法用于加载私钥。
$key接受的参数可以是私钥文件(协议+文件路径)或者私钥的内容。如上面代码里的方式是后者,如果换成第一种方式则是:
$privatekey = openssl_pkey_get_private(“file://$privatekeyFile”, $passphrase);
$passphrase参数为私钥的密码,如果私钥没有密码的话,可以不传或者传空。 此外,这个方法还有个别名:openssl_get_privatekey

openssl_digest ( string $data , string $method [, bool$raw_output = false ] ) 此方法用于对数据进行摘要计算。
$data是需要生成摘要的数据。
$method是生成摘要的算法。
$raw_output表示是否返回原始数据,如果为false(默认)的话则返回binhex编码后的数据。

事实上摘要的生成可以不使用openssl的这个方法,因为其实生成摘要就是对数据进行hash,我们可以用以下代码取代摘要生成部分: <preclass="brush:php;gutter:true;first-line:1;"> if (function_exists(‘hash’)){ $digest = hash($digestAlgo, $data, TRUE); } elseif (function_exists(‘mhash’)){ $digest =mhash(constant(“MHASH_” . strtoupper($digestAlgo)), $data); }$digest = bin2hex($digest); </pre> 使用hash方法有个好处就是支持的算法要比openssl_digest多很多。具体支持的算法可以调用hash_algos()方法查看。

openssl_sign ( string $data , string &$signature ,mixed $priv_key_id [, int $signature_alg = OPENSSL_ALGO_SHA1 ] ) 此方法用于对数据进行签名。 $data为需要进行签名的数据,一般为摘要。 $signature为调用成功后生成的签名。 $priv_key_id是openssl_pkey_get_private方法返回的资源标识符。$signature_alg是签名使用的算法,默认为OPENSSL_ALGO_SHA1。支持的算法请参照手册。

为什么要先生成摘要再签名?因为用私钥签名是比较耗时耗性能的,特别是在数据比较大的情况下。而摘要算法可以很快的生成一串很短的字符串。用这串东西去签名就快很多了。

生成摘要的算法以及验签的算法必须跟签名时保持一致。

这里,我们又学习到两个新的方法:

openssl_pkey_get_public ( mixed $certificate ) 这个方法用于加载公钥。
$certificate为公钥的内容。 同样,这个方法也有个别名:此外,这个方法还有个别名:openssl_get_publickey

openssl_verify ( string $data , string $signature ,mixed $pub_key_id [, int $signature_alg = OPENSSL_ALGO_SHA1 ] ) 此方法用于验签。 $data为用于生成签名的数据。 $signature为上一步生成的签名。 $pub_key_id为加载的公钥。 $signature_alg为验签的算法。对应签名的算法。

openssl_public_encrypt ( string $data , string&$crypted , mixed $key [, int $padding = OPENSSL_PKCS1_PADDING ] ) 此方法用于使用公钥进行加密。
$data为需要加密的数据。
$crypted为加密后的数据。
$key为公钥。
$padding为填充方式,默认为OPENSSL_PKCS1_PADDING,还可以是如下几个值:OPENSSL_SSLV23_PADDING, OPENSSL_PKCS1_OAEP_PADDING,OPENSSL_NO_PADDING

openssl_private_decrypt ( string $data , string&$decrypted , mixed $key [, int $padding = OPENSSL_PKCS1_PADDING ] ) 此方法用于使用私钥进行解密。
$data为需要解密的数据。
$decrypted为解密后的数据。
$key为私钥。
$padding为填充方式。

目前还没弄清楚各种填充方式的使用场景。

公钥加密的数据只能用私钥进行解密,而用私钥加密的数据只能用公钥进行解密。上面的代码描述的是前者。而后者对应的方法是:openssl_private_encryptopenssl_public_decrypt。这两个方法跟上面类似,这里不作解释。

事实上,在HTTPS里,数据的加密和解密并不是直接使用公钥和私钥进行的,而是使用另外一个密钥进行对称加密跟解密。公钥跟私钥是用来加密跟解密这个密钥的。为什么要这样做了,理由跟上面讲到的签名一样,用公钥加密大数据是比较耗时耗性能的。

php生成签名默认算法:OPENSSL_ALGO_SHA1 验签采用同种方式.对接java的接口时,对方采用md5.可用md5算法来验签

填充方式:默认为OPENSSL_PKCS1_PADDING,还可以是如下几个值:OPENSSL_SSLV23_PADDING, OPENSSL_PKCS1_OAEP_PADDING, OPENSSL_NO_PADDING。

三方java公钥转换格式代码:
function x509ToPem($data) {
    $pem = chunk_split($data, 64, "\n");
    $pem = "-----BEGIN PUBLIC KEY-----\n".$pem."-----END PUBLIC KEY-----\n";
    return $pem;

 

 

参考自:

http://blog.csdn.net/u014774781/article/details/48581583

https://blog.csdn.net/junerun/article/details/88656505

 

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值