2

我在使用密码学方面有几个问题。我正在使用 AES。

问题一:

我正在尝试使用SecretKeyFactory. 我正在尝试获取与 PBKDF1 PKCS#5 相关的实例。我是密码学的新手。我在网上试过,但我找不到任何这样的算法。是否支持。我想要这样的东西。

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF1Pkcs#5");
KeySpec spec = new PBEKeySpec(password, salt, 1, 128);

问题2:

以上两行代码是否与 Crypto++ 代码中的以下代码行做同样的事情?

PKCS5_PBKDF1 <MD5> fn;
fn.DeriveKey(key, MD5::DIGESTSIZE, 0, key.getBytes(), salt.getBytes(), salt.size(), PBKDF1_ITERATIONS, time_in_seconds);

如果没有,有人可以给出一些可以模仿上述c ++代码行的东西。

谢谢

4

1 回答 1

5

回复:问题 1

根据SecretKeyFactory 的 Java 6 API 文档

应用程序开发人员应参考其提供者的文档,以了解 generateSecret 和 getKeySpec 方法支持哪些密钥规范。例如,“SunJCE”提供者提供的 DES 密钥工厂支持 DESKeySpec 作为 DES 密钥的透明表示,并且该提供者的三重 DES 密钥的密钥工厂支持 DESedeKeySpec 作为三重 DES 密钥的透明表示。

如果我们查看PKCS的SunJCE 提供程序文档,我们会看到...

PBEWithMD5AndDES:基于密码的加密算法,定义在:RSA 实验室,“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);

其他算法

同样,来自同一页面。真的,我建议你通读整本书,因为它可能也会回答你的其他问题

PBEWith<digest>And<encryption> 或 PBEWith<prf>And<encryption>:用于 PKCS #5 基于密码的加密的密钥工厂,其中 <digest> 是消息摘要,<prf> 是伪随机函数,<encryption>是一种加密算法。示例:PBEWithMD5AndDES (PKCS #5, v 1.5) 和 PBEWithHmacSHA1AndDESede (PKCS #5, v 2.0)。注意:它们都只使用每个密码字符的低 8 位。

于 2012-06-18T20:01:51.950 回答