在我的项目中,我想在智能卡上编写生物识别数据(如指纹模板).经过一番精心研究后,我为我的项目选择了Java卡.但我是这个平台的新手,对此知之甚少:(
我也阅读过Sun的教程,但无法解决一些混淆:
1.)我只是想从卡上读取和写入生物识别数据,所以是否有必要在Java卡上设计applet?我不能使用智能卡读卡器的简单读/写功能来读/写智能卡内存上的生物识别数据吗?
2.)如果我为java卡创建一个小程序,那么我将如何给它applet id?Applet id对每个applet都是唯一的.而且,我怎么知道预先创建的applet的applet id?
3.)什么是应用协议数据单元(APDU)?而且,他们如何帮助我读取/写入卡上的数据?
我知道所有这些都是基本问题,但我真的很困惑.所以请帮帮我们!
提前致谢.
我想发送一个包含响应数据字段的响应APDU以及一个不是0x9000的状态字.考虑到我对ISO 7816-4的理解,这应该是可能的.
但是,每当我指定返回数据并尝试发送它时,我都没有看到任何明确设置0x9000以外的状态字的可能性.
相反,我可以显式设置任意状态字并将它们作为ISOException发送,但不能附加返回数据.
这种行为可以用于错误,即状态字0x64XX - 0x69XX但是0x63XX是什么?应该可以发送警告并仍然传达返回数据.
那么是否可以发送包含返回数据和0x9000以外的状态字的响应APDU,我该怎么做?
Java Card APDU中推荐的数据字段大小是多少?从Zhiqun Chen的Java Card Technology for Smart Cards: Architecture and Programmer's Guide书中,它提到Le字段允许最多255.
我们是否将其解释为以下APDU命令:
|<----------------------- 255 Bytes total ------------------------>|
|<- CLA -><- INS -><- P1 -><- P2 -><- Lc -><---- DATA ----><- Le ->|
Run Code Online (Sandbox Code Playgroud)
因此,如果CLA,INS,P1,P2,Lc,Le各为1个字节,我们应该假设我们可以安全地只将249个字节设置到DATA区域?
对于APDU响应,我们要解释:
|<----------------------- 258 Bytes total ------------------------>|
|<-------------------------- DATA ------------------------><- SW ->|
Run Code Online (Sandbox Code Playgroud)
响应数据可以安全地设置为256字节,2个字节的SW和一个响应的总和包括数据响应和SW是258字节?
考虑到我们必须面对链接可能无法实现并且我们必须自己手动处理数据流的情况,还有哪些其他因素可以安全地发送和接收数据?
我正在尝试从Wallet.java生成CAP文件和导出文件,该文件是samples目录下的Java Card SDK中的标准.我编译类,使用转换器并遇到以下问题:
$ javac -g -d classes/ src/com/sun/javacard/samples/wallet/Wallet.java
$ converter -debug -verbose -classdir "$JC_HOME/samples/src" com.sun.javacard.samples.wallet 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x6:0x1 1.0
Java Card 2.2.2 Class File Converter, Version 1.3
Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.
parsing /home/user/javacard/java_card_kit-2_2_2/samples/src/com/sun/javacard/samples/wallet/Wallet.class
error: com.sun.javacard.samples.wallet.Wallet: unsupported class file format of version 50.0.
conversion completed with 1 errors and 0 warnings.
Run Code Online (Sandbox Code Playgroud)
我的Java版本和javac版本是相同的,Java 1.6:
$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, …Run Code Online (Sandbox Code Playgroud) 我正在开发一个JavaCard 3.0.4版本的applet.
我已经使用Orcale安装程序下载并安装了SDK(http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javame-419430.html#java_card_kit-classic-3_0_4-rr-bin-做)
我发现只有*.bat(converter.bat等)并且没有linux脚本.
但2.2.1和2.2.2版本有Linux版本.
有什么想法吗?
我是智能卡技术的新手。我想从智能卡读取文件。我正在使用javax.smartcardio读取值。我开发了一些代码将系统连接到卡上(很好)。我也有卡ATR和其他详细信息。但是没有获得与智能卡通信的APDU命令的适当帮助。卡在APDU命令中。
您好我正在研究Java Card上的一个项目,这意味着需要进行大量的模乘.我设法使用RSA密码系统在这个平台上实现模乘,但它似乎适用于某些数字.
public byte[] modMultiply(byte[] x, short xOffset, short xLength, byte[] y,
short yOffset, short yLength, short tempOutoffset) {
//copy x value to temporary rambuffer
Util.arrayCopy(x, xOffset, tempBuffer, tempOutoffset, xLength);
// copy the y value to match th size of rsa_object
Util.arrayFillNonAtomic(eempromTempBuffer, (short)0, (byte) (Configuration.LENGTH_RSAOBJECT_MODULUS-1),(byte)0x00);
Util.arrayCopy(y,yOffset,eempromTempBuffer,(short)(Configuration.LENGTH_RSAOBJECT_MODULUS - yLength),yLength);
// x+y
if (JBigInteger.add(x,xOffset,xLength, eempromTempBuffer,
(short)0,Configuration.LENGTH_MODULUS)) ;
if(this.isGreater(x, xOffset, xLength, tempBuffer,Configuration.TEMP_OFFSET_MODULUS, Configuration.LENGTH_MODULUS)>0)
{
JBigInteger.subtract(x,xOffset,xLength, tempBuffer,
Configuration.TEMP_OFFSET_MODULUS, Configuration.LENGTH_MODULUS);
}
//(x+y)2
mRsaCipherForSquaring.init(mRsaPublicKekForSquare, Cipher.MODE_ENCRYPT);
mRsaCipherForSquaring.doFinal(x, xOffset, Configuration.LENGTH_RSAOBJECT_MODULUS, x,
xOffset); // OK
mRsaCipherForSquaring.doFinal(tempBuffer, tempOutoffset, Configuration.LENGTH_RSAOBJECT_MODULUS, tempBuffer, …Run Code Online (Sandbox Code Playgroud) 在Java Card中,通常可以从卡上现有应用程序的上下文中安装新应用程序,例如通过应用程序定义的消息传递格式发送新代码,然后使用某些卡创建新的应用程序实例经理API?
或者这只能在外部使用相应的APDU吗?
如果这是Java Card和/或GlobalPlatform规范未涵盖的内容,是否可以使用特定于供应商的方法来完成?
我正在研究applet,我想使用SIM/UICC applet更新USIM下的FIle(例如:LOCI文件:0x6f7e).
第一个问题是:我可以使用SIM JAVA API(使用STK applet)在ADF下读取/更新EF吗?
根据我的读取(3GPP TS 43.019)明显的答案是否定的,我错了我错过了可以让我使用SIM小程序在ADF下读取/更新文件的somtehing?
所以我开始研究基于(ETSI TS 102 241)和踏脚石(此处链接)的UICC applet(版本6)ADF只能通过使用AID获取ADF参考(getTheFileView)来进行readed /更新.但由于未知原因,我在更新命令中遇到了UICC异常(0003:SECURITY_STATUS_NOT_SATISFIED)(选择顺利).Applet安装时还具有完全访问权限和Admin Full访问权限(使用GEMALTO工具).
你可以在这里找到我正在使用的代码(在applet init中):
AID adf_aid = new AID (uicc_aid, (short) 0x00, (byte) uicc_aid.length);
ADFView = UICCSystem.getTheFileView( adf_aid,
JCSystem.CLEAR_ON_RESET);
Run Code Online (Sandbox Code Playgroud)
在这一部分,我还使用AID作为缓冲区而不创建AID对象.
更新STK菜单访问权限
ADFView.select(FID_EF_LOCI);
ADFView.updateBinary((short) 0, eraseLoci, (short) 0,
(short) eraseLoci.length);
Run Code Online (Sandbox Code Playgroud)
我尝试了几乎所有我想到的东西:
直接选择7FFF
我还有同样的例外,你能告诉我应该检查一下吗?我必须更改代码,使用另一个版本(Jar文件)?使用特定的安装参数?还有其他解决方案来更新ADF下的文件吗?
我检查了AID值,并将其放入EF_DIR(2F00)的第一条记录中.
提前致谢.
使用类javacard.security.KeyAgreement(Java Card 3.0.1 classic)可以制定EC-DH密钥协议.但是没有定义具体的曲线.据我所知,标准IEEE P1363没有指定域参数.那么Java Card实现中使用了什么曲线?