代码之家  ›  专栏  ›  技术社区  ›  thotheolh

JavaCard中的PKCS7填充

  •  0
  • thotheolh  · 技术社区  · 8 年前

    我正在尝试在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));
                    }
                }
            }
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Paul Bastian    8 年前

    嗯,我不认为这是唯一的错误,但你的分支肯定是错误的:

    // 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) {
    

    您比较的是正确的长度,但偏移量错误。

    我不明白在你的方法中,其他情况应该做什么。如果填充错误,应该抛出错误吗?