序
本文次要钻研一下 PBE 算法
PBE
PBE 即 Password Based Encryption,基于口令的加密,它是一种组合算法,即个别是哈希 + 对称算法,比方 PBEWithMD5AndDES,就是用 MD5 做哈希,用 DES 做加解密,而其密钥则是口令 +salt 基于哈希函数计算而来
java 示例
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 示例
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 信息,在解密的时候可能正确解出明文