offset xor with length of input byte array to avoid same prefixes
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/util/ObfuscatorUtil.java b/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/util/ObfuscatorUtil.java
index 7947cd3..a4a7f9e 100644
--- a/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/util/ObfuscatorUtil.java
+++ b/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/util/ObfuscatorUtil.java
@@ -22,9 +22,17 @@
 public class ObfuscatorUtil {
 
     public static byte[] xorWithSeed(byte[] input, byte[] key) {
+        return xorWithSeed(input, key, 0);
+    }
+    
+    /**
+     * The bits used from the key are offset by the given value.
+     */
+    public static byte[] xorWithSeed(byte[] input, byte[] key, int offset) {
+        int relevantOffset = offset % key.length;
         byte[] out = new byte[input.length];
         for (int i = 0; i < input.length; i++) {
-            out[i] = (byte) (input[i] ^ key[i%key.length]);
+            out[i] = (byte) (input[i] ^ key[(i+relevantOffset)%key.length]);
         }
         return out;
     }
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/util/StringObfuscator.xtend b/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/util/StringObfuscator.xtend
index 9e234e0..ae9a2e2 100644
--- a/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/util/StringObfuscator.xtend
+++ b/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/util/StringObfuscator.xtend
@@ -10,10 +10,10 @@
  *******************************************************************************/
 package org.eclipse.viatra.modelobfuscator.util
 
-import org.eclipse.viatra.modelobfuscator.api.DataTypeObfuscator
-import com.google.common.io.BaseEncoding
 import com.google.common.base.Preconditions
+import com.google.common.io.BaseEncoding
 import java.math.BigInteger
+import org.eclipse.viatra.modelobfuscator.api.DataTypeObfuscator
 
 /**
  * @author Abel Hegedus
@@ -25,6 +25,7 @@
     private String salt
     private String prefix
     private byte[] seedNumber
+    private val coder = BaseEncoding.base32.omitPadding.lowerCase
 
     @Deprecated
     new(String seed, String salt) {
@@ -55,15 +56,16 @@
     override obfuscateData(String original) {
         if (original != null) {
             val salted = salt + original
-            val obfuscatedBytes = ObfuscatorUtil.xorWithSeed(salted.bytes, seedNumber)
-            return addPrefix(BaseEncoding.base32.omitPadding.lowerCase.encode(obfuscatedBytes))
+            val obfuscatedBytes = ObfuscatorUtil.xorWithSeed(salted.bytes, seedNumber, salted.bytes.length)
+            return addPrefix(coder.encode(obfuscatedBytes))
         }
     }
 
     override restoreData(String obfuscated) {
         if (obfuscated != null) {
-            val obfuscatedBytes = BaseEncoding.base32.omitPadding.lowerCase.decode(removePrefix(obfuscated))
-            val salted = new String(ObfuscatorUtil.xorWithSeed(obfuscatedBytes, seedNumber))
+            val obfuscatedBytes = coder.decode(removePrefix(obfuscated))
+            val salted = new String(ObfuscatorUtil.xorWithSeed(obfuscatedBytes, seedNumber, obfuscatedBytes.length))
+            Preconditions.checkState(salted.startsWith(salt),"Salt %s does not match in %s",salt,obfuscated)
             return salted.substring(salt.length)
         }
     }
@@ -73,6 +75,7 @@
     }
 
     private def String removePrefix(String data) {
+        Preconditions.checkArgument(data.startsWith(prefix),"Prefix %s does not match in %s",prefix,data)
         return data.substring(prefix.length)
     }