在我的项目中,我想在智能卡上编写生物识别数据(如指纹模板).经过一番精心研究后,我为我的项目选择了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,我该怎么做?
我用SEEK为Galaxy S3修补了android,经过一番努力,我现在能够将APDU发送到SIM卡并得到适当的响应.
我想将自己的applet放在SIM卡中,但由于我们无法获得访问权限,因此我开始怀疑是否有可能发出一张像SIM卡一样工作的Java卡.我只需要一张手机无法与SIM卡区分的Java卡,不需要网络覆盖,我知道创建一个可以与运营商合作并提供网络覆盖的SIM几乎是不可能的.
所有这一切的原因是我需要发送APDU并使用我的applet,但如果我在GS3中插入一张Java卡而不是SIM卡,它根本无法访问.
所以我的问题是:是否可以发行一张Java卡,使其看起来像手机上的SIM卡(而不是运营商)?
或者是否有可能更改android以便在其中有Java卡时提供所需的访问权限,即RIL像往常一样工作?
编辑
好的,我想我会尝试发布一个具有以下属性的Java Card:
首先,它将有一个自动选择的applet(默认applet),从现在开始将调用fake-UICC.
其次,在假UICC中,我们将模拟UICC的文件系统(根据http://www.in2eps.com/fo-uicc/tk-fo-uicc-mf.html).
第三,由于不同的类用于SIM APDU(0xA0)所以从RIL发送的所有APDU将被JCRE定向到伪UICC,因为普通Java卡无法识别class +指令.例如0xA0A4,选择SIM,但是0x00A4选择Java Card命令.
在最后一步中,我们将尝试发送真实SIM将发送到每个APDU的完全相同的响应.
也许它不起作用,但我认为值得一试.
我正在尝试从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版本.
有什么想法吗?
您好我正在研究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规范未涵盖的内容,是否可以使用特定于供应商的方法来完成?
java卡目前的用途是什么?文档要么非常旧,要么非常稀疏。经过一段时间的谷歌搜索,这是我的想法:
eID:用私钥签署文档哈希,由中央机构(政府)颁发 - 签署法律文件
唯一 ID - 通过 ID 进行(人员)识别,受 PIN 保护并受 TLS 保护
java 连接版 Web 应用程序 - 除了 IDE 中的模板应用程序之外,我找不到任何有关此功能的使用文档。当这一层可用时,为什么仍然使用 APDU?难道这个申请不存在吗?
尽管有所有新功能,但我发现它们仅用作中央存储库/提供者的标识?TLS 用于保护卡和后端服务器之间的通信?
谢谢。
来自Java Card API 2.2.1的一些引用:
Signature 课程描述:
撕裂或卡重置事件将初始化的Signature对象重置为先前通过调用init()初始化时所处的状态.对于支持与临时密钥数据集,如DES,三重DES,AES,和韩国SEED签名对象密钥成为与用来初始化签名对象的密钥对象相关联的清除事件未初始化密钥的算法.
Signature.init(...) 描述:
为了获得最佳性能,当theKey参数是临时密钥时,实现应尽可能使用瞬态空间进行内部存储.
这是否意味着有些算法需要在每次Signature.init(...)调用时重写持久性内存?如果是的话,这种不愉快的行为有什么理由吗?
我问这个问题,因为我在applet中遇到了一个奇怪的行为.它计算ECDSA签名.在大约10万个签名后,卡(J2X145 by NXP)似乎坏了(我不能再选择applet了).持续的内存损坏可能是原因,因为我Signature.init(...)每次收到输入数据时都会调用.这可能Signature.init(...)是这种行为的原因吗?
我正在开发一个 C# Java 卡(智能卡)程序,并且我正在尝试利用github 上的PCSC-sharp库。
这是我的请求的“short / tl;dr”版本: PCSC-sharp 示例涵盖了 Iso7816 Case2Short。有人可以纠正我下面的示例,或者为我提供 Iso7816 Case3Short(命令数据。无响应数据)和 Case4Short(命令数据。预期响应数据)的示例吗?
这是我的请求的“长”版本: 在 Java 卡上,我使用标准和自定义 APDU 命令,并且我可以使用 python 脚本(使用智能卡库)成功调用这些命令。换句话说,我已经证明 Java Card 命令有效。
我现在的目标是使用 PCSC-sharp 执行相同的命令,但当我包含数据时(即 APDU LC > 0),我失败了。
这是 github 上的示例。请注意,我只需更改阅读器名称、指令(选择文件而不是获取挑战)和 Le 即可使用此功能。
var contextFactory = ContextFactory.Instance;
using (var ctx = contextFactory.Establish(SCardScope.System)) {
using (var isoReader = new IsoReader(ctx, "ACME Smartcard reader",
SCardShareMode.Shared, SCardProtocol.Any, false)) {
var apdu = new CommandApdu(IsoCase.Case2Short, isoReader.ActiveProtocol) {
CLA = 0x00, // Class
Instruction = InstructionCode.GetChallenge,
P1 = …Run Code Online (Sandbox Code Playgroud)