加密解密RSA+AES。(一)

数据加密技术的介绍及实践过程。

1.背景

1.1 数据加密

指利用密码技术信息进行加密,实现信息隐蔽,从而达到保证信息安全的目的。按照作用的不同,数据加密的技术分为数据传输加密技术,数据存储加密技术,数据完整性鉴别技术和密钥管理技术。

1.1.1数据传输加密技术:

有线路加密和端对端加密两种。

端对端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。

1.1.2数据存储加密技术:

有密文存储和存取控制两种。前者一般是通过加密算法转换、附加密码、加密模块等方法实现;后者则是对用户资格、权限加以审查和限制,防止非法用户存取数据或合法用户越权存取数据。

1.1. 3数据完整性鉴别技术

目的是对介入信息传送、存取和处理的人的身份和相关数据内容进行验证,一般包括口令、密钥、身份、数据等项的鉴别。系统通过对比验证对象输入的特征值是否符合预先设定的参数,实现对数据的安全保护。

2.算法基本介绍

2.1 加密算法

2.1.1 对称加密

两个用户之间进行信息交流,约定好使用相同的某个密钥。一方将传输的报文用私钥加密,得到密文。另一方接收到密文,用密钥解密,得到明文。这个算法中最重要的就是两人之间的密钥要保密好。同时,由于每两个用户之间就需要一个约定的密钥,因而N个用户之间,就需要N*(N-1)个密钥,这对企业的密钥管理是个难题。

2.1.2 非对称加密

   需要一对密钥,分别是公钥和私钥。如果用公钥加密明文,需要用对应的私钥才能解密明文。如果用私钥对明文加密,则需要用对应的公钥进行解密。当然,因为公钥和私钥是有不同的要求标准的,私钥是比公钥要远远符合密码学安全标准的。所以私钥应当保密并用来解密文件,而公钥可以公布并加密,不应当将二者互换使用。

   甲方生成一对密钥,将公钥通知乙方,乙方利用公钥加密报文,然后发给甲方,甲方接收到密文然后再用私钥解密,得到报文。

因为加密和解密用的是不同的密钥,所以被叫做非对称加密算法。

3.使用场景

3.1 对称加密算法的使用场景。

3.1.1 当客户端与服务器端之间传递数据时,可以使用对称加密算法AES。比对在客户端对用户输入的敏感信息加密传输到服务器端,或者在服务器端加密token传递到客户端。

3.2 非对称加密算法的使用场景。

3.2.1 RSA公钥加密体制

包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。

RSA公钥加密算法逻辑如下:

① (PK,SK)ßKeyGen(λ) 密钥生成算法以安全常数λ作为输入,输出一个公钥PK,和一个私钥SK。安全常数用于确定这个加密算法的安全性有多高,一般以加密算法使用的质数p的大小有关。 λ越大,质数p一般越大,保证密钥有更高的安全性。

在RSA中,密钥生成算法如下:算法首先随机产生两个不同大质数p和q,计算N=pq。随后,计算欧拉函数N0= (p-1)(q-1)。接下来,算法随机选择一个小于N0的整数e,并计算e关于的模反元素d。最后,公钥为PK=(N, e),私钥为SK=(N,
d)。

② (CT) ßEncrypt(PK,M) 加密算法以公钥PK和待加密的消息M作为输入,输出密文CT。

③ MßDecrypt(SK,CT)
解密算法以私钥SK和密文CT作为输入,输出消息M。

3.2.2 RSA签名算法

结合非对称加密算法和数字摘要算法。还包含如下3个算法:KeyGen(密钥生成算法),Sign(签名算法),Verify(验证算法)。

(补充:数字摘要算法,例如MD5,用散列算法对报文进行摘要,得到固定长度(128位)的密文,这一串密文亦被称作数字指纹。因为不同的报文得到的摘要,结果不同,而相同的报文得到的摘要必定相同。因而常用于签名验证。)

RSA签名算法逻辑如下:

① (PK,SK)ßKeyGen(λ)密钥生成算法同样以安全常数λ作为输入,输出一个公钥PK和一个私钥SK。

② óßSign(SK,M)签名算法以私钥SK和待签名的消息M作为输入参数,输出签名ó。在RSA签名中,签名算法直接输出签名为ó。

③ bßVerify(PK,
ó,M)验证算法以公钥PK,签名ó以及消息M作为输入,输出一个比特值b。b=1意味着验证通过。b=0意味着验证不通过。在RSA签名中,验证算法首先计算,随后对比M’与M,如果相等,则输出b=1,否则输出b=0。

在签名算法中,私钥用于对数据进行签名,公钥用于对签名进行验证。这也可以直观地进行理解:对一个文件签名,当然要用私钥,因为我们希望只有自己才能完成签字。验证过程当然希望所有人都能够执行,大家看到签名都能通过验证证明确实是我自己签的。

4.Demo

客户端加密过程主要分为以下三个步骤:1.客户端随机产生AES的密钥;2.对身份证信息(重要信息)进行AES加密;3.通过使用RSA对AES密钥进行公钥加密。

这样在传输的过程中,即时加密后的AES密钥被别人截取,对其也无济于事,因为他并不知道RSA的私钥,无法解密得到原本的AES密钥,就无法解密用AES加密后的重要信息。
我们这里模拟客户端和服务端,对算法逻辑进行验证。

package RSAAES;
import sun.security.krb5.internal.crypto.Aes128;
public class TestEncrypt {
    public static void main(String[] args) throws Exception {
        String key = AESUtils.generateKey();
        String name = "wujj";
        String idCard = "444200002939402";
        String encryptName = AESUtils.encryptData(key, name);
        String encryptCard = AESUtils.encryptData(key, idCard);
        String encryptKey = RSAUtils.encryptByPublicKey(key);
        System.out.println("使用RSA加密后的AES密钥: " + encryptKey);
        System.out.println("使用AES加密后的Name " + encryptName + "  使用AES加密后的Card :" + encryptCard);
    }
}

执行结果如下:
加密解密RSA+AES。(一)_第1张图片
服务端使用RSA0+ AES对重要信息进行解密

服务端解密过程主要分为以下两个步骤:1.对加密后的AES密钥进行RSA私钥解密,拿到密钥原文;2.对加密后的重要信息进行AES解密,拿到原始内容。

package RSAAES;

public class Demo {
    public static void main(String[] args) throws Exception {
        String encryptKey = "W42a322SBoRZKTSLaczF74uUyAxGMFZSgvZWeWnEf+v7AlfTYo8Ie0JLUJpXMMfCjt3i+AlX+8M+Wd1FiEgwgkXwaObvqhqLdwYEybHdyYLE6XcUjn/vqSl/Z3jhKrYi5H+X6RZ70BVYDXki2q4vLPOfL8rECZywRPnl1+tAI7E=";
        String encryptName = "Y5zy9Pf6h8jx/xTETt/2BA==";
        String encryptCard = "7XVmAnoZsqq44aEOySVlsg==";
        //解密
        String key = RSAUtils.decryptByPrivateKey(encryptKey);
        String name = AESUtils.decryptData(key,encryptName);
        String idCard = AESUtils.decryptData(key,encryptCard);
        System.out.println("使用RSA解密后的AES密钥: " + encryptKey);
        System.out.println("使用AES解密后的Name " + name + "  使用AES解密后的Card :" + idCard);

    }
}

加密解密RSA+AES。(一)_第2张图片
这样我们就粗略地验证了加密解密算法,那代码里的算法工具类RSAUtils和AESUtils的逻辑到底是怎么样的呢?有兴趣的可以去看下一篇博客。

你可能感兴趣的:(Java,加密解密)