XOR-Verschlüsselung

  • Themenstarter Themenstarter silver
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

silver

Gast
Hi @ all,
ich wollte mir eine simple Verschlüsselung basteln und habe nur ein kleines Problem,
dass ich irgendwie nicht verstehe! Es handelt sich um die XOR-Verschlüsselung
(ich habe auch die Forensuche benutzt und solche Themen gefunden, jedoch hab ich mir
das ein wenig anderster vorgestellt) und es scheint so als würde alles funktionieren außer
meine XOR() Methode. Ich habe durch Kontrollausgaben feststellen können, dass das XOR
richtig berechnet wird, jedoch ist der Rückgabewert nicht korrekt!!!

Code:
public class CDataEncryptionStandard {
	private String message;
	private String key="3db58a9f";
	private int length=8;
	
	public CDataEncryptionStandard(String msg) {
		while(msg.length()>8&&this.length/msg.length()<1) this.length+=8;
		message=msg;
	}

	public void getMSG() {
		System.out.println("MSG: "+message);
	}

	private String Str2Bin() {
		String binStr="";
		for(int i=0;i<this.length;i++) {
			if(i<message.length()) {
				int chr=(int)message.charAt(i),init=128;
				String tmp=Integer.toBinaryString((int)(message.charAt(i)));
					while(chr<init) {
						binStr+="0";
						init/=2;
					}
				binStr+=tmp;
			}
			else binStr+="11111111";
		}
		return binStr;
	}

	private String Bin2Str() {
		String str="";
		for(int i=0;i<message.length();i+=8) {
			int tmp=0,init=128;
				for(int j=i;j<i+8;j++) {
					if(message.charAt(j)!='0') tmp+=init;
					init/=2;
				}
				if(tmp!=255) str+=(char)tmp;
		}
		return str;
	}

	private String getBinKey() {
		String binStr="";
		for(int i=0;i<key.length();i++) {
			int chr=(int)key.charAt(i),init=128;
			String tmp=Integer.toBinaryString((int)(key.charAt(i)));
				while(chr<init) {
					binStr+="0";
					init/=2;
				}
			binStr+=tmp;
		}
		return binStr;
	}

	private String XOR() {
		String str="";
		for(int i=0,j=0;i<message.length();i++,j++) {
			if(i%8==0&&i!=0) j=0;
			str+=message.charAt(i)^key.charAt(j);
		}
		return str;
	}

	public void decrypt() {
		message=Str2Bin();
		key=getBinKey();
		message=XOR();
		message=Bin2Str();
	}
/*
	public void encrypt() {
	
	}
*/
	public static void main(String[] args) {
		CDataEncryptionStandard cdes=new CDataEncryptionStandard("Hallo");
		cdes.getMSG();
		cdes.decrypt();
		cdes.getMSG();
	}

}
 
Kann ich nicht genau sagen, jedoch dürfen die letzten drei Zeichen nicht die selben sein, da die letzten drei Zeichen vom Schlüssel unterschiedlich sind!

01001000 01100001 01101100 01101100 01101111 11111111 11111111 11111111 // Hallo Binär
00110011 01100100 01100010 00110101 00111000 01100001 00111001 01100110 // Schlüssel Binär
----------------------------------------------------------------------------------------------------------------------
01111011 01010010 01011111 01011111 01011100 11001100 11001100 11001100 // XOR

Der Anfang stimmt in etwa, aber dann kommt an der 10ten Stelle 1^1=1 raus und das stimmt net!
Wenn ich mir Kontrollausgaben mache dann stimmt aber die XOR berechnung daher gehe ich davon aus,
dass irgendwo anderster was nicht stimmt!
 
aeh ???? die binärfolge bei XOR ist doch falsch?!

0 xor 0 = 0
1 xor 0 = 1
0 xor 1 = 1
1 xor 1 = 0

somit

01001000 01100001 01101100 01101100 01101111 11111111 11111111 11111111 // Hallo Binär
00110011 01100100 01100010 00110101 00111000 01100001 00111001 01100110 // Schlüssel Binär
----------------------------------------------------------------------------------------------------------------------
01111011 00000101 00001110 01011001 01010111 10011110 11000111 10011001 // XOR

So wär das eigentlich korrekt...
 
genau das ist mein Problem das funktioniert eben nicht richtig, jedoch bin ich der Meinung, dass der Rückgabewert oder was am String nicht stimmt! Das müsste doch möglich sein mit str+=message.charAt(i)^key.charAt(j); oder?
 
autsch, jetzt hab ich meinen Fehler gefunden! ich dachte noch, dass der Schlüssel die Länge 8 hätte, aber da hat in Binärer Form ja 64!!! Zeile 63 muss also so ausehen: if(i%64==0&&i!=0) j=0;
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben