【问题标题】:What is the algorithm name for PKCS#5 PBKDF1 in Java?Java 中 PKCS#5 PBKDF1 的算法名称是什么?
【发布时间】:2023-03-24 08:00:02
【问题描述】:

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

问题 1:

我正在尝试在 .我正在尝试获取与 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++ 代码行的东西。

谢谢

【问题讨论】:

    标签: java c++ security


    【解决方案1】:

    回复:问题 1

    根据Java 6 API docs for SecretKeyFactory

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

    如果我们查看 PKCS 的 SunJCE provider documentation,我们会看到...

    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);
    

    其他算法

    同样,来自同一页面。真的,我建议您通读整篇文章,因为它可能还会回答您的其他问题

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

    【讨论】:

    • 您好,感谢您的回复。我实际上正在使用AES。我没有在文档中找到任何与 AES 相关的算法。你知道像 PBEWithMD5AndAES 这样的东西吗?
    • 你真的不想今天还在使用 MD5。
    • @ravi:答案在 JCE 链接上。我用更多的复制/粘贴文本更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2013-08-06
    • 2011-12-08
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多