Ошибка проверки подписи ECDSA на Javascript (эллиптический)

У меня проблема с проверкой подписи ECDSA, сделанной на javacard. Я пытаюсь проверить подпись в Javascript (Elliptic), но проверка всегда терпит неудачу.

Мой апплет (javacard) выглядит так:

//initialization
ecdsa = Signature.getInstance(Signature.ALG_ECDSA_SHA_256, false);
eccKey=SecP256k1.newKeyPair(); //in SecP256k1 the p,a,b,g,r,k are set
eccKey.genKeyPair();

//singing method
ecdsa.init(eccKey.getPrivate(), Signature.MODE_SIGN);

//Generates the signature of all input data.
short lenTmp = ecdsa.sign(buffer, ISO7816.OFFSET_CDATA, (short)1, buffer, 
(short)0);
//I tried also to sigh precomputed hash - same result
/*short lenTmp = ecdsa.signPreComputedHash(buffer, ISO7816.OFFSET_CDATA, 
len, buffer, (short)0); */

apdu.setOutgoingAndSend((short)0, lenTmp);

Я получаю закрытый ключ (e.g. : 3E05E289911E66A8153EE9C15A0AFC109C49207DB9DC4656CC4D092323EA65BC)

Когда я подписываю сообщение (e.g : 0x01)

Получаю подпись в формате DER: 304402205F376BB2B2D48BBB0275099C3B9591F18ECA424DD953EB27FDE37BA819B98F980220539A85B91491E977F6B31B5A76BEF6805BBC3B6481A51C23B9E7C6F39FB70569

Также его проверка прошла успешно на javacard. Но когда я пытаюсь проверить его на nodejs, он всегда терпит неудачу. Мой код выглядит так:

let elliptic = require('elliptic');
let ec = new elliptic.ec('secp256k1');
let keyPair = ec.keyFromPrivate("3E05E289911E66A8153EE9C15A0AFC109C49207DB9DC4656CC4D092323EA65BC");
let privKey = keyPair.getPrivate("hex");
let pubKey = keyPair.getPublic();
let signature = "304402205F376BB2B2D48BBB0275099C3B9591F18ECA424DD953EB27FDE37BA819B98F980220539A85B91491E977F6B31B5A76BEF6805BBC3B6481A51C23B9E7C6F39FB70569";
let msg = 0x01;
let validSig = ec.verify(msg, signature, pubKey);
console.log("Signature valid?", validSig);//returns always false

Кроме того, если я подпишу одно и то же сообщение тем же ключом на nodejs, проверка пройдет успешно.

Более того, я заметил, что в javacard подпись всегда разная, а в elliptic всегда одна и та же, может быть, она всегда выбирает один и тот же случайный k.


person Alexandru Maceasa    schedule 03.05.2019    source источник
comment
Я предполагаю, что ошибка в SecP256k1.newKeyPair(), укажите ее...   -  person Maarten Bodewes    schedule 04.05.2019
comment
Проголосовал за закрытие этого вопроса, так как необходимая информация отсутствует, что делает невозможным ответ на вопрос.   -  person Maarten Bodewes    schedule 07.05.2019


Ответы (1)


Скорее всего, это вызвано тем, что стандартные библиотеки ecdsa в java/go/python/etc. сгенерируйте закодированную подпись der, где библиотека javascript просто объединяет значения R и S подписи. Вот как я решаю эту проблему в своей собственной библиотеке ЗДЕСЬ< /а>. Извините, пример переведен из машинописного текста, но, надеюсь, вы сможете преобразовать его в java/javascript. Событие в Node.js: эта проблема существует. Вот ССЫЛКА на обсуждение, которое в конечном итоге помогло мне понять, как преодолеть разрыв между реализациями в моей собственной работе.

person Konstantin Itskov    schedule 03.05.2019
comment
Я также сделал подпись на javascript (используя тот же закрытый ключ и сообщение), и результат также в формате DER (не только конкатенация r и s), но я всегда получаю одну и ту же подпись: 304402206d55364f9eff56dcff626467920ea8c2fed44653009cde369546cc98da3b2be00220086abcc4a127c5ac1dcb5d7c4da51fca96a75e70cdeeb6bc746010345a691beb - person Alexandru Maceasa; 04.05.2019
comment
Хммм... Помню, у меня была такая же проблема, когда я пытался использовать библиотеку elliptic. В конце концов я решил эту проблему. Вместо этого я решил просто положиться на встроенную в браузер библиотеку crypto.subtle. Извините, не могу помочь с этим. Вообще говоря, подпись всегда должна быть разной из-за случайного фактора внутри нее. Поэтому, если это всегда одно и то же значение, определенно есть проблема. Если вы в конечном итоге переключитесь на subtle.crypto, не стесняйтесь задавать мне дополнительные вопросы. Я проделал много работы со спецификацией для него и довольно хорошо в нем разбираюсь. - person Konstantin Itskov; 06.05.2019