现在我正在研究密码学,我对JCE感兴趣,但我对KeyGenerator类感到困惑。我知道这个类可以为对称算法生成一个键但是我不明白为什么我应该使用这个类?因为我可以使用SecretKeyFactory自己创建一个密钥并使用它来启动密码对象,对吗?
如下面的代码
// Create Key
DESKeySpec desKeySpec = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
// Create Cipher
Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
desCipher.init(Cipher.ENCRYPT_MODE, secretKey);
然后与此代码进行比较
KeyGenerator generator = KeyGenerator.getInstance("AES", "BC");
generator.init(192);
Key encryptionKey = generator.generateKey();
他们之间有什么区别?他们做同样的事吗?
另外,在什么情况下我应该选择使用“getEncoded()”方法??
答案 0 :(得分:0)
KeyGenerator
是用于生成密钥的便捷类。您可以告诉它在Cipher
中将使用哪种算法,它可以生成与算法匹配的密钥,而无需提供任何。
您当然可以手动执行此操作,但您需要执行几个步骤,因为您已经在问题中进行了演示(并且您甚至不会在byte[] key
中生成关键数据)。
答案 1 :(得分:0)
有些JCE提供程序的密钥处理比字节数组更安全,因为密钥用于加密和解密数据,但它们本身从不以明文形式存在于内存中。例如,智能卡和HSM支持的提供商就是这样工作的。
当您创建一个字节数组然后从中构造键时,您将明确地将其加载到内存中。当您使用KeyGenerator时,密钥可能会在安全存储中创建,而不会出现在内存中,从而消除了一个攻击媒介。