diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Master/Kryptografie/p2 | |
| download | Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.gz Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.bz2 | |
Diffstat (limited to 'Master/Kryptografie/p2')
| -rw-r--r-- | Master/Kryptografie/p2/GalController.java | 76 | ||||
| -rw-r--r-- | Master/Kryptografie/p2/GalNumber.java | 206 | ||||
| -rw-r--r-- | Master/Kryptografie/p2/GalTest.java | 71 |
3 files changed, 353 insertions, 0 deletions
diff --git a/Master/Kryptografie/p2/GalController.java b/Master/Kryptografie/p2/GalController.java new file mode 100644 index 0000000..00a34f2 --- /dev/null +++ b/Master/Kryptografie/p2/GalController.java @@ -0,0 +1,76 @@ +package krypto;
+
+public class GalController {
+
+ int key_s = 7;
+ int key_t = 3;
+
+ private char encryptChar(char klar)
+ {
+ GalNumber gn_geheim = new GalNumber();
+ GalNumber gn_klar = new GalNumber((int)klar);
+ GalNumber gn_key_s = new GalNumber(key_s);
+ GalNumber gn_key_t = new GalNumber(key_t);
+ GalNumber rijndael_mod = new GalNumber(GalNumber.RIJN_MOD);
+
+ gn_geheim = gn_klar.add(gn_key_s).mult(gn_key_t.mod(rijndael_mod));
+
+ System.out.println("Klar: "+gn_klar.toHex()+" Geheim: "+gn_geheim.toHex());
+
+ return gn_geheim.toChar();
+ }
+
+ private char decryptChar(char geheim)
+ {
+ GalNumber gn_geheim = new GalNumber();
+ GalNumber gn_klar = new GalNumber();
+ GalNumber gn_key_s = new GalNumber(key_s);
+ GalNumber gn_key_t = new GalNumber(key_t);
+ GalNumber rijndael_mod = new GalNumber(GalNumber.RIJN_MOD);
+
+ gn_geheim.setVal((int) geheim);
+
+ gn_klar = gn_geheim.mult(gn_key_t.inv()).sub(gn_key_s.mod(rijndael_mod));
+
+ System.out.println("Geheim char: "+geheim+" int "+(int)geheim+" GN Geheim: "+gn_geheim.toHex()+" Klar: "+gn_klar.toHex());
+
+ return gn_klar.toChar();
+ }
+
+ public String encrypt(String klarText)
+ {
+ char [] chars = new char[klarText.length()];
+ for (int i=0;i<klarText.length();i++)
+ {
+ chars[i] = encryptChar(klarText.charAt(i));
+ }
+ String geheimText=new String(chars);
+ return geheimText;
+ }
+
+ public String decrypt(String geheimText)
+ {
+ char [] chars = new char[geheimText.length()];
+ for (int i=0;i<geheimText.length();i++)
+ {
+ //System.out.println("cipher "+i+": "+geheimText.charAt(i)+" int: "+(int) geheimText.charAt(i));
+ chars[i] = decryptChar(geheimText.charAt(i));
+ }
+ String klarText=new String(chars);
+ return klarText;
+ }
+
+ public void setKeyS(int s)
+ {
+ key_s = s;
+ }
+ public void setKeyT(int t)
+ {
+ key_t = t;
+ }
+ public void setKeyST(int s, int t)
+ {
+ setKeyS(s);
+ setKeyT(t);
+ }
+}
diff --git a/Master/Kryptografie/p2/GalNumber.java b/Master/Kryptografie/p2/GalNumber.java new file mode 100644 index 0000000..b598330 --- /dev/null +++ b/Master/Kryptografie/p2/GalNumber.java @@ -0,0 +1,206 @@ +package krypto; + +public class GalNumber { + + public static int RIJN_MOD = 0x11B; + public static int BITWIDTH = 8; + public static int BITMASK = 0xff; + public static int DIV_POS = 0; + public static int MOD_POS = 1; + private static int[] BIT_LUT = { + 0x1, 0x2, 0x4, 0x8, + 0x10, 0x20, 0x40, 0x80, + 0x100, 0x200, 0x400, 0x800, + 0x1000, 0x2000, 0x4000, 0x8000 + }; + + private int value; + + + public GalNumber() { + this.value = 0; + } + + public GalNumber (int in) { + value = in & BITMASK; + } + + public GalNumber (GalNumber in) { + value = in.value; + } + + public GalNumber div(GalNumber rightOp) { + int[] result = new int[2]; + result=this.reduce(rightOp); + return new GalNumber(result[DIV_POS]); + } + + private int unstrippedMult(GalNumber rightOp) { + int result = 0x0; + int bitmask=0x0; + int ro=rightOp.toInt(); + int lo=this.value; + int temp=0x0; + int actBit; + + for (int i=0;i<16;i++) + { + bitmask=(0x1 << i); + actBit=ro&bitmask; + if (actBit != 0) { + temp=lo << i; + result ^= temp; + } + } + + return result; + } + + public GalNumber mult(GalNumber rightOp) { + int [] divmod = new int[2]; + GalNumber gn_tmp = new GalNumber(); + int tmp = this.unstrippedMult(rightOp); + gn_tmp.setVal(tmp); + divmod = gn_tmp.reduce(RIJN_MOD); + return new GalNumber(divmod[MOD_POS]); + } + + public GalNumber mod(GalNumber rightOp) { + int[] result = new int[2]; + result=this.reduce(rightOp); + return new GalNumber(result[MOD_POS]); + } + + public GalNumber euklid(int modul, GalNumber toInvert) throws Exception { + + GalNumber a= new GalNumber(modul); + GalNumber b=new GalNumber(toInvert); + GalNumber r1=new GalNumber(0); + GalNumber r2=new GalNumber(1); + + GalNumber a_new=new GalNumber(0); + GalNumber b_new=new GalNumber(0); + GalNumber r1_new=new GalNumber(0); + GalNumber r2_new=new GalNumber(0); + + //while (b.toInt() != 1) { + while (b.toInt() > 1) { + /*if (b.toInt() == 0) + { + throw new Exception("b became ZERO"); + }*/ + a_new = b; + b_new= a.mod(b); + r1_new=r2; + r2_new=r1.add( ( a.div(b) ).mult(r2) ); + + a=a_new; + b=b_new; + r1=r1_new; + r2=r2_new; + } + + return r2; + } + public GalNumber inv() { + GalNumber result = new GalNumber(); + try { + result = euklid(RIJN_MOD, this); + + } + catch (Exception e) { + //System.out.println(e.getMessage()); + result.setVal(0); + } + return result; + } + public GalNumber add(GalNumber rightOp) { + int sum=0; + sum=this.value ^ rightOp.toInt(); + return new GalNumber(sum); + } + + private int[] reduce(GalNumber rightOp) { + return reduce(rightOp.toInt() ); + } + private int[] reduce(int rightOp) { + + int [] divmod = new int[2]; + divmod[DIV_POS]=0; + divmod[MOD_POS]=this.toInt(); + int shift = 0; + int rightOpMSB=0; + int leftOpMSB=0; + + // Search MSB in right Operand + for (int i = BIT_LUT.length - 1; i >= 0; i--) + { + if ((rightOp & BIT_LUT[i]) != 0) + { + rightOpMSB = i; + break; + } + } + if (this.toInt() == 0) { + divmod[DIV_POS]=0; + divmod[MOD_POS]=0; + return divmod; + } + if (rightOp == 0){ + divmod[DIV_POS]=0; + divmod[MOD_POS]=this.toInt(); + return divmod; + } + do { + // Search MSB in left Operand + for (int i = BIT_LUT.length - 1; i >= 0; i--) + { + if ((divmod[MOD_POS] & BIT_LUT[i]) != 0) + { + leftOpMSB = i; + break; + } + } + if (leftOpMSB >= rightOpMSB) + { + // Align the ro to the MSB of the lp and add this + shift = leftOpMSB - rightOpMSB; + + // Save result vor integral div + divmod[DIV_POS] = divmod[DIV_POS] ^ (0x1 << shift); + + // Next polynom for division + divmod[MOD_POS] = divmod[MOD_POS] ^ (rightOp << shift); + + if (divmod[MOD_POS] == 0) + return divmod; + } + + } while (leftOpMSB>=rightOpMSB); + return divmod; + } + + public GalNumber sub(GalNumber rightOp) { + return new GalNumber(this.add(rightOp)); + } + + public int toInt() { + return this.value; + } + + public String toHex() { + return "'"+Integer.toHexString(this.toInt()).toUpperCase()+"'"; + } + + public String toString() { + return Integer.toString(this.value); + } + + public char toChar() { + return (char) this.toInt(); + } + + public void setVal(int a) { + value=a; + } +} diff --git a/Master/Kryptografie/p2/GalTest.java b/Master/Kryptografie/p2/GalTest.java new file mode 100644 index 0000000..88cb3f6 --- /dev/null +++ b/Master/Kryptografie/p2/GalTest.java @@ -0,0 +1,71 @@ +package krypto;
+import java.util.Random;
+
+public class GalTest {
+ private int testSize;
+ private long startTime;
+ private long finishTime;
+
+ private GalNumber[] galNumbers;
+
+ public GalTest() {
+ this.setTestSize(1000);
+ this.init();
+ }
+
+ public GalTest(int testSize) {
+ this.setTestSize(testSize);
+ this.init();
+ }
+
+ public void init() {
+ galNumbers = new GalNumber[testSize];
+ Random rnd = new Random();
+ if (galNumbers != null) {
+ for (int i=0;i<galNumbers.length;i++) {
+ galNumbers[i]= new GalNumber(rnd.nextInt());
+ }
+ }
+ }
+
+ public void doInvTest() {
+ if (galNumbers != null) {
+ this.setStartTime(System.currentTimeMillis());
+ for (int i=0;i<galNumbers.length;i++) {
+ //System.out.println(galNumbers[i].inv());
+ galNumbers[i].inv();
+ if ( (i % (galNumbers.length/10)) == 0) {
+ System.out.println("Inverse von "+galNumbers[i].toHex()+" ist "+galNumbers[i].inv());
+ }
+ }
+ this.setFinishTime(System.currentTimeMillis());
+ }
+ System.out.println("Test took "+(finishTime-startTime)+" milliseconds");
+ }
+
+ public void setTestSize(int i) {
+ this.testSize = i;
+ }
+
+ public int getTestSize() {
+ return testSize;
+ }
+
+ public long getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(long startTime) {
+ this.startTime = startTime;
+ }
+
+ public long getFinishTime() {
+ return finishTime;
+ }
+
+ public void setFinishTime(long finishTime) {
+ this.finishTime = finishTime;
+ }
+
+
+}
|
