2016-12-12 7 views
1

Java Card에서 사용할 192-ECDSA 커브 매개 변수를 어떻게 변환합니까?Java Card 용 ECDSA 커브 매개 변수를 변환하는 방법

p = 6277101735386680763835789423207666416083908700390324961279 
n = 6277101735386680763835789423176059013767194773182842284081 
SEED = 3045ae6f c8422f64 ed579528 d38120ea e12196d5 
c = 3099d2bb bfcb2538 542dcd5f b078b6ef 5f3d6fe2 c745de65 
b = 64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1 
Gx = 188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012 
Gy = 07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811 
+0

스택 오버플로에 오신 것을 환영합니다! 먼저 [둘러보기] (http://stackoverflow.com/tour)를 가져 와서 [좋은 질문을하는 법] (http://stackoverflow.com/help/how-to-ask)을 배우고 [ Minimal, Complete, Verifiable] (http://stackoverflow.com/help/mcve) 예제를 참조하십시오. 우리가 당신을도 더 쉬울 것입니다. 당신은 이미 무엇을 했습니까? –

+0

EC 곡선의 이름을 말씀해 주시겠습니까? 'Prime192v1'입니까? 이 값들은 어디에서 찾았습니까? – vojta

답변

3

당신은 그것 때문에 명명 규칙의 부족 것으로 보인다보다 더 어렵 자바 카드 매개 변수로 값을 매핑해야합니다. 또한 매개 변수 중 일부는 십진수이지만 Java Card의 경우 16 진수 여야합니다.

당신이 당신의 매개 변수를 초기화하기 위해서 원하는 ECKey의 자바 카드의 단계로이 단계를 해결하자

필드를 주요p

키의 key.setFieldFP에 해당합니다. 귀하의 값은 소수이지만, 당신은 16 진수 할 필요가 : n

키의 key.setR에 해당

private final static byte[] fp = new byte[] { 
     (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFE, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF 
    }; 

주문. 귀하의 값은 소수이지만, 당신은 16 진수 할 필요가 :

private final static byte[] r = new byte[] { 
     (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x99, (byte)0xDE, (byte)0xF8, (byte)0x36, (byte)0x14, (byte)0x6B, (byte)0xC9, (byte)0xB1, (byte)0xB4, (byte)0xD2, (byte)0x28, (byte)0x31 
    }; 

계수 a

효과적인 prime192v1으로 계산을하기 위해 -3 (모듈 p)로 설정됩니다. 이것은 당신이 알아야 할 사실입니다.

private final static byte[] a = new byte[] { 
     (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFE, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFC 
    }; 

계수는 자바 카드에서 key.setB 때문에 b

은 간단합니다 : 16 진수로, 그것은이다. 당신은 두 좌표를 연결하여 압축 형태로 변환하고 앞에 추가해야하기 때문에,

private final static byte[] b = new byte[] { 
     (byte)0x64, (byte)0x21, (byte)0x05, (byte)0x19, (byte)0xE5, (byte)0x9C, (byte)0x80, (byte)0xE7, (byte)0x0F, (byte)0xA7, (byte)0xE9, (byte)0xAB, (byte)0x72, (byte)0x24, (byte)0x30, (byte)0x49, (byte)0xFE, (byte)0xB8, (byte)0xDE, (byte)0xEC, (byte)0xC1, (byte)0x46, (byte)0xB9, (byte)0xB1 
    }; 

발전기 포인트 G

가 까다 롭습니다 : 당신은 16 진수 문자열 = 필요하지 전환으로 그것을 가지고 접두어 04 (압축되지 않은 양식의 표시기). 일부 카드는 다른 형식을 지원하지만, 보장 할 수 없습니다, 그래서 uncompressed form. 당신의 좌표 = 이미 필요 없음 변환 진수 없다 사용하는 것이 현명하다 :

private final static byte[] g = new byte[] { 
     (byte)0x04, (byte)0x18, (byte)0x8D, (byte)0xA8, (byte)0x0E, (byte)0xB0, (byte)0x30, (byte)0x90, (byte)0xF6, (byte)0x7C, (byte)0xBF, (byte)0x20, (byte)0xEB, (byte)0x43, (byte)0xA1, (byte)0x88, (byte)0x00, (byte)0xF4, (byte)0xFF, (byte)0x0A, (byte)0xFD, (byte)0x82, (byte)0xFF, (byte)0x10, (byte)0x12, (byte)0x07, (byte)0x19, (byte)0x2B, (byte)0x95, (byte)0xFF, (byte)0xC8, (byte)0xDA, (byte)0x78, (byte)0x63, (byte)0x10, (byte)0x11, (byte)0xED, (byte)0x6B, (byte)0x24, (byte)0xCD, (byte)0xD5, (byte)0x73, (byte)0xF9, (byte)0x77, (byte)0xA1, (byte)0x1E, (byte)0x79, (byte)0x48, (byte)0x11 
    }; 

공동 인자의 시간

가의 key.setK에 해당 키. 일반적으로이 매개 변수는 생략되며 기본값은 1입니다.

키 초기화

: 전술 한 바와 같이

제공은 당신이 당신의 ECkey이 방법 init을 할 수 private static final byte 배열과 같은 매개 변수를 선언 : 당신은 궁금 할

key.setFieldFP(fp, (short)0, (short)fp.length); 
key.setR(r, (short)0, (short)r.length); 
key.setA(a, (short)0, (short)a.length); 
key.setB(b, (short)0, (short)b.length); 
key.setG(g, (short)0, (short)g.length); 

무엇 SEEDc 값은 자바 카드 매개 변수를 전혀 계산하지 않기 때문에 의미가됩니다.

SEED은 임의의 값으로 다른 매개 변수를 생성하는 데 사용됩니다. SHA-1 해시는 SEED에서 계산되었습니다. 그 표기법은 c입니다. 값 abc에서 파생되었습니다.

전체 EC 암호화의 가장 문제가되는 부분은 입니다. NIST가 NIST에서 시드를 진정으로 무작위로 선택 했습니까?We don't know. 결과 곡선이 어떤 식 으로든 "쉽게"될 수 있기 때문에 암호 해독 또는 서명 위조에 대한 이점을 얻기 위해 선택했을 수 있습니다.

+0

@OrangeDog Java Card의'BigInteger'는 보증하지 않습니다 ...'byte'와'short' 만 있으면됩니다. – vojta

+2

@OrangeDog Java Card와 Java는 두 가지 언어입니다. 구문은 다소 비슷하지만 라이브러리는 다릅니다. [javadoc] (https://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacard/security/package-summary.html)을보십시오 ... – vojta

+2

NIST를 신뢰하지 않으면 곡선 다음 brainpool 자바 카드에 효율적으로 일하는 좋은 대안입니다 –