offset based on MD5 hash of parameters
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 ae9a2e2..c994ee7 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
@@ -11,6 +11,7 @@
package org.eclipse.viatra.modelobfuscator.util
import com.google.common.base.Preconditions
+import com.google.common.hash.Hashing
import com.google.common.io.BaseEncoding
import java.math.BigInteger
import org.eclipse.viatra.modelobfuscator.api.DataTypeObfuscator
@@ -26,6 +27,7 @@
private String prefix
private byte[] seedNumber
private val coder = BaseEncoding.base32.omitPadding.lowerCase
+ private int baseOffset
@Deprecated
new(String seed, String salt) {
@@ -41,6 +43,8 @@
this.seedNumber = seed.bytes
this.salt = salt
this.prefix = prefix
+ val offsetHash = Hashing.md5.newHasher.putUnencodedChars(seed).putUnencodedChars(salt).putUnencodedChars(prefix).hash
+ this.baseOffset = offsetHash.asInt%seedNumber.length
}
new(BigInteger seed, String salt, String prefix) {
@@ -51,12 +55,15 @@
this.seedNumber = seed.toByteArray.tail
this.salt = salt
this.prefix = prefix
+ val offsetHash = Hashing.md5.newHasher.putBytes(seedNumber).putUnencodedChars(salt).putUnencodedChars(prefix).hash
+ this.baseOffset = Math.abs(offsetHash.asInt % (seedNumber.length))
}
override obfuscateData(String original) {
if (original != null) {
val salted = salt + original
- val obfuscatedBytes = ObfuscatorUtil.xorWithSeed(salted.bytes, seedNumber, salted.bytes.length)
+ val offset = salted.bytes.length + baseOffset
+ val obfuscatedBytes = ObfuscatorUtil.xorWithSeed(salted.bytes, seedNumber, offset)
return addPrefix(coder.encode(obfuscatedBytes))
}
}
@@ -64,7 +71,8 @@
override restoreData(String obfuscated) {
if (obfuscated != null) {
val obfuscatedBytes = coder.decode(removePrefix(obfuscated))
- val salted = new String(ObfuscatorUtil.xorWithSeed(obfuscatedBytes, seedNumber, obfuscatedBytes.length))
+ val offset = obfuscatedBytes.length + baseOffset
+ val salted = new String(ObfuscatorUtil.xorWithSeed(obfuscatedBytes, seedNumber, offset))
Preconditions.checkState(salted.startsWith(salt),"Salt %s does not match in %s",salt,obfuscated)
return salted.substring(salt.length)
}