Вычитание BigInteger в JavaCard

Я пытаюсь доказать концепцию в очень ограниченных технологических условиях. Мой вопрос: как эффективно вычесть большие целые числа (представленные в виде байтовых массивов) в карте Java?,

Теперь детали делают задачу сложной. У меня есть доступ к одной смарт-карте. Модель Feitian JavaCOS A22 и работает под управлением Java Card 2.2. Для полной детализации Java Card позволяет использовать очень ограниченное подмножество Java API (а именно, без int, без char и, естественно, без BigInteger), но поддерживает серию криптографических примитивов, которые можно подробно описать в этом списке.,

В частности, моя задача - реализовать классический ElGamal на карте. Я нашел два соответствующих ответа до сих пор. В первом из них Мартен отмечает, что ElGamal не соответствует стандарту, и поэтому необходимо будет реализовать эту функциональность. В этом ответе thotheolh делится ссылкой на реализацию DiffieHellman в Java Card 2.2, основанную на том же принципе: поскольку он не поддерживается изначально, он использует функциональность RSA.

Логика проста: RSA, ElGamal и DiffieHellman полагаются на одну и ту же базовую операцию $a^b mod c$. Основываясь на коде thotheolh, мне удалось добиться генерации ключей. Шифрование происходит из карты, поэтому это не моя проблема. Но расшифровка требует определенного варианта. Для расшифровки $b=p-1-x$, где и $p$, и $x$ являются BigIntegers. Это та точка, в которой я застреваю: как эффективно рассчитать $p-1-x$?

1 ответ

Решение

Ну, на самом деле нет такой вещи, как родной реал BigInteger поддержка JavaCard. Существует BigNumber, но я не думаю, что он будет соответствовать вашим требованиям.

Тем не менее, есть способ предпринять это ограничение.

Существует некоторая библиотека JavaCard, которая позволяет вам иметь дело с произвольными длинными большими целыми числами - проблема в том, что вашему апплету может не хватить памяти. Источники библиотеки находятся здесь, а здесь уже собраны .jar,

Этот подход может работать, но также может быть очень медленным на реальной карте. Однако это не проблема, если вы запускаете такой код в симуляторе только для PoC.

Я понятия не имею, какая у вас IDE, но именно так вы можете добавить эту библиотеку для IntelliJ.


Однако, как отметил Мартен Бодьюс, вам лучше сосредоточиться на вычитании байтов, просто из-за возможной неэффективности любого BigInteger Библиотека JavaCard.


Надеюсь это поможет.

UPD

BigNumber гарантированно будет по крайней мере 8 байтов, но, насколько я пытался это сделать, он позволяет ровно 8 байтов, что является небольшим для хранения некоторых надежных параметров безопасности. Говорят, кошка не содержит безопасного эфира p что равно 57896044618658097711785492504343953926634992332820282019728792003956564821041.

Вы можете попробовать это самостоятельно методом getMaxBytesSupported() просто чтобы убедиться в этом.

Итак, как вы можете видеть, BigNumber является относительно большим для JavaCard, но все же меньше, чем требуется большинству крипто-протоколов.

Как говорили другие, вы не найдете родного Integers или же BigInts в большинстве карт JavaCard даже сегодня.

Тем не менее, для тех, кто через 4 года все еще задается вопросом, JCMathLib фактически реализует эту функцию.

Это не так быстро, как в собственной реализации, но в нем используется криптосопроцессор (где это возможно) и достигается приличная производительность.

Другие вопросы по тегам