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

07-28 07:39