回复:问题1
Per the SecretKeyFactory 的 Java 6 API 文档 http://docs.oracle.com/javase/6/docs/api/javax/crypto/SecretKeyFactory.html,
应用程序开发人员应参阅其提供商的文档,以了解generateSecret 和getKeySpec 方法支持哪些关键规范。例如,“SunJCE”提供商提供的 DES 密钥工厂支持 DESKeySpec 作为 DES 密钥的透明表示,并且该提供商的三重 DES 密钥的密钥工厂支持 DESedeKeySpec 作为三重 DES 密钥的透明表示。
如果我们看一下SunJCE 提供商文档 http://docs.oracle.com/javase/1.5.0/docs/guide/security/jce/JCERefGuide.html对于 PKCS,我们看到...
PBEWithMD5AndDES:基于密码的加密算法,定义如下:RSA Laboratories,“PKCS #5:基于密码的加密标准”1.5 版,1993 年 11 月。请注意,该算法意味着 CBC 作为密码模式,PKCS5Padding 作为填充方案,并且不能与任何其他密码模式或填充方案一起使用。
回复:问题2
在同一文档的部分中使用基于密码的加密,您将找到以下示例代码。请记住,示例代码使用静态盐,但安全实现将在用户每次更改密码时生成随机盐。
PBEKeySpec pbeKeySpec;
PBEParameterSpec pbeParamSpec;
SecretKeyFactory keyFac;
// Salt
byte[] salt = {
(byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
(byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
};
// Iteration count
int count = 20;
// Create PBE parameter set
pbeParamSpec = new PBEParameterSpec(salt, count);
// Prompt user for encryption password.
// Collect user password as char array (using the
// "readPasswd" method from above), and convert
// it into a SecretKey object, using a PBE key
// factory.
System.out.print("Enter encryption password: ");
System.out.flush();
pbeKeySpec = new PBEKeySpec(readPasswd(System.in));
keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
// Create PBE Cipher
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
// Initialize PBE Cipher with key and parameters
pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);
// Our cleartext
byte[] cleartext = "This is another example".getBytes();
// Encrypt the cleartext
byte[] ciphertext = pbeCipher.doFinal(cleartext);
其他算法
再次,来自同一页面。真的,我建议您通读整篇文章,因为它也可能会回答您的其他问题
PBEWithAnd 或 PBEWithAnd:用于 PKCS #5 基于密码的加密的密钥工厂,其中 是消息摘要, 是伪随机数函数,是加密算法。示例:PBEWithMD5AndDES(PKCS #5,v 1.5)和 PBEWithHmacSHA1AndDESede(PKCS #5,v 2.0)。注意:它们都仅使用每个密码字符的低 8 位。