Nano Hash - криптовалюты, майнинг, программирование

Java Card - не удалось выбрать апплет

Ниже приведен код шифрования DES. Я получаю сообщение об ошибке 0x6999: «Ошибка выбора апплета».

package JCardDES;

import javacard.framework.*;
import javacard.security.*;
import javacardx.crypto.*;

public class JCard_DES extends Applet
{
     // globals
     DESKey deskey;
     Cipher cipherCBC;
     final short dataOffset = (short) ISO7816.OFFSET_CDATA;
     static byte[] TrippleDESKey = {(byte) 0x38, (byte) 0x12, (byte) 0xA4,
          (byte) 0x19, (byte) 0xC6, (byte) 0x3B, (byte) 0xE7, (byte) 0x71, (byte) 0x00, (byte) 0x12, (byte) 0x00,
          (byte) 0x19, (byte) 0x80, (byte) 0x3B, (byte) 0xE7, (byte) 0x71, (byte) 0x01, (byte) 0x12, (byte) 0x01,
          (byte) 0x01, (byte) 0x01, (byte) 0x03, (byte) 0xE7, (byte) 0x71};

     // constructor,
     // initialization
     private JCard_DES(byte bArray[], short bOffset, byte bLength)
     {
          try {
             deskey = (DESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES3_3KEY, false);
             cipherCBC = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, false);
          }
          catch (CryptoException e) {
             ISOException.throwIt((short) ((short) 0x9000 + e.getReason()));
          }

          if (bArray[bOffset] == 0) 
          {
               register();
          }
          else 
          {
               register(bArray, (short)(bOffset+1), bArray[bOffset]);
          }
     }

     // install
     public static void install(byte bArray[], short bOffset, byte bLength)
     {
          new JCard_DES(bArray, bOffset, bLength);
     }

     public void process(APDU apdu)
     {
          byte[] buf = apdu.getBuffer();

          if (selectingApplet())
          {
               return;
          }

          doTrippeDES(apdu);
     }

     // DES encryption
     private void doTrippeDES(APDU apdu)
     {
          byte a[] = apdu.getBuffer();

          short incomingLength = (short) (apdu.setIncomingAndReceive());
          if (incomingLength != 24) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);

          deskey.setKey(TrippleDESKey, (short)0);
          cipherCBC.init(deskey, Cipher.MODE_ENCRYPT,new byte[]{0,0,0,0,0,0,0,0},(short)0,(short)8);
          cipherCBC.doFinal(a, (short) dataOffset, incomingLength, a, (short) (dataOffset + 24));
          cipherCBC.init(deskey, Cipher.MODE_DECRYPT,new byte[]{0,0,0,0,0,0,0,0},(short)0,(short)8);
          cipherCBC.doFinal(a, (short) (dataOffset + 24), incomingLength, a, (short) (dataOffset + 48));

          // send results
          apdu.setOutgoing();
          apdu.setOutgoingLength((short) 72);
          apdu.sendBytesLong(a, (short) dataOffset, (short) 72);
     }
}

Это странно, потому что без кодов инициализации в блоке try/catch нет проблем с выбором апплета.

Мой файл сценария (сценарий APDU)

powerup;
// Select JCard_DES
0x00 0xA4 0x04 0x00 0X06 0XFC 0X74 0X41 0XA1 0X9B 0X63 0x7F;

Пожалуйста, помогите мне, где я ошибаюсь, так как я новичок в программировании Java Card

Спасибо


Ответы:


1

Длина вашей команды (Lc) неверна. Должно быть 0x07 вместо 0x06.

0x00 0xA4 0x04 0x00 0X07 0XFC 0X74 0X41 0XA1 0X9B 0X63 0x7F
01.09.2014
  • Если ваши данные (AID) 0XFC 0X74 0X41 0XA1 0X9B 0X63 0x7F, то ваш Lc/P3 должен быть 0x07 (7 байт). 01.09.2014
  • Мои ДАННЫЕ: 0XFC 0X74 0X41 0XA1 0X9B 0X63. CLA = 0x00 INS = 0xA4 P1 = 0x04 P2 = 0x00 LC = 0X06 DATA = 0XFC 0X74 0X41 0XA1 0X9B 0X63 LE = 0x7F 01.09.2014
  • Lc — длина данных команды, Le — длина ожидаемых данных. Вы можете отправлять Lc или Le только в одном APDU. Если ваши данные/AID имеют вид 0XFC 0X74 0X41 0XA1 0X9B 0X63, удалите последний байт 0x7F из APDU. После успешного ответа вы можете отправить команду GET RESPONSE с Le (обычно Le равен SW2 или находится в диапазоне от 1 до SW2). 01.09.2014
  • Вот результат после удаления 0x7F из APDU: Вызов apdutool на D:\IT\RISET\JAVA\NetBeansProjects\JCard_DES/scripts/jcard_des.scr ... Длина входных данных != Lc вокруг строки 5. 02.09.2014
  • Вы определенно можете иметь APDU с Lc и Le. Le=7F очень странный, и я никогда такого не видел. Просто введите 0x00 для Le, это означает: верните все, что у вас есть. 02.09.2014
  • Это результат, если Le=0x00: CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 06, fc, 74, 41, a1, 9b, 63, Le: 00, SW1: 69, SW2 : 99 -> SW = 6999 07.09.2014

  • 2

    код ошибки 0x6999 означает, что выбор апплета не удался. Чтобы определить правильность вашей помощи и уникальность. Обратите внимание на правила внутри иногда выберите помощь появится автоматически, когда концепция завершения.

    28.05.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..