对于加密解密的初步了解

来源:互联网 发布:淘宝店装修图片尺寸 编辑:程序博客网 时间:2024/05/22 00:37

由于工作任务的分配,最近把之前丢下的加密与解密的内容捡了起来,本篇博文不会涉及加密算法的原理以及具体实现,有时间会深究其原理,这篇博文主要是对加密算法的概括以及Java中常用加密算法的使用。

加密算法可以大致分为3类:对称加密算法、非对称加密算法、哈希算法。

对称加密算法:加密和解密使用相同密钥的算法,常见算法:DES、3DES、AES等。

非对称加密算法:使用一对公私钥来进行加密解密的算法,一般公钥加密,私钥解密,公钥可以随意暴露,常见算法:RSA、DSA等。

哈希算法:又称为单向加密或不可逆加密,常见算法:MD5、SHA等。

加密算法的效能通常可以按照算法本身的复杂程序、密钥长度(密钥越长越安全)、加解密速度等来衡量。

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

下面开始介绍几个常用加密算法的使用:

DES(Data Encryption Standard):即数据加密标准,是一种使用密钥加密的块算法。使用姿势请看下面代码:

package com.general.encryanddecode;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import java.security.SecureRandom;public class DESTest {    private String oContent;    private byte[] pContent;    private SecretKey key;    public DESTest(String oContent) {        this.oContent = oContent;        try {            key = KeyGenerator.getInstance("DES").generateKey();            System.out.println("密钥:" + BytesToHex.fromBytesToHex(key.getEncoded()));        } catch (Exception e) {        }    }    public static void main(String[] args) {        String key = "12345678";//密钥最小为8位。        String content = "GeneralAndroid->Android将军";        DESTest test = new DESTest(content);        test.encrypt();        test.decrypt();    }    public void encrypt() {        try {            SecureRandom secureRandom = new SecureRandom();            Cipher cipher = Cipher.getInstance("DES");            cipher.init(Cipher.ENCRYPT_MODE, key, secureRandom);            pContent = cipher.doFinal(oContent.getBytes());            System.out.println("加密:" + BytesToHex.fromBytesToHex(pContent));        } catch (Exception e) {            e.printStackTrace();        }    }    public void decrypt() {        try {            SecureRandom random = new SecureRandom();            Cipher cipher = Cipher.getInstance("DES");            cipher.init(Cipher.DECRYPT_MODE, key, random);            System.out.println("解密:" + new String(cipher.doFinal(pContent)));            ;        } catch (Exception e) {            e.printStackTrace();        }    }}/*** * 密钥:54fbfb1aa2e6899b 加密:47dcf9e97b51d855553d2478101fcbb85fd29b5da28f0a66f995f0ac179bff29 解密:GeneralAndroid->Android将军 * * * **/

3DES(Triple DES):是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密,是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。

该方法使用两个密钥,执行三次DES算法,加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1(Ek2(Dk3(C)))
采用两个密钥进行三重加密的好处有:
(1)两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为168bit的三个密钥,会产生不必要的开销。
(2)加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样有效的实现了与现有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一样,有助于逐渐推广三重DES。
(3)三重DES具有足够的安全性,目前还没有关于攻破3DES的报道。

使用姿势,和DES的代码块差不多,将DES改为DESede即可。这里就不贴代码了。
AES(Advanced Encryption Standard):高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,这个标准用来替换原来的DES。
使用姿势,和DES的代码块差不多,将DES改为AES即可。这里就不贴代码了。
RSA:RSA同时有两把钥匙,公钥与私钥。同时支持数字签名。数字签名的意义在于,对传输过来的数据进行校验。确保数据在传输工程中不被修改。其使用姿势如下面代码所示:

package com.general.encryanddecode;import javax.crypto.Cipher;import java.security.Key;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.SecureRandom;public class RSATest {    private Key publicKey;    private Key privateKey;    private String oContent;    private byte[] pContent;    public RSATest(String oContent) {        this.oContent = oContent;        try{            generateKeyPair();        }catch (Exception e){            e.printStackTrace();        }    }    public void generateKeyPair() throws Exception {        SecureRandom sr = new SecureRandom();        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");        kpg.initialize(1024, sr);        KeyPair kp = kpg.generateKeyPair();        publicKey = kp.getPublic();        privateKey = kp.getPrivate();        System.out.println("公钥:" + BytesToHex.fromBytesToHex(publicKey.getEncoded()));        System.out.println("私钥:" + BytesToHex.fromBytesToHex(privateKey.getEncoded()));    }    public void encrypt() {        try {            Cipher cipher = Cipher.getInstance("RSA");            cipher.init(Cipher.ENCRYPT_MODE, publicKey);            pContent = cipher.doFinal(oContent.getBytes());            System.out.println("密文:" + BytesToHex.fromBytesToHex(pContent));        } catch (Exception e) {            e.printStackTrace();        }    }    public void decrypt(){        try{            Cipher cipher=Cipher.getInstance("RSA");            cipher.init(Cipher.DECRYPT_MODE,privateKey);            System.out.println("原文:"+new String(cipher.doFinal(pContent)));        }catch (Exception e){            e.printStackTrace();        }    }    public static void main(String[] args){        RSATest test=new RSATest("GeneralAndroid->Android将军");        test.encrypt();        test.decrypt();    }}/*** * 公钥:30819f300d06092a864886f70d010101050003818d0030818902818100948b98bfcdcae77156ebd2e2d3dc7822295073c4326410edb50ab6737f2c594387eb2f0ab622211ac229a6f395bcb8b24653bebf90151895d9be951ee1dbdaa529b7951db529cee2aa3bf9cc52bfb5928b498333aaab8ee6bb4904d5afd387a2e09ddf8320258597948bfa6d4f7034bb76f7fbc80139bc0456c1a14190d054af0203010001 私钥:30820275020100300d06092a864886f70d01010105000482025f3082025b02010002818100948b98bfcdcae77156ebd2e2d3dc7822295073c4326410edb50ab6737f2c594387eb2f0ab622211ac229a6f395bcb8b24653bebf90151895d9be951ee1dbdaa529b7951db529cee2aa3bf9cc52bfb5928b498333aaab8ee6bb4904d5afd387a2e09ddf8320258597948bfa6d4f7034bb76f7fbc80139bc0456c1a14190d054af0203010001028180532087bb966b9cf745403544b070e95d9ca72411c06d5537e11f7c98c7ab46cccecc2308288292ea098c0b9cb6c7e4c80729284ec54fb8f16ae807453ff9abb1f55f3fb6684b595d94a45ef091f00d9a6b0146b8bcb2fc1c3cbd9c1218f65b204996e546817aa00769070042cacf67b4d0df6367821111953862386385904381024100cba0822bbd32ed3949c3f6c4c2ae1da16d453ad727a682a1bd451c5208232427b0a6202e44e10f7cb6c0967488773199891035e9de3cc76adefbec73378b9f6f024100bac052b6460c051f277b869b79883d5ebccfe971afd77b78536ef55a5c18cfef803f026fc624f2f4000404e53efd4b63ee2b4fcc3e388fe69093b3944ef3fec102402d50fe472fa6fac64a155380bc76b55f6c8b00aa4b47b240be7777f3059e947844c6e3d88839b211a6363c05992d359b9eb63dd95b3d19803e39c0886faf21ff02401384faa0369e1702f49b82ac497da5fc7afbb848bbba681b618d1d73fe60518b94fa010531ceb6de2e0a3d80c09eb4fc92ee4ffee719fe60790817230f458d8102405204e52efc21b4deb76cf90046907330714dbea17b8c95ed1d648ea5931f04fc9f35c2c6f811eeadabb67b211cefe86d6df76ed7b3011f2922faca7b306c0719 密文:0f9495be68eb85750a333f656d085d049f05dfc6c264441cd3e52658bdc9767a047127f491a730b3c60d6ffd22568c38d25820b3aa3332a0e3cd0d0444851c651ab38ada9d8669092f1f3c016f895554fac3a8873e38cd856087f62ddae12aa1429cfaa7e6f088d4ebd28a1a635e53295729822446213ae53ec50dd38ba608fa 原文:GeneralAndroid->Android将军 * * */

DSA(Digital Signature Algorithm):数据签名算法,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。如果数据和签名不匹配则认为验证失败。数字签名的作用就是校验数据在传输过程中不被修改。
使用姿势如下所示:

package com.general.encryanddecode;import javax.crypto.Cipher;import java.security.*;/** * 数字签名用 */public class DSATest {    private Key publicKey;    private Key privateKey;    private String oContent;    private byte[] pContent;    private byte[] sign;    public DSATest(String oContent) {        this.oContent = oContent;        try{            generateKeyPair();        }catch (Exception e){            e.printStackTrace();        }    }    public void generateKeyPair() throws Exception {        KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");        KeyPair kp = kpg.generateKeyPair();        publicKey = kp.getPublic();        privateKey = kp.getPrivate();        System.out.println("公钥:" + BytesToHex.fromBytesToHex(publicKey.getEncoded()));        System.out.println("私钥:" + BytesToHex.fromBytesToHex(privateKey.getEncoded()));    }    public void sign() {        try {            Signature signature=Signature.getInstance("DSA");            signature.initSign((PrivateKey) privateKey);            signature.update(oContent.getBytes());            sign=signature.sign();            System.out.println("签名:"+BytesToHex.fromBytesToHex(sign));        } catch (Exception e) {            e.printStackTrace();        }    }    public void verify(){        try {            Signature signature=Signature.getInstance("DSA");            signature.initVerify((PublicKey) publicKey);            signature.update(oContent.getBytes());            System.out.println("验证:"+signature.verify(sign));;        } catch (Exception e) {            e.printStackTrace();        }    }    public static void main(String[] args){        DSATest test=new DSATest("GeneralAndroid->Android将军");        test.sign();        test.verify();    }}/** * * 公钥:308201b83082012c06072a8648ce3804013082011f02818100fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b76b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c70215009760508f15230bccb292b982a2eb840bf0581cf502818100f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d0782675159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e13c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243bcca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a0381850002818100e234691f5ec3b379d6b4e516be16ad21017ca3cef07ffbc485bc282a56164bb63b03ebc8c676c6092caf72e6eaccff2ab9fe6e30b3b459fa235008d689a8c8ba7dc50a3066c172cecb930776de0a04773fd62ca4cf9dccd68d1a4c4418bd1198488fad73a52a5fcdbff2d8b58d8344d8566027ccd9ac2b593a701a26dc268e25 私钥:3082014b0201003082012c06072a8648ce3804013082011f02818100fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b76b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c70215009760508f15230bccb292b982a2eb840bf0581cf502818100f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d0782675159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e13c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243bcca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a041602146f1508747ab539097047199bdc1f53a42c1e5522 签名:302c021437788675af8edbdf83976313a94ef4bb99a9657502147eb1581542a970b1e9d954d9f593bea46ba48754 验证:true * * * * * */

本篇博文就先讲这么多,加密与解密是一个复杂的方向,本文仅仅是入门前的使用,如果真要知其原理,还需要进一步研究密码学相关的内容。

要说的内容就这么多,如果文中有不对的地方,麻烦指出,如果喜欢我的文章,可以动动手指关注一下,赞一下,我会有更大的动力写出更多的文章,转载请注明出处:http://blog.csdn.net/android_jiangjun/article/details/78727139

原创粉丝点击