java - 使用给定私钥在椭圆曲线算法中生成公钥的代码

标签 java bouncycastle elliptic-curve

我需要使用 jdk 1.7 实现 ECC(椭圆曲线密码术)算法。我试过用bouncy caSTLe,sunEC,但是都报错,报错。我的目标是使用私钥生成椭圆曲线,我会交给系统。

因此,我需要使用 jdk1.7 使用给定的私钥获取准确的代码来生成公钥。我用的IDE是eclipse。而且我需要知道,除了私钥之外,我还应该提供哪些其他参数?只提供一个曲线点和私钥就够了吗?

谁能帮我从私钥生成公钥??我可以管理其余的实现。

谁知道用java实现椭圆曲线密码术的 key ,请告诉我这段代码是否正确?

public class ECCrypt {

    private ECPoint curve_point;

      public ECCrypt(ECPoint curve_point) {
        this.curve_point = curve_point;
      }

public BigInteger makePublicKey(BigInteger privateKey) {
        ECPoint ecPublicKey = new ECPoint(curve_point);
        ecPublicKey.mult(privateKey);
        return ecPublicKey.pack();
}


public static void main(String[] argv) throws Exception {
        java.util.Random rnd = new java.util.Random();
        ECPoint cp = new ECPoint();
        cp.random(rnd);
        ECCrypt ec = new ECCrypt(cp);
        BigInteger priv = new BigInteger(255,rnd);
        BigInteger pub = ec.makePublicKey(priv);

}

谢谢!

最佳答案

我写了一个示例程序,输出如下:

FL261:java jvah$ javac -cp bcprov-ext-jdk15on-149.jar ECTest.java
FL261:java jvah$ java -cp bcprov-ext-jdk15on-149.jar:. ECTest
Private key: 7ba78909571fbc336b2b94054dfb745a6b0776ff36a8fa98a598dc32cb83cc8e
Public key: 035b9e4a6148c9f9b08b573871ac66a832e6e9f63cf117545523a45b8017b7c43f
Calculated public key: 035b9e4a6148c9f9b08b573871ac66a832e6e9f63cf117545523a45b8017b7c43f
Congratulations, public keys match!
FL261:java jvah$

代码应该足够清晰,这样你才能明白这里做了什么。请注意,您确实必须知道您的私钥是为哪条曲线生成的,否则无法生成匹配的公钥。示例代码使用了相当常用的secp256r1曲线。

import java.math.BigInteger;
import java.security.SecureRandom;

import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.asn1.sec.SECNamedCurves;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.math.ec.ECPoint;

class ECTest {
  public static String toHex(byte[] data) {
    StringBuilder sb = new StringBuilder();
    for (byte b: data) {
      sb.append(String.format("%02x", b&0xff));
    }
    return sb.toString();
  }

  public static void main(String[] argv) {
    // Get domain parameters for example curve secp256r1
    X9ECParameters ecp = SECNamedCurves.getByName("secp256r1");
    ECDomainParameters domainParams = new ECDomainParameters(ecp.getCurve(),
                                                             ecp.getG(), ecp.getN(), ecp.getH(),
                                                             ecp.getSeed());

    // Generate a private key and a public key
    AsymmetricCipherKeyPair keyPair;
    ECKeyGenerationParameters keyGenParams = new ECKeyGenerationParameters(domainParams, new SecureRandom());
    ECKeyPairGenerator generator = new ECKeyPairGenerator();
    generator.init(keyGenParams);
    keyPair = generator.generateKeyPair();

    ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters) keyPair.getPrivate();
    ECPublicKeyParameters publicKey = (ECPublicKeyParameters) keyPair.getPublic();
    byte[] privateKeyBytes = privateKey.getD().toByteArray();

    // First print our generated private key and public key
    System.out.println("Private key: " + toHex(privateKeyBytes));
    System.out.println("Public key: " + toHex(publicKey.getQ().getEncoded(true)));

    // Then calculate the public key only using domainParams.getG() and private key
    ECPoint Q = domainParams.getG().multiply(new BigInteger(privateKeyBytes));
    System.out.println("Calculated public key: " + toHex(Q.getEncoded(true)));

    // The calculated public key and generated public key should always match
    if (!toHex(publicKey.getQ().getEncoded(true)).equals(toHex(Q.getEncoded(true)))) {
      System.out.println("ERROR: Public keys do not match!");
    } else {
      System.out.println("Congratulations, public keys match!");
    }
  }
}

关于java - 使用给定私钥在椭圆曲线算法中生成公钥的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19673962/

相关文章:

c# - 验证 Java Card 签名

java - 如何指定集合文字的目标类型?

java.lang.nullpointerException 在 android.content.contextwrapper.getsystemservice(Contextwrapper.java :386)

certificate - 使用 ECDSA key 时获取已签名的 x509

java - 根据 RFC 测试 vector 计算 Java 中的 ECDSA 签名

java - 无法使用椭圆曲线 (EC) 加密技术签署 JWT

java - JobOperator 无法实例化

java - Hibernate @ManyToMany 在插入的拥有端插入 0

java - 为 SSL 通信创建证书

java - Bouncy CaSTLe,NoSuchMethodError(org.bouncycaSTLe.asn1.ASN1Integer)