- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在卡上签署一条消息并在卡外验证它。
结果总是假的。
我可能获取的模数和指数不正确。有什么想法吗?
Java 小程序代码:
protected MainApplet() {
try {
// CREATE RSA KEYS AND PAIR
m_keyPair = new KeyPair(KeyPair.ALG_RSA_CRT, KeyBuilder.LENGTH_RSA_1024);
// STARTS ON-CARD KEY GENERATION PROCESS
m_keyPair.genKeyPair();
// OBTAIN KEY REFERENCES
m_publicKey = (RSAPublicKey) m_keyPair.getPublic();
m_privateKey = (RSAPrivateCrtKey) m_keyPair.getPrivate();
} catch (CryptoException c) {
//this line will give you the reason of problem
short reason = c.getReason();
ISOException.throwIt(reason); // for check
}
}
.......
switch (INS) {
case 0x00:
getPublicKeyExp(apdu);
break;
case 0x10:
getPublicKeyMod(apdu);
break;
case 0x21:
signMessage(apdu);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
private void getExponent(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = m_publicKey.getExponent(buffer, ISO7816.OFFSET_CDATA);
apdu.setOutgoingAndSend((short) 0, length);
}
private void getModulus(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = m_publicKey.getModulus(buffer, ISO7816.OFFSET_CDATA);
apdu.setOutgoingAndSend((short) 0, length);
}
Java 主机代码:
/*************** EXECUTE COMMAND *************/
byte[] get_exponent = {
(byte) 0x80, // CLA Class
0x00, // INS Instruction
0x00, // P1 Parameter 1
0x00, // P2 Parameter 2
0x00 // LE maximal number of bytes expected in result
};
byte[] get_modulus = {
(byte) 0x80, // CLA Class
0x10, // INS Instruction
0x00, // P1 Parameter 1
0x00, // P2 Parameter 2
0x00 // LE maximal number of bytes expected in result
};
ResponseAPDU resp_modulus = channel.transmit(new CommandAPDU(get_modulus));
System.out.println(resp_modulus.toString());
ResponseAPDU resp_exponent = channel.transmit(new CommandAPDU(get_exponent));
System.out.println(resp_exponent.toString());
byte[] modulus = resp_modulus.getData();
byte[] exponent = resp_exponent.getData();
创建公钥的代码:
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(new BigInteger(1, modulus), new BigInteger(1, exponent));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
publicKey = keyFactory.generatePublic(keySpec);
验证消息的代码:
byte[] get_signed_message = {
(byte) 0x80, // CLA Class
0x21, // INS Instruction
0x00, // P1 Parameter 1
0x00, // P2 Parameter 2
0x00 // LE maximal number of bytes expected in result
};
ResponseAPDU resp = channel.transmit(new CommandAPDU(get_signed_message));
System.out.println(resp.toString());
byte[] sigToVerify = resp.getData();
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(publicKey);
sig.update(sigToVerify);
boolean verifies = sig.verify(sigToVerify);
更新:Java 小程序签名方法
byte[] testSig = new byte[256];
byte[] test = {0x01, 0x02, 0x04, 0x05, 0x06, 0x07};
// CREATE SIGNATURE OBJECT
Signature m_sign = Signature.getInstance(Signature.ALG_RSA_SHA_PKCS1, false);
// INIT WITH PRIVATE KEY
m_sign.init(m_privateKey, Signature.MODE_SIGN);
short len = m_sign.sign(test, (short) 0, (short) test.length, testSig, (short) 0);
apdu.setOutgoing();
apdu.setOutgoingLength(len);
apdu.sendBytesLong(testSig, (short) 0, len);
最佳答案
问题出在这两个方法 getExponent()
和 getModulus()
中。您正在将指数 和模数 存储到buffer
的索引ISO7816.OFFSET_CDATA
(索引 5)中,但将其发送到外部来自 buffer
的索引 0
。
比较正确的方法和错误的方法:
错误:
private void getExponent(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = m_publicKey.getExponent(buffer, ISO7816.OFFSET_CDATA);
apdu.setOutgoingAndSend((short) 0, length); // not the valid public exp
}
private void getModulus(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = m_publicKey.getModulus(buffer, ISO7816.OFFSET_CDATA);
apdu.setOutgoingAndSend((short) 0, length); // not the valid mod
}
正确 1(赞赏):
private void getExponent(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = m_publicKey.getExponent(buffer, (short) 0);
apdu.setOutgoingAndSend((short) 0, length);
}
private void getModulus(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = m_publicKey.getModulus(buffer, (short) 0);
apdu.setOutgoingAndSend((short) 0, length);
}
正确 2:
private void getExponent(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = m_publicKey.getExponent(buffer, ISO7816.OFFSET_CDATA);
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, length);
}
private void getModulus(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = m_publicKey.getModulus(buffer, ISO7816.OFFSET_CDATA);
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, length);
}
编辑:在您的主机应用程序中,您需要以下内容:
byte[] test = {0x01, 0x02, 0x04, 0x05, 0x06, 0x07};
sig.update(test);
boolean verifies = sig.verify(sigToVerify);
要验证签名,您需要
关于Javacard - 签名和验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31102322/
我已经开始使用 JavaCards 并试图掌握 CLA 字节的含义。 如果阅读RFC 5.4.1 Class byte 5.4.1 Class byte According to table 8 us
我有一张 Gemalto Top DL v2 java 卡。当我 list 内容时,卡中加载了很多包: GlobalPlatformPro:> gp -visa2 -key 47454D5850524
我想读取 Java 卡上的 TLV 编码证书(NXP JCOP J3D081、JCOP 版本 2.4.2、Java 卡版本 3.0.1 Classic)。 cap 文件已成功创建,但当我尝试将其安装到
我想知道 JavaCard 中的 Util.* 函数是否通常是抗侧 channel 的。 是否存在一些具有侧 channel 抗性 Util.* 功能的 JavaCard? 我查看了几个公共(publ
我想配置一个 JavaCard,以便它只允许安装由特定 key 签名的小程序。我不确定这个签名是否是 cap 文件格式的一部分。我已经可以通过 GlobalPlatformPro 中的代码从 Andr
在尝试反编译 capfile 时研究 JCVM 规范,我想到了以下问题: 描述符组件(6.13)说: The Descriptor Component provides sufficient info
如您所知,OTA 消息或无线消息是特制的二进制 SMS 消息,移动运营商使用这些消息向 SIM 卡发送 APDU 命令以进行管理。例如,他们可以使用此类消息在 SIM 卡上安装或删除小程序。 我想知道
我正在寻找一个使用Java Card在SIM卡上运行的简单初学者程序。谁能给我一些入门的基本信息?我已经看过一些关于工具包api的描述,但是我正在寻找类似的东西:sim卡支持哪些功能,如何将我的代码上
我有一个空的 Javacard,如下所示: user@system$ java -jar gp.jar --list ISD: A000000003000000 (OP_READY) Pri
我是智能卡开发的新手。请帮助我了解如何开始。 Javacard和JCOP之间有什么关系? 如何将JCOP版本映射到GlobalPlatform Card Specification? 例如,JCOP
我正在尝试理解java卡的概念,我有一些疑问,我想与大家分享,也许你能给我任何最好的建议。 //Jcop- 我在某处读到 Java Card OpenPlatform (JCOP) 是由 IBM Zü
java卡现在有什么用?该文档要么非常旧,要么非常稀疏。谷歌搜索了一段时间后,这是我的想法: eID:使用私钥签署文档哈希,由中央机构(政府)颁发 - 签署法律文件 唯一 ID - 通过 ID 识别(
我想在 Linux 计算机上生成证书,将其传输到卡并在那里加密。然后将其存储并稍后取回。我想知道如何在卡上获取 4k RSA 数据之类的东西。它可以与 APDU 配合使用吗? 最佳答案 证书一般不需要
我尝试使用oracle java card development kit 3.0.5u2命令行工具。 我用的是netbeans生成的cap文件 我用 verifycap.bat在我的帽子上以及 sd
有人可以给我一些关于如何使用 javacard 签名并验证它的小建议吗?我想我在签名生成和验证方面做错了: ... SignatureMessageRecovery sig; ... private
我正在尝试在卡上签署一条消息并在卡外验证它。 结果总是假的。 我可能获取的模数和指数不正确。有什么想法吗? Java 小程序代码: protected MainApplet() { try {
我想开发一个使用 java 卡的生物识别指纹认证,我发现 javacard 2.2 提供了 APIs (javacardx.biometry) 来做到这一点,但我没有找到任何关于Match On Ca
我注意到我的智能卡(带有 Omnikey 5121 读卡器的 NXP J2E145、J3A081、J3C145)上出现了一些非常奇怪的行为:调用 JavaCard 方法后立即断电 JCSystem.r
我有一个包含我的小程序的双接口(interface) Java 卡。我想对来自不同接口(interface)的单个命令有两个不同的 APDU 响应。 例如,当从接触界面接收到命令时,我想用“Con
我一直在查看 JavaCard API 和示例,但找不到对更高级别数据集合(如 List、ArrayList、HashMaps 等)的任何引用? 我错过了什么吗? 我知道 JavaCard 环境的资源
我是一名优秀的程序员,十分优秀!