📄 sbox.java
字号:
public class SBox {
/*
* 输出单字节变换的结果
*/
public byte subByte(byte input) {
byte c = 0x63;// 保留字
byte b = GF_Reverse(input);// 求逆元
byte B = 0x00;// 存放取出一个字节中的一位
byte m = 0x00;// 转化后的字节
for (int i = 0; i <= 7; i++) {
B =
(byte) (bit(b, i) ^ bit(b, (i + 4) % 8) ^ bit(b, (i + 5) % 8)
^ bit(b, (i + 6) % 8) ^ bit(b, (i + 7) % 8) ^ bit(c, i));
m = setbit(m, B, i);
}
return m;
}
private byte GF_Reverse(byte k) {
int[][] invlog = new int[16][16];
invlog = invLog();
int m = 0, ii = 0, jj = 0;
byte km = 0;
outer: for (int i = 0; i <= 15; i++) {
for (int j = 0; j <= 15; j++) {
if (k == 0) break outer;
else
if (k == (byte) invlog[i][j]) {
m = (255 - (i * 16 + j)) % 255;
ii = m / 16;
jj = m % 16;
km = (byte) invlog[ii][jj];
break outer;
}
}
}
return km;
}
private int[][] invLog() {
int[][] invlog = new int[16][16];
invlog[0][0] = 0;
for (int i = 0; i <= 15; i++) {
for (int j = 0; j <= 15; j++) {
if (i != 0 && j == 0) invlog[i][j] = l(invlog[i - 1][j + 15]);
else
if (i == 0 && j == 0) invlog[0][0] = 1;
else invlog[i][j] = l(invlog[i][j - 1]);
}
}
return invlog;
}
private int l(int a) {
int m = a;
int s = a << 1;
s = (m ^ s);
if (s > 255) {
s = s ^ (int) 283;
}
return s;
}
private byte setbit(byte m, byte B, int i) {
if (B == 1) {
if (i == 1) m = (byte) (m | 0x02);
if (i == 2) m = (byte) (m | 0x04);
if (i == 3) m = (byte) (m | 0x08);
if (i == 4) m = (byte) (m | 0x10);
if (i == 5) m = (byte) (m | 0x20);
if (i == 6) m = (byte) (m | 0x40);
if (i == 7) m = (byte) (m | 0x80);
if (i == 0) m = (byte) (m | 0x01);
}
return m;
}
private byte bit(byte bt, int i) {
byte m = 0x00;
if (i == 1) m = (byte) (bt & 0x02);
if (i == 2) m = (byte) (bt & 0x04);
if (i == 3) m = (byte) (bt & 0x08);
if (i == 4) m = (byte) (bt & 0x10);
if (i == 5) m = (byte) (bt & 0x20);
if (i == 6) m = (byte) (bt & 0x40);
if (i == 7) m = (byte) (bt & 0x80);
if (i == 0) m = (byte) (bt & 0x01);
if (m != 0) {
m = 0x01;
}
if (m == 0) {
m = 0x00;
}
return m;
}
public static void main(String[] args) {
SBox S = new SBox();
System.out.println(Integer.toHexString(S.subByte((byte) 0x80)));
}
public byte invSubByte(byte b) {
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -