从智能卡发送/接收数据

Posted

技术标签:

【中文标题】从智能卡发送/接收数据【英文标题】:Send / Receive data from SmartCard 【发布时间】:2013-01-22 10:03:30 【问题描述】:

我最近买了一个智能卡读卡器(Gemplus USB Smart Card Reader),它带有一些卡。我一直在阅读有关如何使用它们的几个教程,但我有几个问题。我正在尝试与智能卡通信(发送 APDU)但没有成功。我在虚拟智能卡中安装了一个小程序(使用 Netbeans)。

我的处理方法是这样的:

    byte[] buffer = apdu.getBuffer();
    byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
    byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);

    if (CLA != HW_CLA)
        ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
            
    switch (INS) 
        case HW_INS_ADD:               
            add(apdu);
            break;
        case HW_INS_SUBTRACT:                
            subtract(apdu);
            break;
        default:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
    

addsubtract 方法在声明的变量(余额)中添加或减去 5 个单位。我想在进行操作后将余额值保存到卡中。有谁知道我怎样才能将该值写入卡中?如果可能的话,我以前怎么读?

感谢任何帮助。 谢谢。

【问题讨论】:

【参考方案1】:

持久性(持久性内存意味着 EEPROM 或闪存)字段中的任何状态都将保留,直到 Applet 实例 被删除。非瞬态数组元素中的状态也是如此。当然,您需要保留对数组的持久引用才能做到这一点。进行上下文切换后,瞬态(瞬态表示 RAM)CLEAR_ON_DESELECT 数组的内容将被清除,例如当另一个 Applet 被选中(并且当前的 Applet 被取消选中)或发生软或硬复位时。当然CLEAR_ON_RESET 阵列只会在重置时被擦除(包括断电)。

基本上所有对象实例都存在于持久内存中,这意味着任何使用new 创建的对象实例。对于由 API 未明确指定结果是瞬态的平台创建的任何对象也是如此。 APDU 缓冲区本身在每次调用process 方法时总是被清除。

如果您想存储余额之类的东西,您需要了解 Java Card 事务机制,尤其是在您的操作不是原子操作的情况下。

请注意,当包含模拟器的进程结束时,许多 Java Card 模拟器 不会保留任何状态。这并不能很好地表示真正的 Java Card 实现的行为方式。

【讨论】:

感谢您分享您的知识 owlstead,现在我发现使用 java 卡更容易了。问候。 不客气!不要忘记投票和/或接受您喜欢的答案。 我更改了文本以明确瞬态意味着 RAM,非瞬态与持久性相同【参考方案2】:

答案很简单:只需将字段添加到您的 JavaCard 小程序类。一旦“启动”Javacard 小程序“运行”,直到它们被卸载。

当然,“运行”是错误的术语——它们保持其内部状态,如果收到下一个 APDU,则之前来自 APDU 的状态仍然存在,即使在收到第一个 APDU 后卡已从智能卡读卡器中取出APDU。

【讨论】:

但是当我取出卡时,字段值丢失了。我需要卡片在与读卡器断开连接后保留字段值。有没有办法永久保存这个值? 我想我误解了卡片的功能。您的意思是,如果我将小程序安装到智能/Java 卡中,即使将其从读卡器中删除,它也会保留信息,直到小程序被卸载? 是的,所有字段值和对象实例都默认在卡的闪存中。 感谢罗伯特的帮助和时间。【参考方案3】:

实际上,您正在保存这些值 :) 声明为瞬态或局部变量的值不存储在 EEPROM 中,否则所有值都存储在 EEPROM 中并且是非易失性的。取出卡后,您可以在插入卡时访问它们。

但是从您发布的代码中,我无法说出您使用的是什么类型的变量。如果您想要准确的答案,只需发布​​完整的代码,我们将准确回答您。

【讨论】:

以上是关于从智能卡发送/接收数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Wear OS 智能手表和 Windows PC 之间发送和接收数据

C# PCSC-sharp 发送/接收带有数据的自定义命令

包从颤振智能手表接收心率数据

如何从外部附件异步发送和接收数据

如何将结果数据从广播接收器发送到活动

I2C 从机发送完数据后,接收不到主机(接收到倒数第二个数据后)发送的停止条件