使用Java进行文本加密
通用的加密模式可以分为对称加密、不对称加密、单向加密(不可逆加密)。偶然想要查询下如何在java中进行文本加密,网上搜索到的都是大篇幅介绍加密原理,如何使用却都是一句话带过,真真是看着就烦。所以本文不涉及加密原理和概念,只是列举了如何使用java进行三种方式加密的例子,作为参考使用。
MD5
不可逆加密指的是使用MD5或者SHA进行加密,其本质是抽取特征码,抽取出来的密文是不可逆向解密回原来的文本的。这种方式大多用于密码的存储——只在数据库中存储抽取的特征码,而不存储原来的密码。
MessageDigest md5 = MessageDigest.getInstance("MD5");
BASE64Encoder base64Encoder = new BASE64Encoder();
String info = base64Encoder.encode(md5.digest("luoyuan".getBytes("utf-8")));
System.out.println(info);
其中getInstance(String)
的取值是限定的,如果传入的不是以下的字符串之一,就会抛出NoSuchAlgorithmException
MD5
MD2
SHA-1
SHA-256
SHA-384
SHA-512
AES
AES和DES的使用方式在Java中都差不多,所以不在此处提及DES的使用范例。
AES加密方式属于对称加密,加密和解密都需要使用一样的密钥。所以在加密时候使用的密钥要和密文一起发送。
加密
String mess = "luoyuan";
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");//获取一个AES相关的KeyGenerator
keyGenerator.init(128);//指定生成密钥的长度为128
SecretKey key = keyGenerator.generateKey();//生成一个密钥
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//构建Cipher,设置模式,解密的时候也必须使用同样的模式
cipher.init(Cipher.ENCRYPT_MODE, key);//使用生成的密钥初始化
byte[] encode = cipher.doFinal(mess.getBytes("utf-8"));//执行加密过程
System.out.println(Arrays.toString(encode));
解密
byte[] keyCode = {...};//加密过程生成的密钥的encoded
byte[] data = {...};//加密后的文本字节数组
SecretKey key = new SecretKeySpec(keyCode, "AES");//根据给出的密钥(字节数组)生成一个Key对象
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); //生成一个和加密时候使用的模式一样的Cipher
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decode = cipher.doFinal(data);//执行解密步骤
System.out.println(new String(decode));
RSA
RSA(DSA)加密属于非对称加密,加密解密过程会使用到不同的密钥——公钥和私钥。
如果使用公钥加密,那么解密可以使用私钥解密,如果使用私钥加密,则必须使用公钥进行解密。
加密
String msg = "Luoyuan";
KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance("RSA");//初始化一个KeyPairGenerator
keyGenerator.initialize(1024);//设置密钥长度为1024
KeyPair keyPair = keyGenerator.generateKeyPair();//RSA加密需要生成相对应的公钥和私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//获得私钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//获得公钥
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);//使用私钥加密
byte[] encode = cipher.doFinal(msg.getBytes("utf-8"));
System.out.println(Arrays.toString(encode));
解密
byte[] publicKeyCode = {...};
byte[] encode = {...};
Cipher cipher = Cipher.getInstance("RSA");
RSAPublicKey publicKey = new RSAPublicKeyImpl(publicKeyCode);//根据公钥的encode构建公钥对象
cipher.init(Cipher.DECRYPT_MODE, publicKey);//使用公钥解密
byte[] decode = cipher.doFinal(encode);
System.out.println(new String(decode));