2015-03-09 7 views
2

Моя проблема выглядит так. Я создал ключи на карте и на концах терминала. У меня есть на стороне терминала общедоступные и закрытые ключи карты, а также открытые и закрытые ключи терминалов и то же самое на стороне карты (я делаю тесты, поэтому поэтому у меня есть все они на терминале и на карте). Когда я генерирую KeyAgreement (терминальную сторону) для карты как приватную, а для терминала как приватную, секты одинаковы, поэтому поколение в порядке, и я получаю секрет в 24 байта (192 бит). Когда я генерирую секреты на карте (2 случая, например, на терминале), секреты также одинаковы, но они короче - 20 байт (160 бит). Вот коды генерации. терминал:Javacard KeyAgreement отличается от BouncyCastle KeyAgreement

ECPublicKey publicKey; 
ECPrivateKey privateKey; 

...

KeyAgreement aKeyAgree = KeyAgreement.getInstance("ECDH", "BC"); 
aKeyAgree.init(privateKey); 
aKeyAgree.doPhase(publicKey, true); 
byte[] aSecret = aKeyAgree.generateSecret(); 

и сторона карты:

eyAgreement = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH, false); 
short length = terminalEcPublicKey.getW(array, (short) 0); 

keyAgreement.init(cardEcPrivateKey); 
short secretlength = keyAgreement.generateSecret(array, (short)0, length, buffer, (short)0); 

ответ

5

Существует проблема в вашей реализации KeyAgreement.ALG_EC_SVDP_DH в стороне терминала. Правильная длина вывода этого метода соглашения о ключах всегда должна быть 20 байтов, так как SHA-1 выполняется на производном выходе.

Итак, на вашей стороне терминала вы должны выполнить SHA-1 после генерации секретных данных.

+0

Это работает. спасибо – TajnosAgentos

+0

почему он работает так? Карточка не должна этого делать, так зачем терминалу это нужно? – TajnosAgentos

+0

Собственно, карта выполняет SHA-1. generateSecret() делает это для алгоритма ALG_EC_SVDP_DH. – Chooch