2016-06-01 5 views
3

나는 Elliptic Curve Diffie Hellman이 JavaCard (버전 2.2.1)에서 작동하도록 노력하고 있습니다.Elliptic Curve Diffie Hellman은 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에서 키 교환을 수행하는 방법에 대한 실례를 가진 사람이 있습니까?

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

그냥 키 쌍을 생성하려고, 그것은 아마 시점까지 작동합니다 보이 타로

+0

APDU 로그가 있습니까? –

+1

몇 가지 메모 : 'KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163' - 알고리즘과 길이가 일치하지 않습니다. 코드에서 타원 곡선 도메인 매개 변수를 지정합니까? 기본 타원 곡선이 없으므로 새로운 키 쌍을 생성하기 전에 개인 키와 공용 키에 매개 변수를 채워야합니다. – vojta

답변

0

이미 지적했다. 그러나 Fp 커브는 F2m 커브와 다르며 제 지식에는 163 비트 Fp 커브가 없습니다 (어쨌든 알고 있습니다).

이것은 사용자가 직접 생성하지 않는 한 도메인 매개 변수를 실제로 설치하지 않았 음을 의미하며 그럴 가능성이 낮습니다.

키 길이가 알려진 Fp 커브를 사용하고 적어도 공개 키는 매개 변수를 설정하십시오 (JCOP 카드의 경우 개인 키에도 설정해야 할 수도 있음). 일반적으로 보안을 위해 224 비트 이상의 키 크기를 사용합니다.