2015-07-15 5 views
2

Требование: для данной именованной кривой отправляйте как можно меньше данных, чтобы получатель мог построить 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); 

ответ

2

Я был в состоянии понять, как заново построить EC PrivateKey из BigInteger D имя & кривой.

public static PrivateKey getPrivateKeyFromECBigIntAndCurve(BigInteger s, String curveName) { 
    X9ECParameters ecCurve = ECNamedCurveTable.getByName(curveName); 
    ECParameterSpec ecParameterSpec = new ECNamedCurveSpec(curveName, ecCurve.getCurve(), ecCurve.getG(), ecCurve.getN(), ecCurve.getH(), ecCurve.getSeed()); 
    ECPrivateKeySpec privateKeySpec = new ECPrivateKeySpec(s, ecParameterSpec); 
    try { 
     KeyFactory keyFactory = KeyFactory.getInstance("EC"); 
     return keyFactory.generatePrivate(privateKeySpec); 
    } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { 
     e.printStackTrace(); 
     return null; 
    } 
}