Java Android无法创建EC密钥对

Java Android无法创建EC密钥对,java,android,cryptography,elliptic-curve,Java,Android,Cryptography,Elliptic Curve,如标题所述,我无法使以下代码生成ECC密钥对 异常为:java.security.InvalidParameterException:未知密钥大小571 在桌面上,571是最大密钥大小,我打算在Android应用程序上也使用最大密钥大小。我必须做些什么才能使之成为可能 接下来,是否可以通过Android和桌面上的其他库制作更大的键 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(s

如标题所述,我无法使以下代码生成ECC密钥对

异常为:
java.security.InvalidParameterException:未知密钥大小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)上的曲线)或特殊曲线,如曲线25519。当您指定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),以获得对更多曲线的支持。在这种情况下,请确保指定要用于生成器的提供程序。我郑重建议使用如上所述的命名曲线。

您仅限于一组独立的NIST批准的EC曲线,您没有全权委托权

此外,如果您使用的是硬件支持的Android密钥库(今后会越来越多),那么只有硬件支持特定的密钥参数组合-例如,目前(2020/11)只有1024位和2048位RSA密钥在硬件中受支持,而不是4096位