summaryrefslogtreecommitdiffstats
path: root/Master/Kryptografie/p2
diff options
context:
space:
mode:
authorSven Eisenhauer <sven@sven-eisenhauer.net>2023-11-10 15:11:48 +0100
committerSven Eisenhauer <sven@sven-eisenhauer.net>2023-11-10 15:11:48 +0100
commit33613a85afc4b1481367fbe92a17ee59c240250b (patch)
tree670b842326116b376b505ec2263878912fca97e2 /Master/Kryptografie/p2
downloadStudium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.gz
Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.bz2
add new repoHEADmaster
Diffstat (limited to 'Master/Kryptografie/p2')
-rw-r--r--Master/Kryptografie/p2/GalController.java76
-rw-r--r--Master/Kryptografie/p2/GalNumber.java206
-rw-r--r--Master/Kryptografie/p2/GalTest.java71
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;
+ }
+
+
+}