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