给定一个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"从密码对象派生的常量值。
答案 0 :(得分:2)
没有直接的方法可以做到这一点,也可能不是一个好主意。某些密码可能包含非常短或非常长的密钥,这些密钥都不是非常有用。 RSA甚至没有最大密钥大小,并且最小密钥大小通常是不安全的。
方法getMaxAllowedKeyLength但可能只返回Integer.MAX_VALUE
而不是最大密钥大小(以位为单位)。它只应用于检查已知的密钥长度以防止限制。
如果要使密钥大小可配置,最好将密钥大小存储为某个属性/资源。在我看来,抽象出这个决定并不是一个好主意。
答案 1 :(得分:0)
阅读您要使用的算法的文档,并编写一个类,根据最大密钥长度封装该算法的细节。