Требование: для данной именованной кривой отправляйте как можно меньше данных, чтобы получатель мог построить EC PrivateKey.Как создать PrivateKey, если вы знаете имя кривой и собственный закрытый ключ/точку?
В настоящее время я использую BouncyCastle/SpongyCastle на Android. Это то, что я понял до сих пор.
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec("secp112r2");
keyGen.initialize(ecGenParameterSpec, new SecureRandom());
KeyPair keyPair = keyGen.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
// privateKey.getEncoded() -> gives DER encoded private key. I can construct PrivateKey from that easily
byte[] derEncodedPrivateKeyBytes = privateKey.getEncoded(); // byteArray length-> 80
KeyFactory kf = KeyFactory.getInstance("EC");
PrivateKey key = kf.generatePrivate(new PKCS8EncodedKeySpec(derEncodedPrivateKeyBytes));
Теперь, используя Bouncy/губчатый замок, я получаю фактическую точку для закрытого ключа, без какой-либо другой информации, которая присутствует в derEncoding.
ECPrivateKeyParameters param = (ECPrivateKeyParameters) ECUtil.generatePrivateKeyParameter(privateKey);
int lenghtOfKey = param.getD().toByteArray().length; // length - 14
Вопрос: Как я могу восстановить PrivateKey объект, используя только точку D (privateKeyParam.getD()
) и название кривой? Используя имя кривой, я могу получить ECCurveParameters.
Edit: Я могу построить ECPrivateKeyParameters
с использованием закрытого ключа точки (praram.getD()
), но все еще не мог понять, как я могу генерировать PrivateKey от ECPrivateKeyParameters
.
X9ECParameters ecCurve = ECNamedCurveTable.getByName(curveName);
ECDomainParameters ecDomainParam = new ECDomainParameters(ecCurve.getCurve(),
ecCurve.getG(), ecCurve.getN(), ecCurve.getH(), ecCurve.getSeed());
ECPrivateKeyParameters generatedECPrivateKeyParams = new ECPrivateKeyParameters(param.getD(), ecDomainParam);