快捷搜索:

数据加密算法详解

近来公司用到RSA数据加密传输,本人也只会应用,并不知其道理,刚好本日在csdn看到一位大年夜牛的博客写得很到位,遂搬运过来。

>源博客出处:http://blog.csdn.net/chay_chan/article/details/58605605

数据传输加密

在开拓利用历程中,客户端与办事端常常必要进行数据传输,涉及到紧张隐私信息时,开拓者自然会想到对其进行加密,纵然传输历程中被“有心人”截取,也不会将信息泄露。对付加密算法,信托不少开拓者也有所耳闻,比如MD5加密,Base64加密,DES加密,AES加密,RSA加密等等。在这里我主要向大年夜家先容一下我在开拓历程中应用到的加密算法,RSA加密算法+AES加密算法。简单地先容一下这两种算法吧。

RSA

之以是叫RSA算法,是由于算法的三位发现者RSA是今朝最有影响力的公钥加密算法,它能够抵抗到今朝为止已知的绝大年夜多半密码进击,已被ISO保举为公钥数据加密标准,主要的算法道理就不多加先容,假如对此感兴趣的话,建议去百度一下RSA算法。必要懂得的是RSA算法属于非对称加密算法,非对称加密算法必要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,假如用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;假如用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。由于加密和解密应用的是两个不合的密钥,以是这种算法叫作非对称加密算法。简单的说是“公钥加密,私钥解密;私钥加密,公钥解密”。

AES

高档加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采纳的一种区块加密标准。这个标准用来替代本来的DES,已经被多方阐发且广为全天下所应用。颠末五年的甄选流程,高档加密标准由美国国家标准与技巧钻研院(NIST)于2001年11月26日宣布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高档加密标准已然成为对称密钥加密中最盛行的算法之一。

为什么要结合应用这两种算法

假如不清楚非对称算法和对称算法,大概你会问,为什么要结合应用这两种算法,纯真应用一种算法不可吗?这就要结合不合的场景和需求了。

客户端传输紧张信息给办事端,办事端返回的信息不需加密的环境

客户端传输紧张信息给办事端,办事端返回的信息不需加密,例如绑定银行卡的时刻,必要通报用户的银行卡号,手机号等紧张信息,客户端这边就必要对这些紧张信息进行加密,应用RSA公钥加密,办事端应用RSA解密,然后返回一些通俗信息,比如状态码code,提示信息msg,提示操作是成功照样掉败。这种场景下,仅仅应用RSA加密是可以的。

客户端传输紧张信息给办事端,办事端返回的信息需加密的环境

客户端传输紧张信息给办事端,办事端返回的信息需加密,例如客户端登录的时刻,通报用户名和密码等资料,必要进行加密,办事端验证登录信息后,返回令牌token必要进行加密,客户端解密后保存。此时就必要结合这两种算法了。至于全部流程是如何的,鄙人面会逐步经由过程例子向你先容,由于假如一开始就这么多翰墨类的操作,可能会让读者认为一头雾水。

应用RSA加密和解密孕育发生公钥和私钥

孕育发生RSA公钥和密钥的措施有很多,在这里我直接应用我封装好的措施孕育发生,都着末我会将两个算法的对象类馈赠给大年夜家。

/**

* 天生公钥和私钥

*

* @throws Exception

*

*/

public static void getKeys() throws Exception {

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");

keyPairGen.initialize(1024);

KeyPair keyPair = keyPairGen.generateKeyPair();

RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

String publicKeyStr = getPublicKeyStr(publicKey);

String privateKeyStr = getPrivateKeyStr(privateKey);

System.out.println("公钥\r\n" + publicKeyStr);

System.out.println("私钥\r\n" + privateKeyStr);

}

public static String getPrivateKeyStr(PrivateKey privateKey)

throws Exception {

return new String(Base64Utils.encode(privateKey.getEncoded()));

}

public static String getPublicKeyStr(PublicKey publicKey) throws Exception {

return new String(Base64Utils.encode(publicKey.getEncoded()));

}

公钥

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRQZ5O/AOAjeYAaSFf6Rjhqovws78I716I9oGF7WxCIPmcaUa1YuyLOncCCuPsaw69+RMWjdbOBp8hd4PPM/d4mKTOVEYUE0SfxhhDTZaM5CzQEUXUyXy7icQTGR5wBjrbjU1yHCKOf5PJJZZQWB06husSFZ40TdL7FdlBpZ1u1QIDAQAB

私钥

MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJFBnk78A4CN5gBpIV/pGOGqi/CzvwjvXoj2gYXtbEIg+ZxpRrVi7Is6dwIK4+xrDr35ExaN1s4GnyF3g88z93iYpM5URhQTRJ/GGENNlozkLNARRdTJfLuJxBMZHnAGOtuNTXIcIo5/k8klllBYHTqG6xIVnjRN0vsV2UGlnW7VAgMBAAECgYBMoT9xD8aRNUrXgJ7YyFIWCzEUZN8tSYqn2tPt4ZkxMdA9UdS5sFx1/vv1meUwPjJiylnlliJyQlAFCdYBo7qzmib8+3Q8EU3MDP9bNlpxxC1go57/q/TbaymWyOk3pK2VXaX+8vQmllgRZMQRi2JFBHVoep1f1x7lSsf2TpipgQJBANJlO+UDmync9X/1YdrVaDOi4o7g3w9u1eVq9B01+WklAP3bvxIoBRI97HlDPKHx+CZXeODx1xj0xPOK3HUz5FECQQCwvdagPPtWHhHx0boPF/s4ZrTUIH04afuePUuwKTQQRijnl0eb2idBe0z2VAH1utPps/p4SpuT3HI3PJJ8MlVFAkAFypuXdj3zLQ3k89A5wd4Ybcdmv3HkbtyccBFALJgs+MPKOR5NVaSuF95GiD9HBe4awBWnu4B8Q2CYg54F6+PBAkBKNgvukGyARnQGc6eKOumTTxzSjSnHDElIsjgbqdFgm/UE+TJqMHmXNyyjqbaA9YeRc67R35HfzgpvQxHG8GN5AkEAxSKOlfACUCQ/CZJovETMmaUDas463hbrUznp71uRMk8RP7DY/lBnGGMeUeeZLIVK5X2Ngcp9nJQSKWCGtpnfLQ==

很显着,公钥字符串长度对照短,私钥的对照长。天生完密钥后,公钥可以寄放在客户端,纵然被别人知道公钥,也是没有问题的;私钥则必然要保存在办事端。假如到时公司面临人事更改,避免私钥被离职职员泄露,可以从新天生公钥和密钥。

应用公钥加密,私钥解密

这里在客户端模拟加密的环境,对字符串”Beyond黄家驹”应用RSA加密,调用RSAUtils的encryptByPublicKey()措施,输出结果为:

密文: BRFjf3tUqRqlwuP5JtzxZinf7lp+AHuHM9JSabM5BNFDxuUe9+uuO6RpCHVH5PibifqQHzGNsyZn1G9QcIENT9Tbm+PZwAbNUlMPZRDBU1FSnOtY8dBdeW/lJdnY9sJVwNvIBnOLQk66hxRh6R2149dwlgdsGUpWMOMBzcP3vsU=

在办事端,可以应用RSAUtils的decryptByPrivateKey()措施进行解密,现在模拟办事端解密

在这里虽然没有完全模拟数据传输历程,比如说客户端提议一个收集哀求,通报参数给办事端,办事端接管参数并进行处置惩罚,也是为了让大年夜家可以加倍轻易明白,以是这里只是进行简单的模拟。可以看到Android客户端端和Java办事真个RSA加密解密算法是可以互通的,缘故原由是他们所应用到的base64加密类是同等的,以是才可以实现加密和解密的算法互通。

应用到的jar包都是javabase64-1.3.1.jar,信托不少人都知道,java中有自带的Base64算法类,然则安卓中却没有,之前呈现的环境是,应用的Base64类不统一,比如在安卓客户端开拓应用的Base64算法是应用第三方供给的jar包,而java办事端中应用的是JDK自带的Base64,导致从客户端传过来的密文,办事端解析掉足。

上面的例子展示了客户端应用公钥加密,办事端应用私钥解密的历程。大概你会这么想,既然可以如斯,那办事端那边信息也可以经由过程RSA加密后,通报加密信息过来,客户端进行解密。然则,这样做,显示是不安然的。缘故原由是,因为客户端并没有保存私钥,只有公钥,只可以办事端进行私钥加密,客户端进行公钥解密,但因为公钥是公开,别人也可以获取到公钥,假如信息被他们截取,他们同样可以经由过程公钥进行解密,那么这样子加密,就毫无意义了,以是这个时刻,就要结合对称算法,实现客户端与办事端之前的安然通信了。

应用AES加密解密

加密

模拟客户端进行AES加密,我们经由过程调用AESUtils中的generateKey()措施,随机孕育发生一个密钥,用于对数据进行加密。输出的结果为:

密钥: 6446c69c0f914a57

密文: GECDQOsc22yV48hdJENTMg==

解密

模拟办事端进行AES解密,因为AES属于对称算法,加密和解密必要应用同一把密钥,以是,办事端要解密通报过来的内容,就必要密钥 + 密文。这里模拟一下办事端解密。

到这里大概你会问,客户端应用AES进行加密,办事端要进行解密的话,必要用到孕育发生的密钥,那密钥必须从客户端传输到办事端,假如纰谬密钥进行加密,那加密就没故意义了。以是这里终于谈到了重点,RSA算法+AES算法结合应用。

RSA算法+AES算法的应用

举一个简单的例子来阐明一下吧,例如实名认证功能,必要通报用户真实姓名和身份证号,对付这种紧张信息,必要进行加密处置惩罚。

客户端应用RSA + AES对紧张信息进行加密

客户端加密历程主要分为以下三个步骤:

1.客户端随机孕育发生AES的密钥;

2.对身份证信息(紧张信息)进行AES加密;

3.经由过程应用RSA对AES密钥进行公钥加密。

这样在传输的历程中,即时加密后的AES密钥被别人截取,对其也无济于事,由于他并不知道RSA的私钥,无法解密获得蓝本的AES密钥,就无法解密用AES加密后的紧张信息。

办事端应用RSA + AES对紧张信息进行解密

办事端解密历程主要分为以下两个步骤:

1.对加密后的AES密钥进行RSA私钥解密,拿到密钥原文;

2.对加密后的紧张信息进行AES解密,拿到原始内容。

现实开拓中,办事端无意偶尔也必要向客户端通报紧张信息,比如登录的时刻,返回token给客户端,作为令牌,这个令牌就必要进行加密,道理也是差不多的,比上面多一个步骤而已,便是将解密后的AES密钥,对将要通报给客户真个数据token进行AES加密,返回给客户端,因为客户端和办事端都已经拿到同一把AES钥匙,以是客户端可以解密办事端返回的加密后的数据。假如客户端想要将令牌进行保存,则必要应用自己定义的默认的AES密钥进行加密后保存,必要应用的时刻传入默认密钥和密文,解密后获得原token。

上面说起到客户端加密,办事端返回数据不加密的环境,上面说到仅仅应用RSA是可以,然则照样建议同时应用这两种算法,即孕育发生一个AES密钥,应用RSA对该密钥进行公钥加密,对紧张信息进行AES加密,办事端经由过程RSA私钥解密拿到AES密钥,再对加密后的紧张信息进行解密。假如仅仅应用RSA,办事端只经由过程RSA解密,这样会对付机能会有所影响,缘故原由是RSA的解密耗时约即是AES解密耗时的100倍,以是假如每个紧张信息都只经由过程RSA加密和解密,则会影响办事端系统的机能,以是建议两种算法一路应用。

同时还有响应的JS版RSA和AES算法,应用要领也差不多,在这里简单演示一下:

下面是一个html页面的代码,引入了rsa.js和aes.js

var key = getKey();//随机孕育发生AES密钥

var encryptKey = RSA(key);//对AES密钥进行RSA加密

console.log("encryptKey: " + encryptKey);

//测试AES加密和解密

var cipherText = AESEnc(key,"123456");

var plainText = AESDec(key,cipherText);

console.log("密文: " + cipherText);

console.log("明文: " + plainText);

This is my HTML page.

打开页面后,查看节制台输出:

同时,模拟办事端解密,运行结果如下:

必要留意的是:

1.RSAUtils中设置设置设备摆设摆设公钥和密钥,可以应用getKeys()措施孕育发生。假如是客户端,则无须设置设置设备摆设摆设私钥,把没有私钥的RSAUtils放到客户端,由于仅必要用到公钥加密的措施。

2.AESUtils中设置设置设备摆设摆设偏移量IV_STRING;

3.rsa.js中最底部设置设置设备摆设摆设公钥,须和上面RSAUtils设置设置设备摆设摆设的公钥同等;

4.aes.js中的底部var iv = CryptoJS.enc.Utf8.parse(“16-Bytes–String”); //加密向量中,调换里面的字符串,加密向量须和

是上面的AESUtils中的偏移量同等。

在这里将我自己封装的RSAUtils、AESUtils以及应用第三方jar包的Base64Utils还有JS版的RSAHE AES分享给大年夜家,盼望可以赞助到大年夜家,因为刚注册博客不久,没有若干积分,下载一些资料的时刻必要积分,以是收取大年夜家1积分,感谢了。

http://download.csdn.net/detail/chay_chan/9766486

您可能还会对下面的文章感兴趣: