字节数组的快速位移 - CMAC子键

voj*_*jta 7 performance cryptography bit-manipulation bit-shift javacard

我需要在JavaCard中尽可能快地实现16字节数组的左移位.

我试过这段代码:

private static final void rotateLeft(final byte[] output, final byte[] input) {
         short carry = 0;
         short i = (short) 16;
         do {
             --i;
             carry = (short)((input[i] << 1) | carry);
             output[i] = (byte)carry;
             carry = (short)((carry >> 8) & 1);
         } while (i > 0);
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何提高性能?我正在考虑一些Util.getShort(...)Util.setShort(...)魔法,但我没有设法让它比上面的实现更快.

这是CMAC子项计算的一部分,不幸的是,它经常完成.如果你知道一些更快的计算CMAC子项的方法(一个循环中的子键或类似的东西),请告诉我.

Dav*_*vid 4

当谈到速度时,已知长度,硬编码版本是最快的(但很难看)。如果您需要移位超过一位,请确保相应地更新代码。

output[0] = (byte)((byte)(input[0] << 1) | (byte)((input[1] >> 7) & 1));
output[1] = (byte)((byte)(input[1] << 1) | (byte)((input[2] >> 7) & 1));
output[2] = (byte)((byte)(input[2] << 1) | (byte)((input[3] >> 7) & 1));
output[3] = (byte)((byte)(input[3] << 1) | (byte)((input[4] >> 7) & 1));
output[4] = (byte)((byte)(input[4] << 1) | (byte)((input[5] >> 7) & 1));
output[5] = (byte)((byte)(input[5] << 1) | (byte)((input[6] >> 7) & 1));
output[6] = (byte)((byte)(input[6] << 1) | (byte)((input[7] >> 7) & 1));
output[7] = (byte)((byte)(input[7] << 1) | (byte)((input[8] >> 7) & 1));
output[8] = (byte)((byte)(input[8] << 1) | (byte)((input[9] >> 7) & 1));
output[9] = (byte)((byte)(input[9] << 1) | (byte)((input[10] >> 7) & 1));
output[10] = (byte)((byte)(input[10] << 1) | (byte)((input[11] >> 7) & 1));
output[11] = (byte)((byte)(input[11] << 1) | (byte)((input[12] >> 7) & 1));
output[12] = (byte)((byte)(input[12] << 1) | (byte)((input[13] >> 7) & 1));
output[13] = (byte)((byte)(input[13] << 1) | (byte)((input[14] >> 7) & 1));
output[14] = (byte)((byte)(input[14] << 1) | (byte)((input[15] >> 7) & 1));
output[15] = (byte)(input[15] << 1);
Run Code Online (Sandbox Code Playgroud)

并使用 RAM 字节数组!

  • @vojta这是因为复杂的乱序执行和分支预测,两者都受益于向后跳转,特别是如果循环条目在缓存行边界上对齐并且主体不大,因为CPU不需要分析你的再次编码。对于 HLVM(例如 Java 和 .Net),这可能会变得更加复杂,其中一些可识别的模式可能会转换为最佳本机指令(SSE 等),而手动展开的代码可能会被保留。因此,如果没有在确切的目标平台上进行适当的基准测试,就不应做出任何判断。 (3认同)