# Mit String rechnen



## haering (2. Aug 2010)

Hallo,

ich versuche RSA in Java umzusezten.( Aber mit kleinen Zahlen) Allerdings bin ich gerade bei einem Problem. Ich schaffe es nicht einen String in Bytes zu zerlegen, mit diesen Bytes dann zu rechnen und am Ende wieder den Buchstaben auszugeben. Hat irgendeiner eine Ahnung wie ich das machen könnte?


----------



## Der Müde Joe (2. Aug 2010)

String#getBytes()
new String(byte[])


----------



## haering (2. Aug 2010)

Das Problem ist aber, das ich die Bytes dann hoch nen long und Modulo einen Long nehmen muss.
Und da sagt der Compiler: possible loss of precisison found: long required byte


----------



## SlaterB (2. Aug 2010)

was heißt 'das Problem', das ist höchstens eins von zig Problemen, die du noch haben wirst,
so wie du hier anscheinend jeden einzelnen einfachen Befehl abfragst..

was du aktuell meinst ist recht versteckt formuliert, poste doch deinen Code dazu, 
was ist 'hoch nen long', Math.pow()?  das Zeichen ^ ist dafür jedenfalls nicht geeignet


----------



## haering (2. Aug 2010)

Math.Pow funktioniert doch nur für Double.


```
long e;
 long d;
 long n;
public void verschlüsseln(String text)
    {
        int a= text.length();
        byte s[]=new byte[a];
        byte d[]=new byte[a];
        s = text.getBytes();
        for (int i=0;i<a;i++)
        {
            d[i]=(s[i]^e)%n;
        }
        String v=new String(d);
        System.out.println("Verschlüsselt: "+v);
     }
```


----------



## Der Müde Joe (2. Aug 2010)

Was möchtest du denn überhaupt machen?

d_=(s^e)%n;
ist
d = ( s XOR e) mod n

Operators (The Java™ Tutorials > Learning the Java Language > Language Basics)_


----------



## Flown (2. Aug 2010)

haering hat gesagt.:


> Math.Pow funktioniert doch nur für Double.



Dann machst du eben deine eigene Math.pow die dir long zurückgibt?


```
//Ich greif dir schon mal vor, nicht das du fragst wie die aussieht ;)
public long pow(long base, long exp) {
	if(exp == 1) {
		return base;
	}
	return base*pow(base, exp-1);
}
```


----------



## haering (2. Aug 2010)

Also RSA, da funktioniert die Verschlüsselung so, dass man seinen Geheimtext hat, den man mit einer Zahl e Potenziert und dann Modulo n rechnet. Mit Zahlen hat es auch super funktioniert, nur bei der Umsetzung mit Strings scheitere ich.


----------



## haering (4. Aug 2010)

Aber das Hauptproblem ist ja, einen String so zu konvertieren dass man dann mit ihm rechnen kann.


----------



## XHelp (4. Aug 2010)

Und mit 
	
	
	
	





```
getBytes
```
 klappt mit?


----------



## andiv (4. Aug 2010)

Das wurde doch schon beantortet, mit string.getBytes() bekommst du ein Array von Bytes, mit denen es sich hervoragend rechnen lässt. Wo ist das Problem dabei?

Wie du dir ein eigenes pow schreibst, das long als Parameter und long als Rückgabetyp hat, wurde auch schon beantwortet. Was fehlt dir denn noch?

Beschreib dein Problem doch bitte ein wenig genauer, gerne auch mit einem kleinen Quelltextbeispiel das verdeutlicht wo du nicht vorankommst.


----------



## Ein Keks (4. Aug 2010)

Wieso benutzt du nicht einfach BigInteger? Das hat sogar schon die Methode modPow


----------



## haering (4. Aug 2010)

Ich weiß inzwischen wie ich einen String in seine Bytes mach und damit rechne. Jetzt will ich aber das Ergebnis wieder als String ausgeben, und daran scheitere ich, weil ich bisher versage aus dem Long wieder Bytes zu machen.


----------



## XHelp (4. Aug 2010)

Long ist 4 Byte, generell müsste es sowas wie:

```
for(int i =0; i < 4; i++){	    	
  longValue <<= 8;
  longValue ^= (long)bArray[i] & 0xFF;	    	
}
```
Aber bedenkte, dass wenn du eine 1 byte mit RSA verschlüsselst und wieder entschlüsselt, müsste wieder nur 1 byte rauskommen.

[EDIT]Mist, habe dir richtung verwechselt... aber die Grundidee müsste klar sein.[/EDIT]


----------



## haering (5. Aug 2010)

Sonst muss ich meine Plan halt verwerfen und dann nur ne Zahl ausgeben. Aber zumindest zum Entschlüsseln sollte wieder ein String rauskommen. Und da ist ja dann im Long ein Byte gespeichert.


----------

