PBE加密算法:PBEWITHMD5andDES

最近感觉没有什么要写的,因为太空虚…可能是因为刚进入一份工作,哪哪的都不适应,也可能因为团队中都是大佬,压力山大…但是还是要不断努力!!

这两天项目中要做一些数据加密处理,发现一种之前没有用过的算法PBEWITHMD5andDES,只是简单了解,方便复习,简述一下.

PBE(Password Based Encryption,基于口令加密)算法是一种基于口令的加密算法,其特点在于口令是由用户自己掌握的,采用随机数杂凑多重加密等方法保证数据的安全性, PBE算法没有密钥的概念,密钥在其它对称加密算法中是经过算法计算得出来的,PBE算法则是使用口令替代了密钥。

就是PBE作者说的,PBE并没有真正的构建加密/解密算法,是对加密/加密算法的一种封装,让其更具安全性.

下面在代码中介绍PBEWITHMD5andDES的应用和具体概念

/**
     * 定义使用的算法为:PBEWITHMD5andDES算法
     */
    public static final String ALGORITHM = "PBEWITHMD5ANDDES";
    /**
     * 定义迭代次数为1000次,次数越多,运算越大,越不容易破解之类。
     */
    private static final int ITERATIONCOUNT = 100;//orgin 1000

    private  String saltStr;

    /**
     * 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. 盐长度必须为8字节的倍数
     *
     * @return byte[] 盐值
     * */
    private  byte[] getSalt() throws Exception {
        // 实例化安全随机数  // 产出盐
        SecureRandom random = new SecureRandom();
        return random.generateSeed(8);
    }
    /**
     * 根据PBE密码生成一把密钥
     *
     * @param password
     *            生成密钥时所使用的密码
     * @return Key PBE算法密钥
     * */

    private  Key getPBEKey(String password) throws Exception {
        // 实例化使用的算法
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
        // 设置PBE密钥参数
        PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
        // 生成密钥
        SecretKey secretKey = keyFactory.generateSecret(keySpec);

        return secretKey;
    }

    /**
     * 加密明文字符串
     *
     * @param plaintext
     *            待加密的明文字符串
     * @param password
     *            生成密钥时所使用的密码
     * @return 加密后的密文字符串
     * @throws Exception
     */
    public  String encrypt(String plaintext, String password)
            throws Exception {
        //获取根据PBE口令生成的key
        Key key = getPBEKey(password);
        //获取8字节位的盐
        byte[] salt = getSalt();
        //将盐进行加密
        saltStr = Base64.encodeBase64String(salt);
        //设置PBE参数的盐和运算次数
        PBEParameterSpec parameterSpec = new PBEParameterSpec(salt,ITERATIONCOUNT);
        //构建实例化
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        //cipher对象使用之前还需要初始化,共三个参数("加密模式或者解密模式","密匙","向量")
        cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
        //数据转换
        byte encipheredData[] = cipher.doFinal(plaintext.getBytes("UTF-8"));

        return Base64.encodeBase64String(encipheredData);
    }
    public String getSaltStr(){
        return saltStr;
    }
    /**
     * 解密密文字符串
     *
     * @param ciphertext
     *            待解密的密文字符串
     * @param password
     *            生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致)
     * @param saltStr
     *            盐值(如需解密,该参数需要与加密时使用的一致)
     * @return 解密后的明文字符串
     * @throws Exception
     */
    public  String decrypt(String ciphertext, String password, String saltStr)
            throws Exception {
        //转换密钥
        Key key = getPBEKey(password);
        //解密盐
        byte[] salt = Base64.decodeBase64(saltStr);
        //实例化PBE参数
        PBEParameterSpec parameterSpec = new PBEParameterSpec(salt,
                ITERATIONCOUNT);
        //实例化
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        //初始化
        cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
        //数据转换
        byte[] passDec = cipher.doFinal(Base64.decodeBase64(ciphertext));
        //返回明文字符
        return new String(passDec);
    }

在我的观点看来,PBE使用了一种安全的加密方式,使用口令代替密钥,每次在一方发送口令,双方确认口令之后进行交互.交互中口令发送方会把salt加密并将加密的密文发送,另外一方就可以直接进行解密.口令和salt缺一不可.

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PBEWITHMD5andDES算法是一种基于口令的加密算法,它使用MD5和DES算法进行加密。下面是一个使用PBEWITHMD5andDES算法进行加密的示例: ```java import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.KeySpec; public class PBEDemo { public static void main(String[] args) throws Exception { String password = "mypassword"; String plaintext = "Hello, world!"; // 生成随机盐值 byte[] salt = new byte[8]; SecureRandom random = new SecureRandom(); random.nextBytes(salt); // 创建PBE密钥 KeySpec keySpec = new PBEKeySpec(password.toCharArray()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWITHMD5andDES"); SecretKey secretKey = keyFactory.generateSecret(keySpec); // 创建PBE参数 AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, 1000); // 创建加密器 Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec); // 加密数据 byte[] ciphertext = cipher.doFinal(plaintext.getBytes()); System.out.println("Plaintext: " + plaintext); System.out.println("Ciphertext: " + Base64.getEncoder().encodeToString(ciphertext)); } } ``` 这个示例中,我们使用了Java的加密库来实现PBEWITHMD5andDES算法的加密。首先,我们生成一个随机的盐值,然后使用口令生成PBE密钥。接下来,我们创建PBE参数,并使用密钥和参数初始化加密器。最后,我们使用加密器对明文进行加密,并输出密文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值