Моя проблема выглядит так. Я создал ключи на карте и на концах терминала. У меня есть на стороне терминала общедоступные и закрытые ключи карты, а также открытые и закрытые ключи терминалов и то же самое на стороне карты (я делаю тесты, поэтому поэтому у меня есть все они на терминале и на карте). Когда я генерирую 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);
Это работает. спасибо – TajnosAgentos
почему он работает так? Карточка не должна этого делать, так зачем терминалу это нужно? – TajnosAgentos
Собственно, карта выполняет SHA-1. generateSecret() делает это для алгоритма ALG_EC_SVDP_DH. – Chooch