在 Java 卡上将 byte[] 转换为 short[] 的快速方法

Fast way to convert byte[] to short[] on Java Card

我想在 Java 卡上优化 SHA-3 算法。我需要一个消耗更少内存的快速算法,它可以轻松地将 byte[] 转换为 short[](或将 [] 转换为 byte[])。我当前的实现如下所示:

private short[] byteToShort(byte[] b,int len)
{
    short len_conv  = (short)(len/2);
    for ( short x = 0; x < len_conv;x++)
    {
        for ( short j = 0 ; j < 2 ; j++)
            aux[j] = b[2*x+j];
        temp_conv[x] = (short)((((short)aux[1]) & 0xFF) | ((((short)(aux[0]) & 0xFF) << 8 )));
    }
    return temp_conv;
}

其中 lenb 数组的实际大小,auxtemp_conv 定义为私有并分配为:

short[] temp_conv = JCSystem.makeTransientShortArray((short)255,JCSystem.CLEAR_ON_DESELECT); // used during conversion
byte[] aux = new byte[2];

我目前使用 Java Card v 2.2.2

不要重新发明轮子:Java Card API 中有有用的内置静态方法,出于性能原因通常作为本机函数实现。你的代码不可能比他们好。

1) 首先,javacardx.framework.util.ArrayLogic.arrayCopyRepackNonAtomic 是您在使用 RAM 阵列时所需要的:

ArrayLogic.arrayCopyRepackNonAtomic(b, (short) 0, len, temp_conv, (short) 0);

还有arrayCopyRepack,对持久化数组很有用(整个操作在一个事务中完成,但速度稍慢)。


2) 如果你不能使用 ArrayLogic,总有 javacard.framework.Util.getShort,你可以使用它来代替按位魔术:

private static final void byteToShort(final byte[] bytes, final short blen, final short[] shorts)
{
    short x = 0;
    short y = 0;
    for (; y < blen; x++, y += 2)
    {
        shorts[x] = Util.getShort(bytes, y);
    }
}

请注意还有 setShort,这可能对 short[]byte[] 的转换有用。


3) 如果您真的想自己实现它,请对您的代码做一些其他说明:

  • 您的 aux 存储在永久内存中。这非常慢并且可能会损坏您的卡,因为 aux 经常被重写,请参阅
  • b[2*x+j] 无效,因为乘法慢。您应该改用两个循环变量,并且只使用加法。
  • 去掉aux和内循环,你根本不需要它们
  • int len呢? Java卡2.2.2中没有int...