Android无法创建EC KeyPair

时间:2017-04-28 04:00:54

标签: java android cryptography elliptic-curve

如标题中所述,我无法使以下代码生成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();
}

2 个答案:

答案 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位。