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)
}