如标题中所述,我无法使以下代码生成ECC keyPair。
例外情况是:java.security.InvalidParameterException: unknown key size 571
。
在桌面上,571是最大密钥大小,我打算在Android应用上使用最大密钥大小。我该怎样做才能使它成为可能?
接下来,是否可以通过Android和桌面上的其他库制作更大的密钥?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread thread = new Thread(){
public void run(){
try{
setPriority(Thread.MAX_PRIORITY);
SecureRandom secureRandom = new SecureRandom();
KeyPairGenerator generator = KeyPairGenerator.getInstance("EC");
generator.initialize(571, secureRandom);
KeyPair keyPair = generator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
System.out.println("EC public: " + publicKey.getAlgorithm() + "\t" + publicKey.getFormat());
System.out.println("EC private: " + privateKey.getAlgorithm() + "\t" + publicKey.getFormat());
}
catch(Exception e){
System.err.println("EC Exception\n" + e.toString());
e.printStackTrace();
}
}
};
thread.start();
}
答案 0 :(得分:2)
无需使用571位曲线。具有512位密钥大小或更高密钥的曲线提供256位安全性。这是充足的(直到量子计算成熟,在这种情况下,两者都不够)。
目前,大多数标准使用素数曲线(F(p)上的曲线)或特殊曲线,如Curve25519。指定571时使用的可能是F(2 ^ m)上称为sect571r1的曲线。这是一个不常用的二进制曲线。此外,以这种方式选择特定曲线不是很清楚,可能会产生未来后果(如果使用不同的曲线会怎么样?)。
相反,如果您想在主要字段上坚持明确的强曲线,请使用以下代码:
KeyPairGenerator generator = KeyPairGenerator.getInstance("EC");
generator.initialize(new ECGenParameterSpec("secp521r1"));
KeyPair keyPair = generator.generateKeyPair();
ECPublicKey publicKey = (ECPublicKey) keyPair.getPublic();
ECPrivateKey privateKey = (ECPrivateKey) keyPair.getPrivate();
您还可以尝试添加提供程序(SpongyCastle)以获得对更多曲线的支持。在这种情况下,请确保指定要用于生成器的提供程序。
答案 1 :(得分:0)
您只能使用一组经过NIST批准的EC曲线,没有盲目单。
此外,如果您使用的是硬件支持的Android密钥库(以后将会越来越多),则仅对特定的密钥参数组合提供硬件支持-例如,目前(2020/11)仅1024 -和2048位RSA密钥在硬件中受支持,但不支持4096位。