有没有办法从字节数组生成PrivateKey?我使用getEncoded()方法得到了这个字节数组,但现在我必须将它转换回PrivateKey.
谢谢,Vuk
我需要在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
这个问题是双重的,但希望回答起来不会太长,尽管它本身很长。不过,请随意回答其中的一部分,很抱歉使它如此详尽!
对于第一部分,问题适用于:
AppletAppletApplet)makeTransientObjectArraymakeTransientObjectArray(例如,存储在 a 中存储的对象的成员变量中makeTransientObjectArray)对于第二部分,它的适用取决于第一个问题的答案。例如:
new Object当放入瞬态对象数组时,它是持久化的还是非持久化的?先感谢您!
我已经研究了 JCRE 规范 v2.2.2 (我正在使用的版本),但其中有一些不清楚的地方(因此这个问题很详尽,因为我觉得这更适合 Q/A 风格论坛):
Applet. 然而,Glossary-7 指出对象默认是持久的。这种差异可能看起来不可观察,但无论如何都会影响卡电源循环时是否需要进行垃圾收集。Applet.这三个问题分别相当于:
我想开始使用手机和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吗?)
我注意到我的智能卡上有一些非常奇怪的行为(NXP J2E145,J3A081,带有Omnikey 5121读卡器的J3C145):在调用JavaCard方法后立即断电
JCSystem.requestObjectDeletion()
Run Code Online (Sandbox Code Playgroud)
可能会损坏卡:在大约10%的这种断电后,ATR命令非常慢(1000毫秒),我对任何其他APDU(小程序选择,卡管理器认证等)都没有响应.
我知道requestObjectDeletion()的行为取决于供应商的具体实现,所以我的问题非常广泛和开放......
垃圾收集是否"通常"在一次交易中处理?
是否有任何"官方"建议不要在可能的断电情况下调用requestObjectDeletion()?
恩智浦有没有类似的卡片经验?
编辑:
当尝试连接到损坏的卡的卡管理器小程序时,Eclipse IDE中的JCOP shell报告:
ATR:3BFB9600008131FE454F4450204D41502053414D3E
ATR:T = 1
jcshell:终端未知问题.最后一个终端错误:由于I/O设备错误,无法执行请求.
我想以一种方式编写我的小程序,使其 APDU 命令和状态字在我的卡和我的读卡器之间的传输通道中不清楚。我的意思是我不想将 APDU 命令和响应发送为第三方的纯文本。
我想我有两个选择:
SELECTAPDU 命令冲突,并且卡的 SDSELECT错误地将其识别为命令。那正确吗?它的图表:

它的图表:

有没有其他办法?
似乎第一个解决方案还不够好,因为:
我对吗?
现在,假设我想确保我的小程序仅适用于使用安全通道传输的 APDU 命令。我想我又有两个选择:
将卡置于SECURED状态。由于用户在这种状态下无法使用纯文本 APDU 命令与卡通信(对吗?),因此他必须使用安全通道将命令发送到我的小程序。对?如果不正确,是否有任何方法可以强制 SD 仅使用安全通道?
将卡保持在它所处的任何生命周期(例如 OP_READY),但相反,在接收任何 APDU 命令时,检查CLA部分以查看它是否是安全传输的!(这可能吗?CLA来自安全通道的部分 APDU 命令和其他命令之间有什么区别吗?我说得对吗?)
有没有其他办法?
最后是主要问题:
如何使用 SD 与我的小程序进行安全通信?因为我认为我必须使用 GlobalPlatform 类(我是吗?),所以我查看了它的 API-s。我getSecureChannel在名为org.globalplatform.GPSystem. 我的方式正确吗?我必须使用这种方法吗?
我知道回答这个问题可能太长了,但我相信它不仅为我,也为其他未来的观众澄清了很多问题。
我很感激任何机构为我解决了这个问题。
一个示例小程序更可观。
为了有效地计算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 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) 我目前正在开发一个限制性环境,其中允许的唯一类型是:
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,这将是有用的.
这是一个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员工,即转换)访问修饰符,字段等).
javacard ×10
java ×5
smartcard ×4
cryptography ×3
bcd ×1
bit-shift ×1
eclipse ×1
gsm ×1
jcop ×1
performance ×1
rmi ×1
sim-card ×1
transactions ×1
windows ×1