Exception java卡RSA加密方法有什么问题?

Exception java卡RSA加密方法有什么问题?,exception,rsa,javacard,Exception,Rsa,Javacard,我已经编写了一个java卡小程序,用于RSA使用私钥加密传入的数据并再次发送出去 这是我的密码: 封装测试; 导入javacard.framework.*; 导入javacard.security.*; 导入javacardx.crypto.Cipher; 公共类测试扩展Applet { 私有静态字节[]散列=新字节[32]; 私有静态字节[]符号=新字节[256]; 私有静态短散列长度=0; 专用静态短符号\u len=0; MessageDigest mDigest=MessageDiges

我已经编写了一个java卡小程序,用于RSA使用私钥加密传入的数据并再次发送出去

这是我的密码:

封装测试;
导入javacard.framework.*;
导入javacard.security.*;
导入javacardx.crypto.Cipher;
公共类测试扩展Applet
{
私有静态字节[]散列=新字节[32];
私有静态字节[]符号=新字节[256];
私有静态短散列长度=0;
专用静态短符号\u len=0;
MessageDigest mDigest=MessageDigest.getInstance(MessageDigest.ALG_SHA_256,false);
Cipher rsapier=Cipher.getInstance(Cipher.ALG_RSA_NOPAD,false);
KeyPair rsaKey=新密钥对(KeyPair.ALG_RSA,KeyBuilder.LENGTH_RSA_2048);
RSAPublicKey rsaPubKey=(RSAPublicKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC,KeyBuilder.LENGTH_RSA_2048,false);
公共静态无效安装(字节[]bArray,短bOffset,字节bLength)
{
新测试().寄存器(bArray,(short)(bOffset+1),bArray[bOffset]);
}
公共作废流程(APDU APDU)
{
如果(选择Applet())
{
返回;
}
字节[]buf=apdu.getBuffer();
开关(buf[ISO7816.偏移量_-INS])
{
大小写(字节)0x00://生成密钥对
rsaKey.genKeyPair();
打破
大小写(字节)0x01://获取公钥
apdu.setIncomingAndReceive();
rsaPubKey=(RSAPublicKey)rsaKey.getPublic();
rsaPubKey.getmodules(buf,(短)0);
apdu.setOutgoingAndSend((短)0,(短)256);
打破
大小写(字节)0x03://通过私钥加密
short len=apdu.setIncomingAndReceive();
mDigest.reset();
hash\u len=mDigest.doFinal(buf,(短)ISO7816.OFFSET\u CDATA,len,hash,(短)0);
rsaciper.init(rsaKey.getPrivate(),Cipher.MODE_ENCRYPT);
sign_len=rsaciper.doFinal(Hash,(short)0,Hash_len,sign,(short)0);
Util.arrayCopy(Hash,(short)0,buf,(short)0,Hash_len);
apdu.setOutgoingAndSend((短)0,散列长度);
打破
违约:
ISOException.throwIt(ISO7816.SW不支持);
}
}
}
我成功地生成了密钥,但当我尝试进行加密时,
6f00
sign\u len=rsaciper.doFinal(Hash,(short)0,Hash\u len,sign,(short)0)行返回

现在,我的第一个问题是如何找出
6F 00
SWs的含义,即如何处理代码中的运行时异常,第二个问题是如何修复它以及问题是什么?我哪里弄错了?(我使用的是java card kit 3.0.4。)

您使用的是算法(也称为“原始RSA”或“X.509 RSA”),它只进行模幂运算,不需要任何填充

此算法要求输入的长度与RSA密钥模数(2048位)相同 /256字节),并且在使用时不安全,没有适当的输入填充

使用(如果您的卡支持)或RSA加密


状态字
6F 00
是由于未捕获而给出的(有关详细信息,请参阅文档)。您可能希望用
try{…}catch(CryptoException e){…}
来包围代码,并使用获取有关发生的问题的更多详细信息


注意:在您的代码中,您正在加密一个没有多大意义的SHA-256散列数据——是否要对数据签名?您应该使用or(请注意,在这种情况下,您不需要进行哈希运算,因为在签名计算期间会计算SHA-256)

祝你好运

您使用的算法(也称为“raw RSA”或“X.509 RSA”)只需进行模幂运算,无需任何填充

此算法要求输入的长度与RSA密钥模数(2048位)相同 /256字节),并且在使用时不安全,没有适当的输入填充

使用(如果您的卡支持)或RSA加密


状态字
6F 00
是由于未捕获而给出的(有关详细信息,请参阅文档)。您可能希望用
try{…}catch(CryptoException e){…}
来包围代码,并使用获取有关发生的问题的更多详细信息


注意:在您的代码中,您正在加密一个没有多大意义的SHA-256散列数据——是否要对数据签名?您应该使用or(请注意,在这种情况下,您不需要进行哈希运算,因为在签名计算期间会计算SHA-256)


祝你好运

@MJay无扩展长度APDU(必须由卡和读卡器支持)Lc限制为255字节。因此,您必须使用某种命令链接(请参阅的最后一段以获取灵感)。从技术上讲,如果您总是期望256字节的数据,您可能会将额外的1字节编码到P1或P2中,但这种方法不是很干净……。还要注意,对于较长的Lc,由于APDU缓冲区大小有限,您可能无法在单个
APDU.setIncomingAndReceive()调用中接收所有输入数据(您需要多次使用APDU.receiveBytes()
)…您没有提到您的任务是什么,但您将无法使用2048位密钥安全加密256字节。您肯定应该使用ALG_RSA_PKCS1(或ALG_RSA_PKCS1_OAEP)用于无法处理256字节输入的加密。如果您不知道自己在做什么,请不要使用原始RSA。ALG_RSA_PKCS1允许动态明文大小,因此如果您的明文长度高达约245字节(对于2048位密钥)直接使用它加密输入数据…….加密较长数据的常见方案是RSA加密随机对称(AES、DES?)密钥,并使用此对称密钥加密数据(理想情况下使用某种经过身份验证的加密(AE)模式,例如GCM、EAX、encrypt然后Mac)和random IV。这样可以加密更长的数据(不超过