看完秒懂对称加密、非对称加密、数字签名

对称加密算法

对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。

对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。

不足之处是,交易双方都使用同样钥匙,安全性得不到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。而与公开密钥加密算法比起来,对称加密算法能够提供加密和认证却缺乏了签名功能,使得使用范围有所缩小。在计算机专网系统中广泛使用的对称加密算法有DES和IDEA等。美国国家标准局倡导的AES即将作为新标准取代DES。

常用加密算法有 DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法等等。

在java中,生成秘钥类为 KeyGenerator,秘钥对象类为 SecretKey,首先定义秘钥算法:

public static final StringKEY_ALGORITHM ="AES";

然后生成一个秘钥,代码为:

生成秘钥测试代码为:

执行结果为:

可以看到生成秘钥java中已经有对应方法,使用非常简单。

非对称加密模式有两种,ECB和CBC。ECB模式是分组的模式,CBC是分块加密后,每块与前一块的加密结果异或后再加密。

首先定义两种模式:

public static final String  ECB_CIPHER_ALGORITHM ="AES/ECB/PKCS5Padding";

public static final String  CBC_CIPHER_ALGORITHM ="AES/CBC/PKCS5Padding";

ECB模式的加密解密代码如下:

测试代码为:

运行结果为:

CBC模式需要一个IV(Initialization Value)初始值,对于CBC模式来说,它必须是随机选取并且需要保密的,而且它的长度和密码分组相同(比如:对于AES 128为128位,即长度为16的byte类型数组),定义如下:

public static final byte[]IVPARAMETERS =new byte[] ;

CBC模式加密解密代码为:

测试代码为:

运行结果为:

可以看到,对称加密的使用非常简单。以上就是对称加密的简单使用。

项目代码:https://github.com/guoyb1990/btc-demo.git

非对称加密算法

非对称加密算法是一种密钥的保密方法。

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。

另一方面,甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;乙方再用自己的私匙对数据进行验签。

甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。 非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。

非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。

JDK6以上都支持非对称加密算法,非对称加密需要一对公私钥,首先生成公私钥对:

测试代码如下:

执行可以看到,运行成功。

非对称可以用私钥加密,然后用公钥解密,方法如下:

测试方法如下:

运行结果如下:

非对称还可以用公钥加密,私钥解密,如下:

测试代码如下:

运行结果如下:

可以看到,非对称加密使用非常简单。

项目代码:https://github.com/guoyb1990/btc-demo.git

数字签名

数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。

数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。

数字签名是非对称密钥加密技术与数字摘要技术的应用。

简单说,非对称加密可以防止数据被破解,数字签名可以防止数据被篡改。

上一篇文章中,已经介绍的基本的非对称加密解密。数字签名算法,JDK只提供了MD2withRSA, MD5withRSA, SHA1withRSA,其他的算法需要第三方包才能支持。

首先看一下签名和验证签名的方法:

在上一篇的非对称加密中,加入下面两个方法:

然后在测试类中验证数字签名,首先建立两套公钥私钥:

然后用签名的私钥进行签名,用加密的公钥进行加密:

最后进行解密和验证:

运行测试方法,结果如下:

以上就是数字签名的简单运用。

我们不仅可以对原文进行加密和签名,为了传输方便,还可以用Base64进行编码解码,这样中间过程的数据也可以进行处理。此处不再演示。

项目代码:https://github.com/guoyb1990/btc-demo.git

END

【推荐书籍】

      扫码购买

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180711B09QFE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券