From 423f24e9a182e986aeca404d80b3f9f469d80960 Mon Sep 17 00:00:00 2001 From: Daniel <59575049+lumijiez@users.noreply.github.com> Date: Wed, 4 Dec 2024 00:30:56 +0200 Subject: [PATCH] des key schedule for lab --- src/main/java/org/lumijiez/DES.java | 89 +++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/main/java/org/lumijiez/DES.java diff --git a/src/main/java/org/lumijiez/DES.java b/src/main/java/org/lumijiez/DES.java new file mode 100644 index 0000000..f4ae25c --- /dev/null +++ b/src/main/java/org/lumijiez/DES.java @@ -0,0 +1,89 @@ +package org.lumijiez; + +import java.util.Scanner; +import java.util.Random; + +public class DES { + private static final int[] SHIFT_TABLE = { + 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 + }; + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.println("DES Key Schedule Calculator - Ci and Di Generation"); + System.out.println("-----------------------------------------------"); + + System.out.println("Choose input method:"); + System.out.println("1. Random generation"); + System.out.println("2. Manual input"); + int choice = scanner.nextInt(); + + String kPlus; + + if (choice == 1) { + kPlus = generateRandomBits(56); + } else { + System.out.println("Enter 56-bit K+ (0s and 1s only):"); + kPlus = scanner.next(); + + if (!kPlus.matches("[01]{56}")) { + System.out.println("Invalid input! Please enter exactly 56 bits (0s and 1s only)"); + return; + } + } + + System.out.println("Enter round number i (1-16):"); + int round = scanner.nextInt(); + + if (round < 1 || round > 16) { + System.out.println("Invalid round number! Must be between 1 and 16"); + return; + } + + String c0 = kPlus.substring(0, 28); + String d0 = kPlus.substring(28, 56); + + System.out.println("\nInitial values:"); + System.out.println("K+ = " + kPlus); + System.out.println("C0 = " + c0); + System.out.println("D0 = " + d0); + + String ci = c0; + String di = d0; + + System.out.println("\nCalculating shifts for round " + round + ":"); + + for (int j = 0; j < round; j++) { + int shifts = SHIFT_TABLE[j]; + + ci = leftCircularShift(ci, shifts); + di = leftCircularShift(di, shifts); + + System.out.println("\nRound " + (j + 1) + ":"); + System.out.println("Number of left shifts: " + shifts); + System.out.println("C" + (j + 1) + " = " + ci); + System.out.println("D" + (j + 1) + " = " + di); + } + + System.out.println("\nFinal Result for round " + round + ":"); + System.out.println("C" + round + " = " + ci); + System.out.println("D" + round + " = " + di); + } + + private static String leftCircularShift(String bits, int positions) { + positions = positions % bits.length(); + return bits.substring(positions) + bits.substring(0, positions); + } + + private static String generateRandomBits(int length) { + Random random = new Random(); + StringBuilder sb = new StringBuilder(length); + + for (int i = 0; i < length; i++) { + sb.append(random.nextInt(2)); + } + + return sb.toString(); + } +}