2014-06-24 54 views
1

我試圖運行這個pdf中的代碼。例如,對於ECCKeyGeneration,得到以下輸出,而不是圖1中的PDF:在Java SE 1.7中使用ECC

[email protected] 
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) 

私鑰不印刷到控制檯/屏幕。相反,它會顯示「[email protected]」,如上所示。造成這種情況的原因是什麼?

下面是代碼,如果你想測試:

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()); 
    } 

} 
+0

最好不要與ECC混淆EC爲以後意味着什麼很大的不同。 –

+0

可用的最近標籤,這就是我選擇它的原因:/ – Mehmed

+0

你知道KeyPairGenerator.genKeyPair()產生一個* random *密鑰對,其中* random *表示每次運行它時該值都會不同。 –

回答

1

通常私有密鑰值不會被打印到屏幕上。因此,爲ECPrivateKeyPrivateKey的子類)提供toString()沒有什麼意義。打印私鑰值當然是不安全的。

當然可以打印出私鑰的祕密部分;打印secp192r1的其他參數沒有多大意義。如果需要,您可以從NIST或Certicom的標準文件中輕鬆檢索它們。

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

注意,你最好打印出了私有密鑰值S的哈希,如果你只是需要這個驗證正確的私鑰被使用。

+0

感謝您的回答。我得到邏輯和私鑰:) – Mehmed

+0

我需要將私鑰存儲在數據庫中,然後再次需要使用它。如何使用上述代碼將原始私鑰對象轉換爲字符串後檢索? – Bunny

+0

請另外提問。 –

1

你的問題是與Java專用密鑰類的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

您也可以使用:

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