Java加密技术(三)——PBE算法

mac2022-06-30  153

Javapbe对称加密     除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法——PBE PBE     PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。是一种简便的加密方式。 通过java代码实现如下:Coder类见 Java加密技术(一) 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);        }  }  再给出一个测试类: 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等。

转载于:https://www.cnblogs.com/iamconan/p/7383470.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)