0

質問は紛らわしく聞こえると思いますが、より明確にしようとしています。

Javaカードを使用して特定の非リークマップを実装したいのですが、私が持っている疑似コードによれば、次のようなものを実装する必要があります:

JCArrayInt[] f = new JCArrayInt[2];
f[0] = new JCArrayInt(size);
f[1] = new JCArrayInt(size);
byte[] r = new byte[6];
byte[] help = new byte[6];

help = bit_and(r, 0x000000000001);
return f[help[5]].jcint;

基本的に、JCArrayInt は、サイズ 6 (48 ビットの符号なし整数) の 2 つのバイト配列で構成される 2 次元配列として機能します。

私がビットごとにやりたいことは、バイト配列 r と定数を「0x00...1AND」することだけです。f[1]byte[]f[0]

現時点で行っていることは、戻り値に対して上記の手順を実行するだけです。しかし、これは「ハードコーディング」されているため、気分が悪くf[help[5]].jcint、よりスムーズな方法を知りたいと思っています。

4

1 に答える 1

0

f1 は次のように指定できると思います。

final byte[] f1 = new byte[] {(byte) 0x35, (byte) 0xB0,(byte) 0x88,(byte) 0xCC,(byte) 0xE1,(byte) 0x73}; 

次のように 6 バイトの定数を指定できます。

final byte[] constant = new byte[] {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01};

次のように左に回転できます。

public static byte[] ROTL48 (byte[] data) {
    byte  x = (byte)((data[0] >>> 7) & 0x001);
    short len = (short) (data.length - 1);
    for (short i = 0; i < len; ++i) {
        data[i] = (byte)(((data[i] << 1) & 0x0FE) | ((data[i + 1] >>> 7) & 0x001));
    }
    data[len] = (byte)(((data[len] << 1) & 0x0FE) | x);
    return data;
}

次に、これをビット単位で使用できます。

for (short i = 1; i < 47; i++) {
    R  = ROTL48(R);
    R1 = Utils.AND(R, constant);
    R  = Utils.XOR(R, Red[R1[5]].jcint);
    Y  = ROTL48(Y);
    Y1 = Utils.AND(Y, constant);
    R  = Utils.XOR(R, Mul[Y1[5]].jcint);}
    return R;
}

これがあなたにとってうまくいくかどうかはわかりませんが、これは私にとってうまくいきます

于 2015-03-02T08:14:08.300 に答える