Java加密技能(三)
当前位置:以往代写 > JAVA 教程 >Java加密技能(三)
2019-06-14

Java加密技能(三)

Java加密技能(三)

副标题#e#

除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方法,其实现方法大同小异,这里先容对称加密的另一个算法——PBE

PBE

PBE——Password-based encryption(基于暗码加密)。其特点在于口令由用户本身掌管,不借助任何物理媒体;回收随机数(这里我们叫做盐)杂凑多重加密等要领担保数据的安详性。是一种轻便的加密方法。

Java加密技术(三)

通过java代码实现如下:Coder类见 Java加密技能(一)


#p#副标题#e#

Java代码

import java.security.Key;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
/**
  * PBE安详编码组件
  *
  * @author 梁栋
  * @version 1.0
  * @since 1.0
  */
public abstract class PBECoder extends Coder {
/**
  * 支持以下任意一种算法
  *
  * <pre>
  * PBEWithMD5AndDES 
  * PBEWithMD5AndTripleDES 
  * PBEWithSHA1AndDESede
  * PBEWithSHA1AndRC2_40
  * </pre>
  */
public static final String ALGORITHM = "PBEWITHMD5andDES";

/**
  * 盐初始化
  *
  * @return
  * @throws Exception
  */
public static byte[] initSalt() throws Exception {
byte[] salt = new byte[8];
Random random = new Random();
random.nextBytes(salt);
return salt;
}

/**
  * 转换密钥<br>
  *
  * @param password
  * @return
  * @throws Exception
  */
private static Key toKey(String password) throws Exception {
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey secretKey = keyFactory.generateSecret(keySpec);

return secretKey;
}

/**
  * 加密
  *
  * @param data
  *      数据
  * @param password
  *      暗码
  * @param salt
  *      盐
  * @return
  * @throws Exception
  */
public static byte[] encrypt(byte[] data, String password, byte[] salt)

throws Exception {

Key key = toKey(password);

PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);

return cipher.doFinal(data);

}

/**
  * 解密
  *
  * @param data
  *      数据
  * @param password
  *      暗码
  * @param salt
  *      盐
  * @return
  * @throws Exception
  */
public static byte[] decrypt(byte[] data, String password, byte[] salt)

throws Exception {

Key key = toKey(password);

PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

return cipher.doFinal(data);

}
}

#p#副标题#e#

再给出一个测试类:

Java代码

import static org.junit.Assert.*;
import org.junit.Test;
/**
  *
  * @author 梁栋
  * @version 1.0
  * @since 1.0
  */
public class PBECoderTest {

@Test
public void test() throws Exception {
String inputStr = "abc";
System.err.println("原文: " + inputStr);
byte[] input = inputStr.getBytes();

String pwd = "efg";
System.err.println("暗码: " + pwd);

byte[] salt = PBECoder.initSalt();

byte[] data = PBECoder.encrypt(input, pwd, salt);

System.err.println("加密后: " + PBECoder.encryptBASE64(data));

byte[] output = PBECoder.decrypt(data, pwd, salt);
String outputStr = new String(output);

System.err.println("解密后: " + outputStr);
assertEquals(inputStr, outputStr);
}
}

节制台输出:

Console代码

原文: abc
暗码: efg
加密后: iCZ0uRtaAhE=
解密后: abc

后续我们会先容非对称加密算法,如RSA、DSA、DH、ECC等。

    关键字:

在线提交作业