Obfuscation does not transform data - it makes data difficult to interpret.
If I am writing malware and I want to make it difficult for analysts to understand the flow of logic, then instead of using a function called
print I use a random string to name that function. "Print" has not been transformed into a random string, the function is just named that random string. There is nothing to 'revert' the random string to.
When you run a code obfuscator, it takes the names variables and functions, assigns them a key value (think:
function1, etc.), then replaces those names with a random string (and sometimes the random string is itself obfuscated through a renaming function embedded in the code). This is not encryption or hashing. This is a complete renaming with random strings. Yes, you could also use encryption as a renaming function, but why take that computational hit? In the end, the variables and function names need to be consistent in the logic flow at runtime.