在使用SpongyCastle的Android应用程序中,我想使用特定的椭圆曲线(prime192v1)执行ECDH密钥交换,并且正在使用此代码生成私有和公共参数的byte []表示形式:

        try{
            KeyPairGenerator g = KeyPairGenerator.getInstance("ECDH", "SC");

            org.spongycastle.jce.spec.ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime192v1");
            g.initialize(ecSpec, new SecureRandom());

            KeyPair kp1 = g.generateKeyPair();
            KeyPair kp2 = g.generateKeyPair();

            // Alice generated this
            byte[] privK1 = kp1.getPrivate().getEncoded();
            byte[] pubK1= kp1.getPrivate().getEncoded();

            // Bob generated this
            byte[] privK2 = kp2.getPrivate().getEncoded();
            byte[] pubK2= kp2.getPrivate().getEncoded();

        }catch(Exception e)
        {
            Log.e(LOGTAG, "Exception caught in ECDHInit function");
        }


现在假设Alice和Bob在本地保存其私钥,交换pubK1pubK2并想继续设置共享机密(它们现在都具有byte[]格式的密钥)。我将仅描述爱丽丝的情况,因为对于鲍勃,这是相同的:

KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH", "SC");

PrivateKey privateKey = KeyFactory.getInstance("ECDH", "SC").generatePrivate(new PKCS8EncodedKeySpec(privK1));
PublicKey publicKey = KeyFactory.getInstance("ECDH", "SC").generatePublic(new X509EncodedKeySpec(pubK2));


我的问题来了-
使用以下代码,我设法为Alice和Bob获得了相同的共享机密

keyAgreement.init(privateKey);
keyAgreement.doPhase(publicKey, true);

byte[] sharedSecret = SHA256(keyAgreement.generateSecret());


但我没有指定我的特殊曲线prime192v1

如果我尝试以这种方式提供此信息:

org.spongycastle.jce.spec.ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime192v1");

keyAgreement.init(privateKey, ecSpec);
keyAgreement.doPhase(publicKey, true);

byte[] sharedSecret = SHA256(keyAgreement.generateSecret());


抛出一个异常说

java.security.InvalidAlgorithmParameterException: No algorithm parameters supported


为什么不能提供所需的参数? KeyAgreement是否以某种方式从私钥推断出这一点?

谢谢!

最佳答案

事实证明,在Android Studio调试器中,我的答案就在我面前。检查PrivateKey对象后,我发现内部成员privateKey.ecSpec包含所选曲线的所有详细信息。因此,传递参数是不必要的,并且会引发错误,请在不提供其他ecSpec的情况下使用代码

08-25 11:20
查看更多