如标题中所述,我无法使以下代码产生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();
}
最佳答案
无需使用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),以获得对更多曲线的支持。确保在这种情况下指定要用于生成器的提供程序。