如何获得Cipher的最大密钥大小

时间:2014-05-26 10:37:32

标签: java cryptography

给定一个javax.crypto.Cipher对象,如何获取与其init方法一起使用的密钥长度?

我知道该对象是使用Cipher.getInstance创建的(" AES / CBC / PKCS5Padding"),但我想从中抽象出来。

现在我的代码看起来像:

        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec spec = new PBEKeySpec(keyString.toCharArray(), SALT, 256, 128);
        byte[] encoded = factory.generateSecret(spec).getEncoded(); 
        assert encoded.length*8 == 128;
        Key rv = new SecretKeySpec(encoded, "AES");
        Cipher cipher = Cipher.getInstance(CIPHER_MODE);
        cipher.init(Cipher.DECRYPT_MODE, rv, new IvParameterSpec(IV_PARAMETER_SPEC));

我想用一个参数替换密码对象" 128"," AES"从密码对象派生的常量值。

2 个答案:

答案 0 :(得分:2)

没有直接的方法可以做到这一点,也可能不是一个好主意。某些密码可能包含非常短或非常长的密钥,这些密钥都不是非常有用。 RSA甚至没有最大密钥大小,并且最小密钥大小通常是不安全的。

方法getMaxAllowedKeyLength但可能只返回Integer.MAX_VALUE而不是最大密钥大小(以位为单位)。它只应用于检查已知的密钥长度以防止限制。

如果要使密钥大小可配置,最好将密钥大小存储为某个属性/资源。在我看来,抽象出这个决定并不是一个好主意。

答案 1 :(得分:0)

阅读您要使用的算法的文档,并编写一个类,根据最大密钥长度封装该算法的细节。