我是 Java Card 开发的新手,我尝试在 JavaCard 上实现 NAXOS 协议(protocol),我的问题是为变量供电。我的 JavaCard 版本是 2.2.1,我使用这样的代码来做到这一点:
package RsaEncryption;
import javacard.framework.*;
import javacard.security.KeyBuilder;
import javacard.security.RSAPrivateKey;
import javacardx.crypto.Cipher;
public class RsaEncryption extends Applet {
static final byte PLAIN_CLA = (byte) 0x00;
private RSAPrivateKey privKey;
Cipher cipher;
public static void install(byte[] bArray,short bOffset,byte bLength) {
new RsaEncryption(bArray, bOffset, bLength);
}
private RsaEncryption(byte[] bArray, short bOffset, byte bLength){
register();
}
public boolean select() {
return true;
}
public void deselect() {
}
public void process(APDU apdu) {
if (selectingApplet()) {
return;
}
byte[] buffer = apdu.getBuffer();
apdu.setIncomingAndReceive();
short lenOfData = (short)(buffer[ISO7816.OFFSET_LC]);
byte[] tmp = new byte[lenOfData];
privKey = (RSAPrivateKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PRIVATE, KeyBuilder.LENGTH_RSA_1024, false);
cipher = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false);
byte[] G = {0x02};
byte[] P = {0x05};
byte[] x = {0x03};
short maxL = 256;
privKey.setModulus(P, (short)0, maxL);
privKey.setExponent(x, (short)0, maxL);
cipher.init(privKey, Cipher.MODE_DECRYPT);
// Execute G^x mod P using RSA's decrypt
cipher.doFinal(G, (short) 0, maxL, tmp, (short) 0);
// tmp[2] = 0x5;
//buffer[6] = tmp[0];
// buffer[7] = tmp[1];
//Util.arrayCopyNonAtomic(buffer, ISO7816.OFFSET_CDATA, tmp, (short)0, (short)tmp.length);
for(short i=(short)0; i<lenOfData;i++){
buffer[i]= tmp[(short)(i)];
}
//apdu.sendBytesLong(tmp, (short)0, (short)5);
apdu.setOutgoingAndSend((short) 0, (short)tmp.length);
}
}
我得到的输出是
mode_211
enable_trace
establish_context
card_connect -readerNumber 1
select -AID A0000002471201
Command --> 00A4040007A0000002471201
Wrapped command --> 00A4040007A0000002471201
Response <-- 9000
send_apdu -APDU 8000000009010203040506070809FF
Command --> 8000000009010203040506070809FF
Wrapped command --> 8000000009010203040506070809FF
Response <-- 6F00
send_APDU() returns 0x80206F00 (Unknown ISO7816 error: 0x6F00)
你能建议任何其他方式来为 Java Card 上的两个数字供电吗?
最佳答案
尝试 Diffie-Hellman 原语可能会更好。 Diffie-Hellman 的模幂运算比 RSA 的模幂运算受附加约束的阻碍的可能性要小得多。
在这两种情况下,您当然都会受到模块化算术的限制 - 原因很明显。
关于cryptography - 如何使用 RSA 加密为 Java Card 上的数字供电,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37645662/