标签: javacard

从字节数组创建PrivateKey

有没有办法从字节数组生成PrivateKey?我使用getEncoded()方法得到了这个字节数组,但现在我必须将它转换回PrivateKey.

谢谢,Vuk

java cryptography javacard

7
推荐指数
2
解决办法
2万
查看次数

字节数组的快速位移 - CMAC子键

我需要在JavaCard中尽可能快地实现16字节数组的左移位.

我试过这段代码:

private static final void rotateLeft(final byte[] output, final byte[] input) {
         short carry = 0;
         short i = (short) 16;
         do {
             --i;
             carry = (short)((input[i] << 1) | carry);
             output[i] = (byte)carry;
             carry = (short)((carry >> 8) & 1);
         } while (i > 0);
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何提高性能?我正在考虑一些Util.getShort(...)Util.setShort(...)魔法,但我没有设法让它比上面的实现更快.

这是CMAC子项计算的一部分,不幸的是,它经常完成.如果你知道一些更快的计算CMAC子项的方法(一个循环中的子键或类似的东西),请告诉我.

performance cryptography bit-manipulation bit-shift javacard

7
推荐指数
1
解决办法
562
查看次数

哪些对象在 Java Card 中是持久的?何时?

这个问题是双重的,但希望回答起来不会太长,尽管它本身很长。不过,请随意回答其中的一部分,很抱歉使它如此详尽!

  • 哪些对象被持久化?哪些对象是瞬态的?
  • 对象什么时候被持久化?

对于第一部分,问题适用于:

  • 存储在一个对象中的对象Applet
  • 传递存储在一个对象中的对象Applet
  • 仅存储在堆栈变量中的对象(不从任何引用,即使是传递性引用Applet
  • 存储在使用以下命令构建的数组中的对象makeTransientObjectArray
  • 传递存储在数组中的对象makeTransientObjectArray(例如,存储在 a 中存储的对象的成员变量中makeTransientObjectArray

对于第二部分,它的适用取决于第一个问题的答案。例如:

  • 我假设直接存储在瞬态对象数组中的对象不会被持久化。在这种情况下,假设堆栈上的对象被持久化,那么存储在那里的对象什么时候变得不持久?new Object当放入瞬态对象数组时,它是持久化的还是非持久化的?
  • 如果一个对象同时具有来自瞬态对象数组和小程序的引用,并且小程序引用被删除,那么该对象是否会被取消持久化?

先感谢您!


我已经研究了 JCRE 规范 v2.2.2 (我正在使用的版本),但其中有一些不清楚的地方(因此这个问题很详尽,因为我觉得这更适合 Q/A 风格论坛):

  • 第 2-2 页提到,当对象以传递方式存储在Applet. 然而,Glossary-7 指出对象默认是持久的。这种差异可能看起来不可观察,但无论如何都会影响卡电源循环时是否需要进行垃圾收集。
  • 第 5-1 页指出,瞬态对象的字段决不能存储在持久内存中。但它没有说明这对于瞬态对象数组中的传递对象是否也适用,例如。存储在瞬态对象数组中的对象字段中的对象。
  • 当一个对象的引用同时存储在瞬态对象数组和Applet.

这三个问题分别相当于:

  • 第 1 部分要点 3 和 5(以及第 2 部分要点 1,具体取决于答案)
  • 第 1 部分要点 5
  • 第 2 部分要点 2

java smartcard javacard

7
推荐指数
1
解决办法
1191
查看次数

SIM卡入门

我想开始使用手机和SIM卡.我在互联网上搜索了很多但仍有一些问题!

我想知道 :

1.(U)SIM卡和智能卡有什么区别?

据我所知,SIM和USIM都是一种智能卡.对?如果是这样,常规智能卡和SIM卡之间是否存在特定的硬件差异?或者所有不同之处在于常规智能卡上没有的SIM卡上的特定应用程序(包含IMSI,KI等)?

2. SIM卡和USIM卡有什么区别?

如下所示(从这里),它提到SIM用于2G而USIM用于3G,但它说SIM也兼容3G,USIM向后兼容2G!那么区别是什么呢?USIM卡中有一个特定的应用程序,SIM卡中没有这个应用程序吗?或者是其他东西?

在此输入图像描述

3.支持或不支持3G或4G是(U)SIM卡的一项功能,还是电信系统的一项功能,还是我的手机功能?还是全部?

在另一个世界中,如果我有2G SIM卡,使用3G协议需要更换SIM卡吗?而且,如果我有一个用于3G的SIM卡,我是否需要更改它以使用4G通信?或者我只需要在其上安装applet?

或者说不支持3G或4G的手机,它只需要一个应用程序?还是需要硬件元素?

4.对于智能卡入门,建议您阅读Java卡规范,ISO 7816全球平台规范.现在,对于(U)SIM卡,我必须搜索哪些规格?我应该知道并学习如何开发它们?

最后一个!

5.所有新的3G/4G(U)SIM卡都是一种Java卡吗?(它们都有JCVM吗?)

gsm smartcard javacard sim-card

6
推荐指数
1
解决办法
2261
查看次数

Javacard - 垃圾收集过程中的电力损失

我注意到我的智能卡上有一些非常奇怪的行为(NXP J2E145,J3A081,带有Omnikey 5121读卡器的J3C145):在调用JavaCard方法后立即断电

JCSystem.requestObjectDeletion()
Run Code Online (Sandbox Code Playgroud)

可能会损坏卡:在大约10%的这种断电后,ATR命令非常慢(1000毫秒),我对任何其他APDU(小程序选择,卡管理器认证等)都没有响应.

我知道requestObjectDeletion()的行为取决于供应商的具体实现,所以我的问题非常广泛和开放......

垃圾收集是否"通常"在一次交易中处理?

是否有任何"官方"建议不要在可能的断电情况下调用requestObjectDeletion()?

恩智浦有没有类似的卡片经验?

编辑:

  • 我所有智能卡上的JCSystem.isObjectDeletionSupported()== true.
  • 当尝试连接到损坏的卡的卡管理器小程序时,Eclipse IDE中的JCOP shell报告:

    ATR:3BFB9600008131FE454F4450204D41502053414D3E

    ATR:T = 1
    jcshell:终端未知问题.最后一个终端错误:由于I/O设备错误,无法执行请求.

garbage-collection transactions smartcard javacard

6
推荐指数
1
解决办法
798
查看次数

Java Card 小程序、安全数据传输和安全通道

我想以一种方式编写我的小程序,使其 APDU 命令和状态字在我的卡和我的读卡器之间的传输通道中不清楚。我的意思是我不想将 APDU 命令和响应发送为第三方的纯文本。

我想我有两个选择:

  1. 在卡上选择我的小程序后,对于所有其他命令,对 APDU 命令的数据部分执行加密功能,并在卡上对其进行解密,然后对其进行分析。请注意,我无法使用这种方法加密整个命令,因为结果可能与另一个SELECTAPDU 命令冲突,并且卡的 SDSELECT错误地将其识别为命令。那正确吗?

它的图表:

在此处输入图片说明

  1. 使用SD安全通道:据我所知的安全的信道的装置:全体APDU命令响应以加密的形式发送(即,它们在源(安全域/卡阅读器)和解密加密的目的地(与危机干预域/卡Reader). 是吗?据我所知,SD 在这个机制中执行加密方法的角色,我的小程序和 SD 之间的通信是简单的(下图),对吧?

它的图表: 在此处输入图片说明

有没有其他办法?

似乎第一个解决方案还不够好,因为:

  1. 我必须自己实现!:)
  2. 我们无法对第三方隐藏所有部分的命令和响应。(我们只能隐藏数据)

我对吗?

现在,假设我想确保我的小程序仅适用于使用安全通道传输的 APDU 命令。我想我又有两个选择:

  1. 将卡置于SECURED状态。由于用户在这种状态下无法使用纯文本 APDU 命令与卡通信(对吗?),因此他必须使用安全通道将命令发送到我的小程序。对?如果不正确,是否有任何方法可以强制 SD 仅使用安全通道?

  2. 将卡保持在它所处的任何生命周期(例如 OP_READY),但相反,在接收任何 APDU 命令时,检查CLA部分以查看它是否是安全传输的!(这可能吗?CLA来自安全通道的部分 APDU 命令和其他命令之间有什么区别吗?我说得对吗?)

有没有其他办法?

最后是主要问题:

如何使用 SD 与我的小程序进行安全通信?因为我认为我必须使用 GlobalPlatform 类(我是吗?),所以我查看了它的 API-s。我getSecureChannel在名为org.globalplatform.GPSystem. 我的方式正确吗?我必须使用这种方法吗?

我知道回答这个问题可能太长了,但我相信它不仅为我,也为其他未来的观众澄清了很多问题。

我很感激任何机构为我解决了这个问题。

一个示例小程序更可观。

javacard globalplatform

6
推荐指数
2
解决办法
2924
查看次数

Java Card中的ALG_RSA_NOPAD

为了有效地计算Java Card中的正方形,我想使用ALG_RSA_NOPAD指数等于2和模数大于预期结果的算法(因此模块化减少没有影响).

但我无法使用该算法ALG_RSA_NOPAD.事实上,当我打电话的方法doFinal(),我收到了CryptoException这是ILLEGAL_VALUE.在Java Card 2.2.2规范中,它说:

CryptoException.ILLEGAL_USE如果满足以下条件之一:

•此Cipher算法不填充消息,并且消息不是块对齐的.

•此Cipher算法不填充消息,并且inBuff或update()方法中未提供输入数据.

•不支持输入消息长度.

•解密数据不受适当填充字节的限制.

所以我得出结论,我的消息不是块对齐的.但是这个算法的块对齐意味着什么呢?我的信息的长度是否与模数相同?指数?我尝试了不同的东西,但我没有找到......

相应的代码:

   byte[] res_RSA = new byte[(short) 0x0080];
   KeyPair rsa_KeyPair = new   KeyPair(KeyPair.ALG_RSA,KeyBuilder.LENGTH_RSA_1024);
        rsa_KeyPair.genKeyPair();
   RSAPublicKey rsa_PubKey; rsa_PubKey = (RSAPublicKey) rsa_KeyPair.getPublic();


    rsa_PubKey.setExponent(new byte[]{(byte) 0x02}, (short) 0x00000, (short) 0x0001);
    rsa_PubKey.setModulus(new byte[] { (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, …
Run Code Online (Sandbox Code Playgroud)

java cryptography javacard

6
推荐指数
1
解决办法
417
查看次数

找不到类javacard.framework.service.CardRemoteObject

我是Java Card Platform的新手,所以请耐心等待我.我正在尝试为Java Card 3平台开发RMI应用程序.我的IDE是Eclipse,我的操作系统是Windows 10.我首先创建一个简单的界面,IContor.java负责增加,减少等某些值.

这是我的界面:

package sid;
import java.rmi.Remote;
import java.rmi.RemoteException;

import javacard.framework.UserException;

public interface IContor extends Remote{
   public void Incrementer()throws RemoteException,UserException;
   public void Decrementer()throws RemoteException,UserException;
   public byte GetValue()throws RemoteException,UserException;
   public void Init(byte value)throws RemoteException,UserException;
}
Run Code Online (Sandbox Code Playgroud)

然后我提供了这个接口的实现,我命名为Contor.java:

package sid;

import java.rmi.RemoteException;
import javacard.framework.UserException;
import javacard.framework.service.CardRemoteObject;

public class Contor extends CardRemoteObject implements IContor {
   private byte contor = 0;
    @Override
    public void Incrementer() throws RemoteException, UserException {
        ++contor;
    }

    @Override
    public void Decrementer() throws RemoteException, …
Run Code Online (Sandbox Code Playgroud)

java eclipse windows rmi javacard

6
推荐指数
1
解决办法
382
查看次数

使二进制加法的行为类似于(压缩)十进制加法

我目前正在开发一个限制性环境,其中允许的唯一类型是:

byte, byte[], short, short[].
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定我无法导入外部库,因为我正在研究JavaCard,并且已经尝试过这样的事情,但结果并不好.

所以,在这里我必须管理一个大小为6字节的字节数组,它代表卡的余额(欧元),最后一个字节是美分,但现在这并不重要.

鉴于我无法访问整数,我不知道如何以我想要的方式添加两个字节.

我们举个例子:

用户输入(添加)0x00 0x00 0x00 0x00 0x00 0x57,这对用户来说意味着增加57美分.我们现在说平衡是0x00 ... 0x26.

我希望能够创建一种方法,可以修改平衡数组(带有进位),添加后,分数为83,并表示0x83.我也必须处理减法,但我想我之后可以自己解决这个问题.

我的第一个猜测是掩盖每个字节的每个数字,并且首先单独工作,但这让我无处可去.

我显然不是要求一个完整的解决方案,因为我相信我的问题几乎是不可能的,但如果你对如何处理这个问题有任何想法,我将非常感激.

那么如何在Java Card上相互添加两个包含二进制编码小数的数组呢?


编辑1:常见的数组如下所示:

{ 0x00 , 0x00 , 0x01, 0x52, 0x45, 0x52}
Run Code Online (Sandbox Code Playgroud)

并且代表15 254€和52美分的大端BCD编码整数.


编辑2:嗯,我怀疑,我的卡不支持包framework.math,所以我不能使用BCDUtil或BigNumbers,这将是有用的.

java javacard bcd

6
推荐指数
1
解决办法
175
查看次数

将Java Applet CAP文件转换为*.class以进行反编译

这是一个CAP文件,可能包含恶意软件代码,没有源代码,也没有导出文件.

它是旧平台版本的CAP文件,即GP211.

我在Classic JVM和Dalvik中拥有丰富的Java逆向工程经验.但Java Card是较不受欢迎且更接近的平台.大多数工具用于CLASS/JAR或DEX,而不是CAP.

我找到了几个可以反汇编 CAP文件的工具(包括一些模拟JCOP的虚拟机),但是CAP非常大,使用汇编代码对我来说过于复杂和缓慢.

而且我们不能简单地做"CAP文本字节码 - > Notepad ++ - >一些Java字节码编辑器 - > Java字节码".
CAP字节码和Java字节码之间的差异太大.不仅仅是方法表,它还有大量不同的操作码.
只需反编译Java Card Kit 的converter.jar(它是一个转换CLASS - > CAP的工具),看看转换是一个非常复杂的过程.

我需要一些自动转换器.

同时,我开发了一套智能卡解决方案和"CAP反编译器"将是一个很好的部分.
是的,我打算写.
我计划从一侧在Javassist之上构建它,从第二个构建一些CAP反汇编库,从第三个构建一些标准Java反编译器(-s).

但我应该确定没有类似物.

问题在这里:
地球上是否有一些工具可以将Java Card*.cap转换为Java*.class(或直接反编译*.cap)或不?
我不是要求一个库(我发现了一些),我要求一个工具.Runnable接口.

(如果你知道这个字节码转换中的一些陷阱,我将不胜感激,如果你将它描述给我.现在我把它看作只是一个复制一个操作码列表到另一个有巨人if...else if...else if...else if...switch...case...case...case树(和一些misc员工,即转换)访问修饰符,字段等).

reverse-engineering smartcard javacard jcop

6
推荐指数
1
解决办法
905
查看次数