【问题标题】:ECC public and private keys settersECC 公钥和私钥设置器
【发布时间】:2016-09-20 00:36:29
【问题描述】:

我需要使用给定的公钥和私钥测试 ECC 验证。我找到了生成随机密钥的方法,但没有特定公钥/私钥的设置器。如何将公钥/私钥设置为字节数组?

 byte[] privateKeyBytes = new byte[]{(byte)0x24, (byte)0xF4, (byte)0x36, (byte)0x16, (byte)0xD0, (byte)0x96, (byte)0x12, (byte)0x63, (byte)0x90, (byte)0x2E, (byte)0x51, (byte)0xF6, (byte)0x87, (byte)0x55, (byte)0xAB, (byte)0xCB, (byte)0x5D, (byte)0xAC, (byte)0x56, (byte)0x1A, (byte)0xA5, (byte)0xFA, (byte)0x55, (byte)0xDB};
 byte[] publicKeyBytes = new byte[]{(byte)0x71, (byte)0x0B, (byte)0xCD, (byte)0xF8, (byte)0xEE, (byte)0x7F, (byte)0x36, (byte)0x32, (byte)0xF4, (byte)0x3E, (byte)0x8B, (byte)0x20, (byte)0x54, (byte)0xF7, (byte)0x84, (byte)0x26, (byte)0x4E, (byte)0x96, (byte)0xD9, (byte)0xBA, (byte)0x0F, (byte)0x82, (byte)0x84, (byte)0x2D, (byte)0xC1, (byte)0x31, (byte)0xE0, (byte)0xBF, (byte)0x9F, (byte)0x60, (byte)0x5F, (byte)0xAE, (byte)0x3A, (byte)0xA1, (byte)0x43, (byte)0x50, (byte)0x88, (byte)0x87, (byte)0xFE, (byte)0x49, (byte)0x6C, (byte)0x1F, (byte)0xF6, (byte)0x82, (byte)0x73, (byte)0xD8, (byte)0x77, (byte)0x8F};

 KeyPair pair = g.generateKeyPair();
 PublicKey pubKey = pair.getPublic();
 PrivateKey prikey = pair.getPrivate();

【问题讨论】:

    标签: cryptography private-key public-key elliptic-curve java-security


    【解决方案1】:

    不能设置公钥和私钥,因为它们应该被生成。

    据此,您将无法设置它。

    通常您可以对消息进行编码并将公钥放入编码方法中。也许你有一个像 C# 中的“ImportParameters”-Function,你可以在其中将“Key”导入到所选算法中,如 RSA。

    编辑: 根据THIS的回答,可以这样导入。

    我建议您生成密钥,使用序列化将它们存储为 JSON 或其他内容,以便您可以在方法中再次导入、反序列化和导入它们

    【讨论】:

    • 稍后我将需要它们来生成、存储和重用。
    • 我建议您生成密钥,使用序列化将它们存储为 JSON 或其他方式,以便您可以在方法中再次导入、反序列化和导入它们。
    【解决方案2】:

    用于编码键:

    private static PrivateKey generatePrivateKey(KeyFactory factory, byte[] content){
        PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(content);
        return factory.generatePrivate(privKeySpec);
    }
    
    private static PublicKey generatePublicKey(KeyFactory factory, byte[] content) {
        X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(content);
        return factory.generatePublic(pubKeySpec);
    }
    

    对于未编码:

    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    
    ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp192r1");
    
    ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(new BigInteger(1, privateKeyBytes), spec); 
    
    ECNamedCurveSpec params = new ECNamedCurveSpec("secp192r1", spec.getCurve(), spec.getG(), spec.getN());
    java.security.spec.ECPoint w = new java.security.spec.ECPoint(new BigInteger(1, Arrays.copyOfRange(publicKeyBytes, 0, 24)), new BigInteger(1, Arrays.copyOfRange(publicKeyBytes, 24, 48)));
    PublicKey publicKey = factory.generatePublic(new java.security.spec.ECPublicKeySpec(w, params));
    

    【讨论】:

      猜你喜欢
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多