📄 key.java
字号:
public class Key {
public Key() {
}
// 子密钥生成
public String SKey(String key) {
String S_key = "";
S_key = key;
return S_key;
}
// 子密钥生成 key 代表上一轮的密钥 Xl代表轮数
public String SKey(String key, int Xl) {
String S_key = "";
if (key.length() >= 16) {
if (Xl != 0) {
S_key = S_Key(key, Xl);
}
else S_key = key;
}
return S_key;
}
// 子密钥生成 key 代表上一轮的密钥 Xl代表轮数
private String S_Key(String key, int Xl) {
SBox S = new SBox();
Operator g = new Operator();
byte[] M = new byte[4];
int keyc = key.length() / 4;
byte[][] SK = new byte[keyc][4];
byte[] k = new byte[keyc];
String S_key = "";
g.ToByte(SK, key);
round(k, Xl);// 子密钥的加密数组
for (int i = 0; i <= 3; i++) {
if (i == 0) {
byte[] Z = F(SK[i + 3], 4);
Y(Z);// 字节变换
S_B(S, Z);// S-Box代换
Z = g.XOR(SK[i], Z, k, 4);// 异或
S_key += g.ToString(Z);
M = F(Z, 4);
}
else {
// Z = F(M, 4);
byte[] Z = g.XOR(SK[i], M, 4);// 异或
S_key += g.ToString(Z);
M = F(Z, 4);
}
}
return S_key;
}
// 子密钥的加密数组
public void round(byte[] k, int Xl) {
int K = 1;
K = K << (Xl - 1);
if (K > 255) {
for (int i = Xl - 9; i >= 0; i--) {
if (K > 255) {
K = K ^ (0x011b << i);
}
}
k[0] = (byte) (K);
}
else k[0] = (byte) (K);
}
// 数组复制
public byte[] F(byte[] w, int kc) {
byte[] Z = new byte[kc];
for (int i = 0; i < kc; i++) {
Z[i] = w[i];
}
return Z;
}
// S-Box代换
public void S_B(SBox S, byte[] z) {
for (int i = 0; i < z.length; i++) {
z[i] = S.subByte((byte) z[i]);
}
}
// 字节变换
public void Y(byte[] z) {
byte m = z[0];
for (int i = 1; i < z.length; i++) {
z[i - 1] = z[i];
}
z[z.length - 1] = m;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -