%02x java,从pyscard调用的JavaCard加密和解密函数

RSA加密和解密算法使用了一个中国密钥加密卡(CRT)实现。下面是我的一些代码:

施工单位:private CryptoApplet() {

generateKeyPair();

cipher = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false);

outputByte = new byte[256];

outputByte2 = new byte[117];

outBuff = new byte[128];

outBuff2 = new byte[117];

}

加密功能(java卡):

^{pr2}$

解密功能(java卡):private void decrypt(APDU apdu) {

byte[] buffer = apdu.getBuffer();

short lc = apdu.getIncomingLength();

short dataOffset = apdu.getOffsetCdata();

short blocksize = 128;

short inOffset = (short) 0;

short outOffset = (short) 0;

cipher.init((RSAPrivateCrtKey) keys.getPrivate(), Cipher.MODE_DECRYPT);

short dataLeft = lc;

while (dataLeft > 0) {

if (dataLeft < blocksize)

blocksize = dataLeft;

outOffset = cipher.doFinal(buffer, (short) dataOffset, (short) blocksize, outBuff2, (short) 0);

Util.arrayCopy(outBuff2,(short) 0,outputByte2,inOffset,(short) outOffset);

inOffset += outOffset;

dataOffset += blocksize;

dataLeft -= blocksize;

}

apdu.setOutgoingAndSend((short) 0, (short) outputByte2.length);

}

从下面的python代码(使用pyscard包)调用的decrypt和encrypt函数可以很好地用于encrypt。但是,每次我尝试调用解密函数时,它都会遇到一个错误(响应sw1=6F,sw2=00)。在

加密调用方(python/pyscard)(函数0x41):#! /usr/bin/env python

from smartcard.System import readers

from smartcard.util import *

import struct

# define the APDUs used in this script

f_input = open('4x6.JPG','rb')

list_input = list(bytearray(f_input.read()))

f_input.close()

SELECT = [0x00, 0xA4, 0x04, 0x00, 0x0A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00]

# get all the available readers

r = readers()

print "Available readers:", r

reader = r[0]

print "Using:", reader

connection = reader.createConnection()

connection.connect()

data, sw1, sw2 = connection.transmit(SELECT)

print data

print "Select Applet: %02X %02X" % (sw1, sw2)

COMMAND = [0x80, 0x41, 0x00, 0x00, 0x00]

list_output = []

lengthCommandData = 234

amountSendAPDU = len(list_input)/lengthCommandData

left = len(list_input) % lengthCommandData

if (left > 0):

amountSendAPDU += 1

for b in range(amountSendAPDU):

DATA_COMMAND = list_input[b*lengthCommandData:(b+1)*lengthCommandData]

lengthData = len(DATA_COMMAND)

tmp = lengthData/117

left = lengthData%117

if (left > 0):

tmp += 1

lengthResp = tmp*128

LE = [ord(c) for c in struct.pack("!H",lengthResp)]

LE = [0x00] + LE

LC = [ord(c) for c in struct.pack("!H",lengthData)]

data, sw1, sw2 = connection.transmit(COMMAND + LC + DATA_COMMAND + LE)

list_output = list_output + data

f_encrypted = open('4x6.enc','wb')

f_encrypted.write(bytearray(list_output))

f_encrypted.close()

解密调用方(python/pyscard)(函数0x42):#! /usr/bin/env python

from smartcard.System import readers

from smartcard.util import *

import struct

# define the APDUs used in this script

f_input = open('4x6.enc','rb')

list_input = list(bytearray(f_input.read()))

f_input.close()

SELECT = [0x00, 0xA4, 0x04, 0x00, 0x0A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00]

# get all the available readers

r = readers()

print "Available readers:", r

reader = r[0]

print "Using:", reader

connection = reader.createConnection()

connection.connect()

data, sw1, sw2 = connection.transmit(SELECT)

print data

print "Select Applet: %02X %02X" % (sw1, sw2)

COMMAND = [0x80, 0x42, 0x00, 0x00, 0x00]

list_output = []

lengthCommandData = 128

amountSendAPDU = len(list_input)/lengthCommandData

left = len(list_input) % lengthCommandData

if (left > 0):

amountSendAPDU += 1

for b in range(amountSendAPDU):

DATA_COMMAND = list_input[b*lengthCommandData:(b+1)*lengthCommandData]

lengthData = len(DATA_COMMAND)

tmp = lengthData/128

left = lengthData%128

if (left > 0):

tmp += 1

lengthResp = tmp*117

LE = [ord(c) for c in struct.pack("!H",lengthResp)]

LE = [0x00] + LE

LC = [ord(c) for c in struct.pack("!H",lengthData)]

data, sw1, sw2 = connection.transmit(COMMAND + LC + DATA_COMMAND + LE)

list_output = list_output + data

print "%02X %02X" % (sw1, sw2)

f_encrypted = open('output.JPG','wb')

f_encrypted.write(bytearray(list_output))

f_encrypted.close()

问题是:当我试图找出问题的时候,我发现问题正在发生

密码.doFinal()在解密函数(java卡)中。但我还是

不知道错误的原因密码.doFinal(). 有人能吗

帮我解决这个解密问题?在

我试图使用扩展applet,但不能传递超过

python/pyscard中的255个字节。有人能帮我并指导我怎么做吗

从python/pyscard传递长度超过255字节的数据?在

通过APDU可以发送的数据的最大大小是多少?

据我所知,扩展APDU可以接收65535字节的数据,但是

当我试图从python/pyscard发送59904字节的数据时,它给出了

我的错误如下:

错误3:Traceback (most recent call last):

File "encrypt.py", line 58, in

data, sw1, sw2 = connection.transmit(COMMAND + LC + DATA_COMMAND + LE)

File "C:\Users\X\Anaconda\lib\site-packages\smartcard\CardConnectionDecorat

or.py", line 82, in transmit

return self.component.transmit(bytes, protocol)

File "C:\Users\X\Anaconda\lib\site-packages\smartcard\CardConnection.py", l

ine 144, in transmit

data, sw1, sw2 = self.doTransmit(bytes, protocol)

File "C:\Users\X\Anaconda\lib\site-packages\smartcard\pcsc\PCSCCardConnecti

on.py", line 205, in doTransmit

SCardGetErrorMessage(hresult))

smartcard.Exceptions.CardConnectionException: Failed to transmit with protocol T

1. The data area passed to a system call is too small.

谢谢你,抱歉问了这么长时间,新手。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值