前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊PBE算法

聊聊PBE算法

作者头像
code4it
发布2023-09-12 19:51:27
2710
发布2023-09-12 19:51:27
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下PBE算法

PBE

PBE即Password Based Encryption,基于口令的加密,它是一种组合算法,即一般是哈希+对称算法,比如PBEWithMD5AndDES,就是用MD5做哈希,用DES做加解密,而其密钥则是口令+salt基于哈希函数计算而来

java示例

代码语言:javascript
复制
    public void testPBEWithIvParameter() throws NoSuchPaddingException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, InvalidKeySpecException {
        String algorithm = "PBEWithMD5AndDES";
        char[] passwd = "123456".toCharArray();
        PBEKeySpec pbeKeySpec = new PBEKeySpec(passwd);
        SecretKeyFactory kf = SecretKeyFactory.getInstance(algorithm);
        SecretKey key = kf.generateSecret(pbeKeySpec);

        byte[] salt = new byte[8];
        Random random = new Random();
        random.nextBytes(salt);

        Cipher cp = Cipher.getInstance(algorithm);

        IvParameterSpec iv = new IvParameterSpec(RandomUtil.randomBytes(16));
        PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, 1000, iv);

        cp.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);

        byte[] data = "helloworld".getBytes(StandardCharsets.UTF_8);
        byte[] encrypted = cp.doFinal(data);

        System.out.println(Base64.encode(encrypted));

        Cipher cpDecrypt = Cipher.getInstance(algorithm);
        cpDecrypt.init(Cipher.DECRYPT_MODE, key, pbeParameterSpec);
        byte[] decryptBytes = cpDecrypt.doFinal(encrypted);
        System.out.println(new String(decryptBytes));
    }

几个参数,一个是口令,即passwd,一个是salt,随机盐值,一个是ivParameter

golang示例

代码语言:javascript
复制
func Encrypt(message string, password string, salt []byte) (string, error) {
	keyObtentionIterations := 1000
	md5key, iv := getMd5DerivedKey(password, salt, keyObtentionIterations)
	encrypted, err := desEncrypt([]byte(message), md5key, iv)
	if err != nil {
		return "", err
	}

	result := encrypted
	if includePlainIvInEncryptionResults() {
		result = append(iv, result...)
	}
	if includePlainSaltInEncryptionResults() {
		result = append(salt, result...)
	}
	
	return base64.StdEncoding.EncodeToString(result), nil
}

小结

  • PBE即Password Based Encryption,基于口令的加密,它是一种组合算法,即一般是哈希+对称算法,比如PBEWithMD5AndDES,就是用MD5做哈希,用DES做加解密,而其密钥则是口令+salt基于哈希函数计算而来
  • 当使用固定salt和不使用ivParameter的DES的时候,同一个值,每次加密生成的密文是一样的,而使用随机salt和随机iv的时候,每次生成的密文是不一样的,这个时候密文会包含随机的salt和iv信息,在解密的时候能够正确解出明文
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-31 20:59,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PBE
  • java示例
  • golang示例
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com