我使用RSA加密AES密钥和其他一些信息。为了不易受padding-oracle-attack的攻击,我通过以下方式实例化Cipher:
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
现在在Oracle文档中(我正在使用oracle-java)给出了密钥长度:https://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html
对于RSA/ECB/OAEPWithSHA-256AndMGF1Padding
的表示1024和2048位。这是否意味着我不能或不应该使用密钥长度为4096的密码?这是我生成密钥的方式:
KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
keygen.initialize(4096, SecureRandom.getInstanceStrong());
KeyPair keyPair = keygen.genKeyPair();
我可以将此密钥与RSA/ECB/OAEPWithSHA-256AndMGF1Padding
一起使用吗?
答案 0 :(得分:1)
是的,您可以将其与该密钥大小一起使用,并且大多数Java提供程序(包括大多数运行时默认提供的Java提供程序)都将能够处理它。
这两个密钥大小-不再应该使用1024,而2048被认为很小-仅需要由任何官方Java运行时提供的默认提供程序来支持。但是,软件实现通常可以处理最大16Ki位的密钥大小(如果您不熟悉该术语,则为16乘1024或16 kibi 位)。
已指定RSA / OAEP与 any 密钥大小一起使用。但是,大多数实现要求位大小为8的倍数(以简化位/字节转换),有些实现要求以32位为增量(以简化使用32位整数的实现),有些甚至要求您使用形式为n的键大小= 2 ^ x或n = 2 ^ x + 2 ^(x-1)。显然也需要某种最小值来支持填充方案,因此512通常是一个下限。一些实现的保护过度,不允许密钥大小小于(有时包括)1024位。
因此,由于您的密钥的格式为2 ^ x(当然x = 12),因此完全有可能使用它,并且密钥大小极不可能不受支持。 (最新的?)1.7版本也不需要无限的加密扩展,因此您不必为此担心。
某些硬件模块对密钥大小有严格的限制。例如,如果智能卡完全可以管理4096位密钥,那么它们将几乎无法管理。
对于此类用途,您可能需要考虑使用椭圆曲线密码术。在这种情况下,您将需要加密,因此使用Certicom secp256r1(也称为NIST P-256)依赖ECDH的ECIES将是一种可行且更安全的替代选择(直到量子计算逐渐成熟,在这种情况下,您将比用螺丝钉拧紧更快RSA替代方案。