# RC4 Passwortverschlüsselung in Java (Vorlage VBA)



## -Rockbiest- (16. Okt 2017)

Hallo Zusammen,

ich habe ein Programm in Access VBA entwickelt. Die Datenbasis des Programms stützt sich hierbei auf einer MS SQL Datenbank. In dem Programm hat jeder Nutzer einen Account, dessen Passwort mit RC4 (ja ich weiß, nicht mehr zeitgemäß  ) verschlüsselt ist.

Nun bin ich dabei eine App zu bauen, in die sich die Nutzer auch einloggen können sollen.
Heißt: Ich muss das RC4 Encryptionprogramm irgendwie in Java übersetzt bekommen.

Nachfolgend der VBA Code:


```
Public Function RC4(ByVal Expression As String, ByVal Password As String) As String
    Dim rb(0 To 255) As Integer, x As Long, y As Long, z As Long, key() As Byte, bytearray() As Byte, temp As Byte
    If Len(Password) = 0 Then
        Exit Function
    End If
    If Len(Expression) = 0 Then
        Exit Function
    End If
   
    If Len(Password) > 256 Then
        key() = StrConv(Left$(Password, 256), vbFromUnicode)
    Else
        key() = StrConv(Password, vbFromUnicode)
    End If
   
    For x = 0 To 255
        rb(x) = x
    Next x
    x = 0
    y = 0
    z = 0
   
    For x = 0 To 255
        y = (y + rb(x) + key(x Mod Len(Password))) Mod 256
        temp = rb(x)
        rb(x) = rb(y)
        rb(y) = temp
    Next x
    x = 0
    y = 0
    z = 0
   
    bytearray() = StrConv(Expression, vbFromUnicode)
    For x = 0 To Len(Expression) - 1
        y = (y + 1) Mod 256
        z = (z + rb(y)) Mod 256
        temp = rb(y)
        rb(y) = rb(z)
        rb(z) = temp
        bytearray(x) = bytearray(x) Xor (rb((rb(y) + rb(z)) Mod 256))
    Next x
    RC4 = StrConv(bytearray, vbUnicode)
End Function
```
 
Das funktioniert in VBA soweit super! Mein Code in Java gibt jedoch falsche Werte raus, sodass sich der Nutzer nicht einloggen kann. Nachfolgender Code:


```
public static String RunRC4(String expression, String password) {
        int kLen = 0, x = 0, y = 0, i = 0, j = 0, temp = 0;

        int[] rb = new int[500];
        int[] key = new int[500];
        String RunRC4 = "";
        String finalChar = "";
        kLen = password.length();

        for (i = 0; i <= 255; i++) {
            rb[i] = i;
            String s1 = "";
            int modular = i % kLen;
            s1 = password.substring(modular, modular + 1);
            char c1 = s1.charAt(0);
            key[i] = (int) c1;
        }


        j = 0;
        for (i = 0; i <= 255; i++) {
            j = (j + key[i] + rb[i]) % 0xFF; //war 255
            temp = rb[i];
            rb[i] = rb[j];
            rb[j] = temp;
        }

        // 'Drop n bytes from keystream
        x = 0;
        y = 0;
        for (i = 0; i <= 255; i++) {
            x = (x + 1) % 0xFF; //war 255
            y = (y + rb[x]) % 0xFF; //war 255
            temp = rb[x];
            rb[x] = rb[y];
            rb[y] = temp;
        }

        // 'Encode/Decode
        for (i = 0; i <= expression.length(); i++) {
            x = (x + 1) % 0xFF; //war 255
            y = (y + rb[x]) % 0xFF; //war 255
            temp = rb[x];
            rb[x] = rb[y];
            rb[y] = temp;

            String s2 = expression.substring(i);
            if (s2.equalsIgnoreCase("")) {
                return finalChar;
            } else {
                char c2 = s2.charAt(0);
                int xy = rb[x] + rb[y];
                int value = rb[xy % 0xFF]; //war 255
                RunRC4 = RunRC4 + (value ^ (int) c2);
                finalChar = finalChar
                        + (Character.toString((char) Integer.parseInt(RunRC4)));
                RunRC4 = "";
            }
        }

        return finalChar;
    }
```

Leider komme ich nicht weiter.
Hatte eventuell Jemand bereits dieses Thema und weiß, wo hier das Problem liegt?
Besten Dank!


----------



## mrBrown (16. Okt 2017)

In dem einem ist’s % 256, in dem Java-Code ist’s % 255?


----------

