Contents
  1. 1. MD5
  2. 2. AES
    1. 2.1. 加密
    2. 2.2. 解密
  3. 3. RSA
    1. 3.1. 加密
    2. 3.2. 解密

通用的加密模式可以分为对称加密、不对称加密、单向加密(不可逆加密)。偶然想要查询下如何在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));
Contents
  1. 1. MD5
  2. 2. AES
    1. 2.1. 加密
    2. 2.2. 解密
  3. 3. RSA
    1. 3.1. 加密
    2. 3.2. 解密