[置顶] 对于加密解密的初步了解
2017-12-06 09:30
176 查看
由于工作任务的分配,最近把之前丢下的加密与解密的内容捡了起来,本篇博文不会涉及加密算法的原理以及具体实现,有时间会深究其原理,这篇博文主要是对加密算法的概括以及Java中常用加密算法的使用。
加密算法可以大致分为3类:对称加密算法、非对称加密算法、哈希算法。
对称加密算法:加密和解密使用相同密钥的算法,常见算法:DES、3DES、AES等。
非对称加密算法:使用一对公私钥来进行加密解密的算法,一般公钥加密,私钥解密,公钥可以随意暴露,常见算法:RSA、DSA等。
哈希算法:又称为单向加密或不可逆加密,常见算法:MD5、SHA等。
加密算法的效能通常可以按照算法本身的复杂程序、密钥长度(密钥越长越安全)、加解密速度等来衡量。
在实际的操作过程中,我们通常采用非对称加密算法来管理对称算法的密钥,然后用对称加密算法来加密数据,这样我们就集合了两类加密算法的优势,既实现了加密速度快,又实现了安全方便管理密钥的优点。
下面开始介绍几个常用加密算法的使用:
DES(Data Encryption Standard):即数据加密标准,是一种使用密钥加密的块算法。使用姿势请看下面代码:
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同时有两把钥匙,公钥与私钥。同时支持数字签名。数字签名的意义在于,对传输过来的数据进行校验。确保数据在传输工程中不被修改。其使用姿势如下面代码所示:
DSA(Digital Signature Algorithm):数据签名算法,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。如果数据和签名不匹配则认为验证失败。数字签名的作用就是校验数据在传输过程中不被修改。
使用姿势如下所示:
本篇博文就先讲这么多,加密与解密是一个复杂的方向,本文仅仅是入门前的使用,如果真要知其原理,还需要进一步研究密码学相关的内容。
要说的内容就这么多,如果文中有不对的地方,麻烦指出,如果喜欢我的文章,可以动动手指关注一下,赞一下,我会有更大的动力写出更多的文章,转载请注明出处:http://blog.csdn.net/android_jiangjun/article/details/78727139
加密算法可以大致分为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
相关文章推荐
- [置顶] 【CA】对于加密解密在系统中的应用的一些看法
- [置顶] java IO流之图片的加密与解密
- 转载,对于已用encryption加密的存储过程,的解密方法
- 一看就懂的RSA公钥私钥加密解密,BASE64编码,针对于没了解过RSA的同学,很有帮助。
- 对于Java中多线程互斥锁初步了解
- JS加密解密对于asp.net解密加密
- [置顶] 对于任天堂你了解多少?
- 对于MySQL的存储过程初步了解
- 学习php需要了解的点2 - PHP 一组加密解密算法
- 为什么对于HTTPS需要SSL证明书?了解加密通信的组成
- [置顶] 对于任天堂你了解多少?
- 对于BS与CS以及内核,渲染引擎,渲染模式等初步了解
- 初学编程 对于c c++ oc 的一个初步的了解
- 加密解密基础及openssl构建私有CA初步
- [置顶] 推荐一款加密解密的算法,用于简单数据的传输。
- 数据结构中对于时间复杂度的初步了解
- [置顶] Rsa 加密解密 java
- 夺命雷公狗---微信开发02----了解下微信公众平台交互原理和加密和解密原理
- 0909 对于编译原理的初步了解
- 对于数据结构的初步了解