나는 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);
그냥 키 쌍을 생성하려고, 그것은 아마 시점까지 작동합니다 보이 타로
APDU 로그가 있습니까? –
몇 가지 메모 : 'KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163' - 알고리즘과 길이가 일치하지 않습니다. 코드에서 타원 곡선 도메인 매개 변수를 지정합니까? 기본 타원 곡선이 없으므로 새로운 키 쌍을 생성하기 전에 개인 키와 공용 키에 매개 변수를 채워야합니다. – vojta