我正在尝试在JavaCard环境中实现我自己的PKCS7填充方案,以防智能卡不支持PKCS5或7填充方案。
我希望PKCS填充方案的块大小在使用不同块大小的对称密码的情况下是灵活的。这个
length
指示消息输入长度
blocksize
指示密码块的大小。
我的算法将检查PKCS7填充中的两种情况,即如果所有字节都是相同的字节(例如。
0A, 0A, 0A .. 0A, 0A, 0A
)这意味着不涉及填充,并将返回一个值
0
.
第二种情况是检查是否存在填充(例如。
0A, 0B, 0C, 05, 05, 05, 05, 05
).
我能够成功地检查所有场景,但当涉及到复制数据以输出结果时,似乎无法正确复制。
看起来像是
arrayFillGenericNonAtomic()
在
arrayCopyRepackNonAtomic()
仍然停留在输出字节数组中,并执行
阵列复制重新打包非原子()
没有正确复制数据。
我使用的输出字节数组格式是数组中的第一个元素携带已处理输出的数据量的指示符(以字节表示)(例如。
output[outputOffset] = (byte) 0x10
意味着之后已经处理的16个数据元素)。输出字节数组中第一个元素之后的后续数据元素包含处理后的数据。
问题的一个例子是我正在尝试PKCS7解码
A0, B0, C0, D0, E0, 04, 04, 04, 04
结果应该是
05, A0, B0, C0, D0, E0
(其中05表示处理了以下5个字节)但我得到
05, 04, 04, 04, 04 ..
相反
如何解决
阵列复制重新打包非原子()
没有按预期工作?
我正在一个实际的JavaCard 2.2.2和JavaCard 3.0.4兼容的智能卡上测试代码,该智能卡处于OP_READY模式。
public static void process(byte[] input, short offset, short length,
short blockSize, byte[] output, short outputOffset, short mode) {
if (mode == MODE_DECODE) {
// Data length must be >= blocksize and have to have be a modulus of 0 size.
if ((length >= blockSize) && ((length % blockSize) == 0)) {
output[outputOffset] = (byte) length;
ArrayLogic.arrayFillGenericNonAtomic(output, (short) (outputOffset + 1), (short) (length - 1), output, outputOffset);
if (ArrayLogic.arrayCompareGeneric(input, offset, output, outputOffset, length) == 0x00) {
// If all bytes are the same, return 0.
output[outputOffset] = (byte) 0x00;
} else {
// Bytes are not all the same, check if the last segment of bytes are padded.
if (ArrayLogic.arrayCompareGeneric(input, offset, output, outputOffset, (short) (input[(short) (offset + length - 1)] & 0xFF)) == 0x00) {
// Padded bytes are found.
output[outputOffset] = (byte) (length - input[(short) (offset + length - 1)]);
// Unable to copy correctly to output
ArrayLogic.arrayCopyRepackNonAtomic(input, offset, (short) (output[outputOffset] & 0xFF), output, (short) (outputOffset + 1));
} else {
output[outputOffset] = (byte) length;
// Unable to copy correctly to output
ArrayLogic.arrayCopyRepackNonAtomic(input, offset, length, output, (short) (outputOffset + 1));
}
}
}
}
}
问题已经解决,问题是错误的变量偏移量以及导致问题的字节到短转换的处理。
下面是一个工作版本,它似乎在对将来有兴趣使用它的人进行一些测试后进行了填充。
public static void process(byte[] input, short offset, short length,
short blockSize, byte[] workBuff, short buffOffset, byte[] output,
short outputOffset, short mode) {
if (mode == MODE_DECODE) {
// Data length must be >= blocksize and have to have be a modulus of 0 size.
if ((length >= blockSize) && ((length % blockSize) == 0)) {
workBuff[buffOffset] = (byte) input[(short) (length + offset - 1)];
ArrayLogic.arrayFillGenericNonAtomic(workBuff, buffOffset, length, workBuff, buffOffset);
if (ArrayLogic.arrayCompareGeneric(input, offset, workBuff, buffOffset, length) == 0x00) {
// If all bytes are the same, return 0.
output[outputOffset] = (byte) 0x00;
} else {
output[outputOffset] = (byte) (offset + length - (workBuff[buffOffset] & 0xFF));
output[(short) (outputOffset + 1)] = workBuff[buffOffset];
// Bytes are not all the same, check if the last segment of bytes are padded.
if (ArrayLogic.arrayCompareGeneric(input, (short) (offset + length - (workBuff[buffOffset] & 0xFF)), workBuff, buffOffset, (short) (workBuff[buffOffset] & 0xFF)) == 0x00) {
// Padded bytes are found.
output[outputOffset] = (byte) (length - input[(short) (offset + length - 1)]);
ArrayLogic.arrayCopyRepackNonAtomic(input, offset, (short) output[outputOffset], output, (short) (outputOffset + 1));
} else {
// Padded bytes are not found.
output[outputOffset] = (byte) length;
ArrayLogic.arrayCopyRepackNonAtomic(input, offset, length, output, (short) (outputOffset + 1));
}
}
}
}
}