在使用 SpongyCastle 的Android应用程序中,我想使用特定的椭圆曲线执行 ECDH密钥交换( prime192v1 < / em>)我正在使用此代码生成私有和公共参数的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在本地保存他们的私钥,交换pubK1
和pubK2
并希望继续设置共享密钥(他们现在都有byte[]
格式的密钥) 。我将仅描述Alice的情况,而Bob则完全相同:
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
是否以某种方式从私钥中推断出这一点?
谢谢!
答案 0 :(得分:1)
所以事实证明我在Android Studio调试器中就在我面前有了答案。检查PrivateKey
对象后,我发现内部成员privateKey.ecSpec
包含所选曲线的所有详细信息。因此传递参数是不必要的并且会引发错误,使用代码而不提供额外的ecSpec