Java中RSAPublicKey
和PublicKey
之间的主要区别是什么?我也问RSAPrivateKey
和PrivateKey
。
答案 0 :(得分:4)
Cipher
和Signature
等类的实例通常会在编译期间接受任何PublicKey
或PrivateKey
实例的初始化方法。但是,密钥的类型应与实现的算法匹配。这在运行时进行检查,如果密钥和算法不匹配,则会生成InvalidKeyException
。
这使得即使在运行时如果需要也可以更容易地在算法之间切换。因此,无论使用何种算法,都可以实现大多数代码,至少在需要特定于键类型的操作之前。
请注意RSAPublicKey
扩展PublicKey
并且两者都是Java接口。一般情况下,如果您需要界面提供的其他方法,您自己应该只使用RSAPublicKey
。通常情况并非如此;对于加密操作,PublicKey
通常就足够了。
但有时您需要更多信息,例如密钥大小(RSA情况下的模数大小)或对密钥进行编码的方式与默认编码提供的方式不同。在这种情况下,您需要直接使用更高级别的接口。
KeyFactory
和KeyPairGenerator
工厂类只输出PublicKey
或PrivateKey
,后者通过输出通用KeyPair
实例间接输出。如果您需要其他方法,则需要将公钥转换为RSA公钥:
RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
如果你不确定你得到什么类型的密钥,首先需要使用instanceof
验证类型是否正确:
if (publicKey instanceof RSAPublicKey) {
RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
}
或者您应该愿意抓住可能跟随的ClassCastException
。
加密提供程序提供了这些接口的实际实现。
这解释了这些接口的另一种用法:只要可以检索诸如模数和指数之类的基础加密材料,它就可以可能使用一个提供者创建密钥或密钥对并使用它在另一个提供商。如果检索模数和指数的接口未标准化,则这是不可能的。
基于硬件的提供程序(智能卡,HSM&#)会在您尝试检索私有指数或其他私钥材料时抛出异常。这是因为密钥一般不会离开硬件设备;您只能使用指定的提供商在设备上执行RSA操作。
在其他Cipher
实现中无法使用这些密钥。因此,Java包含"延迟提供者选择"如果在实例化期间没有明确指定正确的提供者,请确保选择正确的提供者 - 例如 - Cipher.getInstance(String algorithm)
。而是在初始化期间选择提供者。
RSAPrivateCrtKey
是一个再次扩展RSAPrivateKey
的界面。此类包含对执行使用中国剩余定理(CRT)的更快计算所需的参数的访问。通常,您也不需要访问这些参数。
答案 1 :(得分:2)
PublicKey
/ PrivateKey
是使用密钥对的某些算法的关键,而不指定算法是什么。
他们与RSA相关的对手是他们对RSA算法的专业。例如,RSAPublicKey
中getPublicExponent()
缺少PublicKey
方法。
在实践中,您可以使用此规则:如果您确定只使用RSA,则使用RSAPublicKey
/ RSAPrivateKey
;否则,请使用PublicKey
/ PrivateKey
。