📄 serpent.java
字号:
x4 ^= key.k110; x2 ^= key.k111; sboxI2(); x1 ^= key.k104; x3 ^= key.k105; x4 ^= key.k106; x2 ^= key.k107; sboxI1(); x0 ^= key.k100; x1 ^= key.k101; x2 ^= key.k102; x4 ^= key.k103; sboxI0(); x0 ^= key.k96; x3 ^= key.k97; x1 ^= key.k98; x4 ^= key.k99; sboxI7(); x1 = x3; x3 = x4; x4 = x2; x3 ^= key.k92; x0 ^= key.k93; x1 ^= key.k94; x4 ^= key.k95; sboxI6(); x0 ^= key.k88; x1 ^= key.k89; x2 ^= key.k90; x4 ^= key.k91; sboxI5(); x1 ^= key.k84; x3 ^= key.k85; x4 ^= key.k86; x2 ^= key.k87; sboxI4(); x1 ^= key.k80; x2 ^= key.k81; x4 ^= key.k82; x0 ^= key.k83; sboxI3(); x0 ^= key.k76; x1 ^= key.k77; x4 ^= key.k78; x2 ^= key.k79; sboxI2(); x1 ^= key.k72; x3 ^= key.k73; x4 ^= key.k74; x2 ^= key.k75; sboxI1(); x0 ^= key.k68; x1 ^= key.k69; x2 ^= key.k70; x4 ^= key.k71; sboxI0(); x0 ^= key.k64; x3 ^= key.k65; x1 ^= key.k66; x4 ^= key.k67; sboxI7(); x1 = x3; x3 = x4; x4 = x2; x3 ^= key.k60; x0 ^= key.k61; x1 ^= key.k62; x4 ^= key.k63; sboxI6(); x0 ^= key.k56; x1 ^= key.k57; x2 ^= key.k58; x4 ^= key.k59; sboxI5(); x1 ^= key.k52; x3 ^= key.k53; x4 ^= key.k54; x2 ^= key.k55; sboxI4(); x1 ^= key.k48; x2 ^= key.k49; x4 ^= key.k50; x0 ^= key.k51; sboxI3(); x0 ^= key.k44; x1 ^= key.k45; x4 ^= key.k46; x2 ^= key.k47; sboxI2(); x1 ^= key.k40; x3 ^= key.k41; x4 ^= key.k42; x2 ^= key.k43; sboxI1(); x0 ^= key.k36; x1 ^= key.k37; x2 ^= key.k38; x4 ^= key.k39; sboxI0(); x0 ^= key.k32; x3 ^= key.k33; x1 ^= key.k34; x4 ^= key.k35; sboxI7(); x1 = x3; x3 = x4; x4 = x2; x3 ^= key.k28; x0 ^= key.k29; x1 ^= key.k30; x4 ^= key.k31; sboxI6(); x0 ^= key.k24; x1 ^= key.k25; x2 ^= key.k26; x4 ^= key.k27; sboxI5(); x1 ^= key.k20; x3 ^= key.k21; x4 ^= key.k22; x2 ^= key.k23; sboxI4(); x1 ^= key.k16; x2 ^= key.k17; x4 ^= key.k18; x0 ^= key.k19; sboxI3(); x0 ^= key.k12; x1 ^= key.k13; x4 ^= key.k14; x2 ^= key.k15; sboxI2(); x1 ^= key.k8; x3 ^= key.k9; x4 ^= key.k10; x2 ^= key.k11; sboxI1(); x0 ^= key.k4; x1 ^= key.k5; x2 ^= key.k6; x4 ^= key.k7; sboxI0(); x2 = x1; x1 = x3; x3 = x4; x0 ^= key.k0; x1 ^= key.k1; x2 ^= key.k2; x3 ^= key.k3; out[o] = (byte) x0; out[o + 1] = (byte) (x0 >>> 8); out[o + 2] = (byte) (x0 >>> 16); out[o + 3] = (byte) (x0 >>> 24); out[o + 4] = (byte) x1; out[o + 5] = (byte) (x1 >>> 8); out[o + 6] = (byte) (x1 >>> 16); out[o + 7] = (byte) (x1 >>> 24); out[o + 8] = (byte) x2; out[o + 9] = (byte) (x2 >>> 8); out[o + 10] = (byte) (x2 >>> 16); out[o + 11] = (byte) (x2 >>> 24); out[o + 12] = (byte) x3; out[o + 13] = (byte) (x3 >>> 8); out[o + 14] = (byte) (x3 >>> 16); out[o + 15] = (byte) (x3 >>> 24); } public boolean selfTest() { if (valid == null) { boolean result = super.selfTest(); // do symmetry tests if (result) { result = testKat(KAT_KEY, KAT_CT); } valid = new Boolean(result); } return valid.booleanValue(); } // Own methods. ---------------------------------------------------------- // These first few S-boxes operate directly on the "registers", // x0..x4, and perform the linear transform. private void sbox0() { x3 ^= x0; x4 = x1; x1 &= x3; x4 ^= x2; x1 ^= x0; x0 |= x3; x0 ^= x4; x4 ^= x3; x3 ^= x2; x2 |= x1; x2 ^= x4; x4 ^= -1; x4 |= x1; x1 ^= x3; x1 ^= x4; x3 |= x0; x1 ^= x3; x4 ^= x3; x1 = (x1 << 13) | (x1 >>> 19); x4 ^= x1; x3 = x1 << 3; x2 = (x2 << 3) | (x2 >>> 29); x4 ^= x2; x0 ^= x2; x4 = (x4 << 1) | (x4 >>> 31); x0 ^= x3; x0 = (x0 << 7) | (x0 >>> 25); x3 = x4; x1 ^= x4; x3 <<= 7; x1 ^= x0; x2 ^= x0; x2 ^= x3; x1 = (x1 << 5) | (x1 >>> 27); x2 = (x2 << 22) | (x2 >>> 10); } private void sbox1() { x4 = ~x4; x3 = x1; x1 ^= x4; x3 |= x4; x3 ^= x0; x0 &= x1; x2 ^= x3; x0 ^= x4; x0 |= x2; x1 ^= x3; x0 ^= x1; x4 &= x2; x1 |= x4; x4 ^= x3; x1 ^= x2; x3 |= x0; x1 ^= x3; x3 = ~x3; x4 ^= x0; x3 &= x2; x4 = ~x4; x3 ^= x1; x4 ^= x3; x0 = (x0 << 13) | (x0 >>> 19); x4 ^= x0; x3 = x0 << 3; x2 = (x2 << 3) | (x2 >>> 29); x4 ^= x2; x1 ^= x2; x4 = (x4 << 1) | (x4 >>> 31); x1 ^= x3; x1 = (x1 << 7) | (x1 >>> 25); x3 = x4; x0 ^= x4; x3 <<= 7; x0 ^= x1; x2 ^= x1; x2 ^= x3; x0 = (x0 << 5) | (x0 >>> 27); x2 = (x2 << 22) | (x2 >>> 10); } private void sbox2() { x3 = x0; x0 = x0 & x2; x0 = x0 ^ x1; x2 = x2 ^ x4; x2 = x2 ^ x0; x1 = x1 | x3; x1 = x1 ^ x4; x3 = x3 ^ x2; x4 = x1; x1 = x1 | x3; x1 = x1 ^ x0; x0 = x0 & x4; x3 = x3 ^ x0; x4 = x4 ^ x1; x4 = x4 ^ x3; x3 = ~x3; x2 = (x2 << 13) | (x2 >>> 19); x1 ^= x2; x0 = x2 << 3; x4 = (x4 << 3) | (x4 >>> 29); x1 ^= x4; x3 ^= x4; x1 = (x1 << 1) | (x1 >>> 31); x3 ^= x0; x3 = (x3 << 7) | (x3 >>> 25); x0 = x1; x2 ^= x1; x0 <<= 7; x2 ^= x3; x4 ^= x3; x4 ^= x0; x2 = (x2 << 5) | (x2 >>> 27); x4 = (x4 << 22) | (x4 >>> 10); } private void sbox3() { x0 = x2; x2 = x2 | x3; x3 = x3 ^ x1; x1 = x1 & x0; x0 = x0 ^ x4; x4 = x4 ^ x3; x3 = x3 & x2; x0 = x0 | x1; x3 = x3 ^ x0; x2 = x2 ^ x1; x0 = x0 & x2; x1 = x1 ^ x3; x0 = x0 ^ x4; x1 = x1 | x2; x1 = x1 ^ x4; x2 = x2 ^ x3; x4 = x1; x1 = x1 | x3; x1 = x1 ^ x2; x1 = (x1 << 13) | (x1 >>> 19); x4 ^= x1; x2 = x1 << 3; x3 = (x3 << 3) | (x3 >>> 29); x4 ^= x3; x0 ^= x3; x4 = (x4 << 1) | (x4 >>> 31); x0 ^= x2; x0 = (x0 << 7) | (x0 >>> 25); x2 = x4; x1 ^= x4; x2 <<= 7; x1 ^= x0; x3 ^= x0; x3 ^= x2; x1 = (x1 << 5) | (x1 >>> 27); x3 = (x3 << 22) | (x3 >>> 10); } private void sbox4() { x4 = x4 ^ x0; x0 = ~x0; x3 = x3 ^ x0; x0 = x0 ^ x1; x2 = x4; x4 = x4 & x0; x4 = x4 ^ x3; x2 = x2 ^ x0; x1 = x1 ^ x2; x3 = x3 & x2; x3 = x3 ^ x1; x1 = x1 & x4; x0 = x0 ^ x1; x2 = x2 | x4; x2 = x2 ^ x1; x1 = x1 | x0; x1 = x1 ^ x3; x3 = x3 & x0; x1 = ~x1; x2 = x2 ^ x3; x4 = (x4 << 13) | (x4 >>> 19); x2 ^= x4; x3 = x4 << 3; x1 = (x1 << 3) | (x1 >>> 29); x2 ^= x1; x0 ^= x1; x2 = (x2 << 1) | (x2 >>> 31); x0 ^= x3; x0 = (x0 << 7) | (x0 >>> 25); x3 = x2; x4 ^= x2; x3 <<= 7; x4 ^= x0; x1 ^= x0; x1 ^= x3; x4 = (x4 << 5) | (x4 >>> 27); x1 = (x1 << 22) | (x1 >>> 10); } private void sbox5() { x4 = x4 ^ x2; x2 = x2 ^ x0; x0 = ~x0; x3 = x2; x2 = x2 & x4; x1 = x1 ^ x0; x2 = x2 ^ x1; x1 = x1 | x3; x3 = x3 ^ x0; x0 = x0 & x2; x0 = x0 ^ x4; x3 = x3 ^ x2; x3 = x3 ^ x1; x1 = x1 ^ x4; x4 = x4 & x0; x1 = ~x1; x4 = x4 ^ x3; x3 = x3 | x0; x1 = x1 ^ x3; x2 = (x2 << 13) | (x2 >>> 19); x0 ^= x2; x3 = x2 << 3; x4 = (x4 << 3) | (x4 >>> 29); x0 ^= x4; x1 ^= x4; x0 = (x0 << 1) | (x0 >>> 31); x1 ^= x3; x1 = (x1 << 7) | (x1 >>> 25); x3 = x0; x2 ^= x0; x3 <<= 7; x2 ^= x1; x4 ^= x1; x4 ^= x3; x2 = (x2 << 5) | (x2 >>> 27); x4 = (x4 << 22) | (x4 >>> 10); } private void sbox6() { x4 = ~x4; x3 = x1; x1 = x1 & x2; x2 = x2 ^ x3; x1 = x1 ^ x4; x4 = x4 | x3; x0 = x0 ^ x1; x4 = x4 ^ x2; x2 = x2 | x0; x4 = x4 ^ x0; x3 = x3 ^ x2; x2 = x2 | x1; x2 = x2 ^ x4; x3 = x3 ^ x1; x3 = x3 ^ x2; x1 = ~x1; x4 = x4 & x3; x4 = x4 ^ x1; x2 = (x2 << 13) | (x2 >>> 19); x0 ^= x2; x1 = x2 << 3; x3 = (x3 << 3) | (x3 >>> 29); x0 ^= x3; x4 ^= x3; x0 = (x0 << 1) | (x0 >>> 31); x4 ^= x1; x4 = (x4 << 7) | (x4 >>> 25); x1 = x0; x2 ^= x0; x1 <<= 7; x2 ^= x4; x3 ^= x4; x3 ^= x1; x2 = (x2 << 5) | (x2 >>> 27); x3 = (x3 << 22) | (x3 >>> 10); } private void sbox7() { x1 = x3; x3 = x3 & x0; x3 = x3 ^ x4; x4 = x4 & x0; x1 = x1 ^ x3; x3 = x3 ^ x0; x0 = x0 ^ x2; x2 = x2 | x1; x2 = x2 ^ x3; x4 = x4 ^ x0; x3 = x3 ^ x4; x4 = x4 & x2; x4 = x4 ^ x1; x1 = x1 ^ x3; x3 = x3 & x2; x1 = ~x1; x3 = x3 ^ x1; x1 = x1 & x2; x0 = x0 ^ x4; x1 = x1 ^ x0; x3 = (x3 << 13) | (x3 >>> 19); x1 ^= x3; x0 = x3 << 3; x4 = (x4 << 3) | (x4 >>> 29); x1 ^= x4; x2 ^= x4; x1 = (x1 << 1) | (x1 >>> 31); x2 ^= x0; x2 = (x2 << 7) | (x2 >>> 25); x0 = x1; x3 ^= x1; x0 <<= 7; x3 ^= x2; x4 ^= x2; x4 ^= x0; x3 = (x3 << 5) | (x3 >>> 27); x4 = (x4 << 22) | (x4 >>> 10); } /** The final S-box, with no transform. */ private void sbox7noLT() { x1 = x3; x3 = x3 & x0; x3 = x3 ^ x4; x4 = x4 & x0; x1 = x1 ^ x3; x3 = x3 ^ x0; x0 = x0 ^ x2; x2 = x2 | x1; x2 = x2 ^ x3; x4 = x4 ^ x0; x3 = x3 ^ x4; x4 = x4 & x2; x4 = x4 ^ x1; x1 = x1 ^ x3; x3 = x3 & x2; x1 = ~x1; x3 = x3 ^ x1; x1 = x1 & x2; x0 = x0 ^ x4; x1 = x1 ^ x0; } private void sboxI7noLT() { x4 = x2; x2 ^= x0; x0 &= x3; x2 = ~x2; x4 |= x3; x3 ^= x1; x1 |= x0; x0 ^= x2; x2 &= x4; x1 ^= x2; x2 ^= x0; x0 |= x2; x3 &= x4; x0 ^= x3; x4 ^= x1; x3 ^= x4; x4 |= x0; x3 ^= x2; x4 ^= x2; } private void sboxI6() { x1 = (x1 >>> 22) | (x1 << 10); x3 = (x3 >>> 5) | (x3 << 27); x2 = x0; x1 ^= x4; x2 <<= 7; x3 ^= x4; x1 ^= x2; x3 ^= x0; x4 = (x4 >>> 7) | (x4 << 25); x0 = (x0 >>> 1) | (x0 << 31); x0 ^= x3; x2 = x3 << 3; x4 ^= x2; x3 = (x3 >>> 13) | (x3 << 19); x0 ^= x1; x4 ^= x1; x1 = (x1 >>> 3) | (x1 << 29); x3 ^= x1; x2 = x1; x1 &= x3; x2 ^= x4; x1 = ~x1; x4 ^= x0; x1 ^= x4; x2 |= x3; x3 ^= x1; x4 ^= x2; x2 ^= x0; x0 &= x4; x0 ^= x3; x3 ^= x4; x3 |= x1; x4 ^= x0; x2 ^= x3; } private void sboxI5() { x2 = (x2 >>> 22) | (x2 << 10); x0 = (x0 >>> 5) | (x0 << 27); x3 = x1; x2 ^= x4;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -