这是来自NIST.FIPS.186-4和NIST.FIPS.186-3的DSA参数长度:
L = 1024, N = 160
L = 2048, N = 224
L = 2048, N = 256
L = 3072, N = 256
对于OpenJDK
的参数初始化,这是codeprotected void engineInit(int strength, SecureRandom random) {
if ((strength >= 512) && (strength <= 1024) && (strength % 64 == 0)) {
this.valueN = 160;
} else if (strength == 2048) {
this.valueN = 224;
// } else if (strength == 3072) {
// this.valueN = 256;
} else {
throw new InvalidParameterException
("Prime size should be 512 - 1024, or 2048");
}
this.valueL = strength;
this.seedLen = valueN;
this.random = random;
}
我的问题:
DSA的AFAIK强度等于使用的散列函数的长度,散列函数长度为N.也许这个初始化函数应该采用强度参数,如160,225和256,而不是512-1024,2048?
我是否正确地说,在DSA的实施中,L = 2048, N = 256
的情况完全被忽略了?
修改
好吧,看起来OpenJDK的代码使用旧DSA标准FIPS.186-2的参数。但DSA.java的javadoc明确表示此实现使用FIPS.186-3作为标准源。是否有可能开发人员忘记在升级java DSA实现时更新这部分代码或类似的东西?这可能是一个安全漏洞吗?