2016-06-01 83 views
3

我試圖讓Elliptic Curve Diffie Hellman在JavaCard(版本2.2.1)上工作。Elliptic Curve Diffie Hellman如何在JavaCard上與Java結合使用?

在JavaCard的,我有以下的代碼現在:

byte temp[] = new byte[100]; 
byte secret[] = new byte[100]; 
byte size = buf[ISO7816.OFFSET_LC]; 

Util.arrayCopy(buf, ISO7816.OFFSET_CDATA, temp, (byte) 0, size); 

// the public key is in temp 
short len = dh.generateSecret(temp, (byte) 0, size, secret, (byte) 0); 

Util.arrayCopy(temp, (byte) 0, buf, ISO7816.OFFSET_CDATA, size); 
//Util.arrayCopy(secret, (byte) 0, buf, ISO7816.OFFSET_CDATA, len); 
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, size); 

我初始化dh如下:

keyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163); 
keyPair.genKeyPair(); 
dh = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH, false); 
dh.init(keyPair.getPrivate()); 

所有這一切似乎工作,除了dh.generateSecret電話,小程序似乎只是在崩潰。如果我離開呼叫並返回其他數據,那很好。我在其中導入由終端發送的數據。在終端中,我有以下內容:

// generate an ecdh keypair 
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC"); 
keyGen.initialize(163); 
KeyPair keyPair = keyGen.generateKeyPair(); 

// initialize DH 
KeyAgreement dh = KeyAgreement.getInstance("ECDH"); 
dh.init(keyPair.getPrivate()); 

//byte encKey[] = keyPair.getPublic().getEncoded(); 

// X9.62 encoding, no compression 
int qLength = (163+7)/8; 
byte[] xArr = ((ECPublicKey) keyPair.getPublic()).getW().getAffineX().toByteArray(); 
byte[] yArr = ((ECPublicKey) keyPair.getPublic()).getW().getAffineY().toByteArray(); 
byte[] enc2 = new byte[1+2*qLength]; 
enc2[0] = (byte) 0x04; 
System.arraycopy(xArr, 0, enc2, qLength - xArr.length, xArr.length); 
System.arraycopy(yArr, 0, enc2, 2* qLength - yArr.length, yArr.length); 

byte res[] =send((byte) 0x00, enc2).getData(); 

我嘗試了幾件事情。現在,發送公鑰的代碼嘗試按JavaCard文檔中指定的X9.62編碼(未壓縮)對其進行編碼。不過,我也嘗試了默認的encode方法,它給出了完全相同的結果。

我似乎無法從JavaCard中獲得任何錯誤。有誰知道發生了什麼問題?或者是否有人有關如何在JavaCard上進行密鑰交換的工作示例?

+0

你有任何APDU日誌嗎? –

+1

只需注意幾點:'KeyPair.ALG_EC_FP,KeyBuilder.LENGTH_EC_F2M_163' - 算法和長度不匹配。你是否在你的代碼中指定了橢圓曲線域參數?沒有默認的橢圓曲線,因此您應該在生成新的密鑰對之前將這些參數填充到私鑰和公鑰中。 – vojta

回答

0

由於Vojta開發已經指出:

keyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163); 

只是嘗試生成密鑰對,它可能工作到一個點。但是Fp曲線與F2m曲線不同,據我所知,沒有163位Fp曲線(據我所知)。

這意味着你從來沒有真正安裝過域參數,除非你自己創建了,並且我會盡可能地調用它。

使用具有已知密鑰長度的Fp曲線並至少爲公鑰設置參數(對於JCOP卡,您可能必須將它們設置爲私鑰)。您通常會使用224位密鑰或更高的密鑰來確保安全。