factor out some constants

This commit is contained in:
Sebastian Hugentobler 2022-03-21 09:42:50 +01:00
parent 55876a7d33
commit 18cdd1ed81
Signed by: shu
GPG Key ID: BB32CF3CA052C2F0

View File

@ -62,6 +62,9 @@ public class SPN {
entry(15, 15) entry(15, 15)
); );
private static final int BLOCK_LENGTH = 16;
private static final int ROUNDS = 4;
public String decrypt(int key, String chiffre) { public String decrypt(int key, String chiffre) {
return null; return null;
@ -78,11 +81,11 @@ public class SPN {
* @return int array, with every int's lower 16 bits set to 16 bits of the input string. * @return int array, with every int's lower 16 bits set to 16 bits of the input string.
*/ */
public int[] strToArray(String bits) { public int[] strToArray(String bits) {
int[] data = new int[bits.length() / 16]; int[] data = new int[bits.length() / BLOCK_LENGTH];
for (int i = 0; i < data.length; i++) { for (int i = 0; i < data.length; i++) {
int startIdx = i * 16; int startIdx = i * BLOCK_LENGTH;
String wordBits = bits.substring(startIdx, startIdx + 16); String wordBits = bits.substring(startIdx, startIdx + BLOCK_LENGTH);
int word = Integer.parseInt(wordBits, 2); int word = Integer.parseInt(wordBits, 2);
data[i] = word; data[i] = word;
} }
@ -100,14 +103,14 @@ public class SPN {
public int encryptBlock(int key, int x) { public int encryptBlock(int key, int x) {
x = init(key, x, 0); // initialer Weisschritt x = init(key, x, 0); // initialer Weisschritt
for (int i = 1; i < 4; i++) { // for rounds > 0 && < r for (int i = 1; i < ROUNDS; i++) { // for rounds > 0 && < r
x = substitution(x, SBOX); // run through s-box x = substitution(x, SBOX); // run through s-box
x = permutation(x); // permutate x = permutation(x); // permutate
x ^= k(key, i); // xor with derived round key x ^= k(key, i); // xor with derived round key
} }
x = substitution(x, SBOX); // run through s-box x = substitution(x, SBOX); // run through s-box
x ^= k(key, 4); // xor with last round key x ^= k(key, ROUNDS); // xor with last round key
return x; return x;
} }
@ -120,9 +123,9 @@ public class SPN {
* @return Decrypted block. * @return Decrypted block.
*/ */
public int decryptBlock(int key, int x) { public int decryptBlock(int key, int x) {
x = init(key, x, 4); // initialer Weisschritt x = init(key, x, ROUNDS); // initialer Weisschritt
for (int i = 3; i > 0; i--) { // for rounds > 0 && < r, going in reverse for (int i = ROUNDS - 1; i > 0; i--) { // for rounds > 0 && < r, going in reverse
x = substitution(x, SBOX_REVERSE); // run through reverse s-box x = substitution(x, SBOX_REVERSE); // run through reverse s-box
x = permutation(x); // permutate x = permutation(x); // permutate
x ^= permutation(k(key, i)); // xor with permutated derived round key x ^= permutation(k(key, i)); // xor with permutated derived round key
@ -144,7 +147,7 @@ public class SPN {
* @return Derived key. * @return Derived key.
*/ */
public int k(int key, int i) { public int k(int key, int i) {
i *= 4; i *= ROUNDS;
int mask = 0xFFFF_0000 >>> i; int mask = 0xFFFF_0000 >>> i;
return (key & mask) >>> ROUND_KEY_LENGTH - i; return (key & mask) >>> ROUND_KEY_LENGTH - i;
@ -174,7 +177,7 @@ public class SPN {
public int permutation(int x) { public int permutation(int x) {
Map<Integer, Boolean> blocked = new HashMap<>(); Map<Integer, Boolean> blocked = new HashMap<>();
for (int i = 0; i < 16; i++) { for (int i = 0; i < BLOCK_LENGTH; i++) {
int target = PERMUTATION.get(i); int target = PERMUTATION.get(i);
if (!blocked.containsKey(target)) { if (!blocked.containsKey(target)) {
x = swapBits(x, i, target); x = swapBits(x, i, target);