在Java SE 1.7中使用ECC

时间:2014-06-24 09:57:16

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

我正在尝试运行此pdf中的代码。例如,对于ECCKeyGeneration,我在pdf中得到以下输出而不是图1:

sun.security.ec.ECPrivateKeyImpl@58b6
Sun EC public key, 192 bits
  public x coord: 4812174841545539052388802454891896756539688756781766645984
  public y coord: 1161396487043052042009627836016170768650083444786081272028
  parameters: secp192r1 [NIST P-192, X9.62 prime192v1] (1.2.840.10045.3.1.1)

私钥未打印到控制台/屏幕。相反,它说" sun.security.ec.ECPrivateKeyImpl@blabla"正如你在上面看到的那样。这种情况可能是什么原因?

如果您想测试,请输入以下代码:

import java.security.*;
import java.security.spec.*;

public class ECCKeyGeneration {

    public static void main(String[] args) throws Exception {
        KeyPairGenerator kpg;
        kpg = KeyPairGenerator.getInstance("EC","SunEC");
        ECGenParameterSpec ecsp;
        ecsp = new ECGenParameterSpec("secp192r1");
        kpg.initialize(ecsp);

        KeyPair kp = kpg.genKeyPair();
        PrivateKey privKey = kp.getPrivate();
        PublicKey pubKey = kp.getPublic();

        System.out.println(privKey.toString());
        System.out.println(pubKey.toString());
    }

}

3 个答案:

答案 0 :(得分:1)

你的问题是使用java PrivateKey类的toString()方法。 toString()不一定返回对象中的所有数据,只是字符串表示。

因此,在您的情况下,您可以使用getEncoded()方法。 请注意,您的byte []可能包含不可打印的字符,因此您可能需要以可读的形式将其转换为f.e. BASE64。

PrivateKey privKey = kp.getPrivate();
byte[] data = privKey.getEncoded();

//first methode, convert to string
String privKeyString = new String(data);
System.out.println(privKeyString);

//second methode, print all byte values
for(byte value : data)
   System.out.println(value);

另见print byte array

答案 1 :(得分:1)

通常私钥值不会打印到屏幕上。因此,为toString()ECPrivateKey的子类)提供PrivateKey几乎没有意义。打印私钥值当然不安全。

当然可以打印出私钥的秘密部分;打印出secp192r1的其他参数毫无意义。如果需要,您可以从NIST或Certicom的标准文档中轻松检索它们。

ECPrivateKey ecPrivKey = (ECPrivateKey) eckp.getPrivate();
System.out.println(ecPrivKey.getS().toString(16));

请注意,如果只需要使用此方法验证是否使用了正确的私钥,最好在私钥值S上打印哈希值。

答案 2 :(得分:1)

您也可以使用:

System.out.println(Arrays.toString(kp.getPrivate().getEncoded()));