{"id":25102,"date":"2020-03-16T12:15:18","date_gmt":"2020-03-16T10:15:18","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=25102"},"modified":"2020-06-23T14:51:00","modified_gmt":"2020-06-23T11:51:00","slug":"how-to-obfuscate-code-in-python-a-thought-experiment","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/python\/how-to-obfuscate-code-in-python-a-thought-experiment\/","title":{"rendered":"How to Obfuscate Code in Python: A Thought Experiment"},"content":{"rendered":"\n<p>As with most articles in this series, I was doing some browsing on Google, and I found that some folks had an interest in learning how to obfuscate code in Python. Naturally, I thought that would be a fun topic. By no means am I an expert, but I\u2019m familiar with the idea. As a result, treat this like a fun thought experiment.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Problem Description<\/h2>\n\n\n\n<p>Unlike most articles in this series, I\u2019m not looking for a quick answer to code obfuscation\u2014the process of making code unreadable. Instead, I want to look at various obfuscation methods. To do that, we\u2019ll need some piece of nicely formatted source code:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_659962\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def read_solution(solution_path: str) -&gt; list:<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Reads the solution and returns it as a list of lines.<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:param solution_path: path to the solution<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:<\/code><code class=\"java keyword\">return<\/code><code class=\"java plain\">: the solution as a list of lines<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(solution_path, encoding=<\/code><code class=\"java string\">\"utf8\"<\/code><code class=\"java plain\">) as solution:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">data = solution.readlines()<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">data<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Cool! Here\u2019s a standalone function that I pulled from <a href=\"https:\/\/github.com\/TheRenegadeCoder\/auto-grader\/blob\/fced1215cab2cea253fe1ba4595eafb5d64358d9\/grade\/project_organizer.py#L162-L170\">my auto-grader project<\/a>. It\u2019s not the best code in the world, but I figured it would serve as a nice example. After all, it\u2019s a short snippet that performs a simple function: reads a file and dumps the results as a list of lines.<\/p>\n\n\n\n<p>In this article, we\u2019ll take a look at a few ways of making this code snippet as unintelligible as possible. Keep in mind that I\u2019m not an expert at this. Rather, I thought this would be a fun exercise where we could all learn something.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Solutions<\/h2>\n\n\n\n<p>In this section, we\u2019ll take a look at several ways to obfuscate code. In particular, we\u2019ll be taking the original solution and gradually manipulating it throughout this article. As a result, each solution will not be a standalone solution. Instead, it will be an addition to all previous solutions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Obfuscate Code by Removing Comments<\/h3>\n\n\n\n<p>One surefire way to make code hard to read is to begin by avoiding best practices. For instance, we could start by removing any comments and docstrings:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_567733\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def read_solution(solution_path: str) -&gt; list:<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(solution_path, encoding=<\/code><code class=\"java string\">\"utf8\"<\/code><code class=\"java plain\">) as solution:<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">data = solution.readlines()<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">data<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>In this case, the solution is self-documenting, so it\u2019s fairly easy to read. That said, the removal of the comment does make it slightly harder to see exactly what this method accomplishes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Obfuscate Code by Removing Type Hints<\/h3>\n\n\n\n<p>With the comments out of the way, we can begin removing other helpful pieces of syntax. For example, we have a few bits of syntax which help people track variable types throughout the code. In particular, we indicated that the input parameter <code>solution_path<\/code> should be a string. Likewise, we also indicated that the function returns a list. Why not remove those type hints?<\/p>\n\n\n\n<div>\n<div id=\"highlighter_990804\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def read_solution(solution_path):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(solution_path, encoding=<\/code><code class=\"java string\">\"utf8\"<\/code><code class=\"java plain\">) as solution:<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">data = solution.readlines()<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">data<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Again, this function is still fairly manageable, so it wouldn\u2019t be too hard to figure out what it does. In fact, almost all Python code looked like this at one point, so I wouldn\u2019t say we\u2019ve reached any level of obfuscation yet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Obfuscate Code by Removing Whitespace<\/h3>\n\n\n\n<p>Another option for visual obfuscation is removing all extraneous whitespace. Unfortunately, in Python, whitespace has value. In fact, we use it to indicate scope. That said, there\u2019s still some work we can do:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_982412\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def read_solution(solution_path):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(solution_path,encoding=<\/code><code class=\"java string\">\"utf8\"<\/code><code class=\"java plain\">) as solution:<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">data=solution.readlines()<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">data<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Here, we were only able to remove three spaces: one between <code>solution_path<\/code> and <code>encoding<\/code>, one between <code>data<\/code> and <code>=<\/code>, and one between <code>=<\/code> and <code>solution.readlines()<\/code>. As a result, the code is still fairly readable. That said, as we begin to obfuscate our code a bit more, we\u2019ll see this solution pay dividends.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Obfuscate Code by Abandoning Naming Conventions<\/h3>\n\n\n\n<p>One thing we have full control over in code is naming conventions. In other words, we decide what we name our functions and variables. As a result, it\u2019s possible to come up with names that completely obfuscate the intent of a variable or function:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_718223\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def x(a):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(a,encoding=<\/code><code class=\"java string\">\"utf8\"<\/code><code class=\"java plain\">) as z:<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">p=z.readlines()<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">p<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Here, we\u2019ve lost all semantic value that we typically get from variable and function names. As a result, it\u2019s even hard to figure out what this program does.<\/p>\n\n\n\n<p>Personally, I don\u2019t think this goes far enough. If we were particularly sinister, we\u2019d generate long sequences of text for each name, so it\u2019s even more difficult to understand:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_640550\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(hjqk4WN0WwxM):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(hjqk4WN0WwxM,encoding=<\/code><code class=\"java string\">\"utf8\"<\/code><code class=\"java plain\">) as ltZH4QOxmGy8:<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">QVsxkg07bMCs=ltZH4QOxmGy8.readlines()<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">QVsxkg07bMCs<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Hell, I might even use a single random string of characters and only modify bits of it. For example, we could try using the function name repeatedly with slight alterations (e.g. 1 for l, O for 0, etc.):<\/p>\n\n\n\n<div>\n<div id=\"highlighter_721982\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=<\/code><code class=\"java string\">\"utf8\"<\/code><code class=\"java plain\">) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Of course, while this looks harder to read, nothing is really stopping the user from using an IDE to follow each reference. Likewise, compiling and decompiling this function (i.e. .py -&gt; .pyc -&gt; .py) would probably undo all our hard labor. As a result, we\u2019ll have to go deeper.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Obfuscate Code by Manipulating Strings<\/h3>\n\n\n\n<p>Another way to make code unintelligible is to find hardcoded strings like \u201cutf8\u201d in our example and add an unnecessary layer of abstraction to them:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_35936\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=chr(<\/code><code class=\"java value\">117<\/code><code class=\"java plain\">)+chr(<\/code><code class=\"java value\">116<\/code><code class=\"java plain\">)+chr(<\/code><code class=\"java value\">102<\/code><code class=\"java plain\">)+chr(<\/code><code class=\"java value\">56<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Here, we\u2019ve constructed the string \u201cutf8\u201d from its ordinal values. In other words, \u2018u\u2019 corresponds to 117, \u2018t\u2019 corresponds to 116, \u2018f\u2019 corresponds to 102, and \u20188\u2019 corresponds to 56. This additional complexity is still pretty easy to map. As a result, it might be worthwhile to introduce even more complexity:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_175362\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join([chr(<\/code><code class=\"java value\">117<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">116<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">102<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">56<\/code><code class=\"java plain\">)])<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Instead of direct concatenation, we\u2019ve introduced the join method. Now, we have a list of characters as numbers. Let\u2019s reverse the list just to add a bit of entropy to the system:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_158893\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">56<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">102<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">116<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">117<\/code><code class=\"java plain\">)]))<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>How about that? Now, we have even more code we can begin modifying.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Obfuscate Code by Manipulating Numbers<\/h3>\n\n\n\n<p>With our \u201cutf8\u201d string represented as a reversed list of numbers, we can begin changing their numeric representation. For example, 56 is really 28 * 2 or 14 * 2 * 2 or 7 * 2 * 2 * 2. Likewise, Python supports various bases, so why not introduce hexadecimal, octal, and binary to the mix?<\/p>\n\n\n\n<div>\n<div id=\"highlighter_890652\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">7<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">0x66<\/code><code class=\"java plain\">),chr(0o164),chr(0b1110101)]))<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Suddenly, it\u2019s unclear what numbers we\u2019re even working with. To add a bit of chaos, I thought it would be fun to insert a whitespace character:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_229032\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">7<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">0x66<\/code><code class=\"java plain\">),chr(0o164),chr(0b1110101),chr(<\/code><code class=\"java value\">0x20<\/code><code class=\"java plain\">)])).strip()<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Then, we can call the strip method to remove that extra space.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Obfuscate Code by Introducing Dead Code<\/h3>\n\n\n\n<p>In the previous example, we added a whitespace character to our string to make it slightly more difficult to decode. We can now take that idea and begin to add code that doesn\u2019t really do anything:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_566140\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">7<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">0x66<\/code><code class=\"java plain\">),chr(0o164),chr(0b1110101),chr(<\/code><code class=\"java value\">0x20<\/code><code class=\"java plain\">)])).strip()<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">len(IdDG0v51X42t*<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">)&gt;-<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">list()<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Here, I\u2019ve introduce a dead branch. In other words, <strong>we\u2019re operating under the assumption that the input is a valid string<\/strong>. As a result, we can add a silly case where we check if the string has a length greater than -1\u2014which is always true. Then, on the dead branch, we return some generic value.<\/p>\n\n\n\n<p>At this point, what is stopping us from writing a completely ridiculous dead block? In other words, instead of returning a simple junk value, we could construct a complex junk value:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_152327\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">7<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">0x66<\/code><code class=\"java plain\">),chr(0o164),chr(0b1110101),chr(<\/code><code class=\"java value\">0x20<\/code><code class=\"java plain\">)])).strip()<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">len(IdDG0v51X42t*<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">)&gt;-<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDG0v51X42t=IdDG0v51X42t[len(IdDG0v51X42t)\/<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">::<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">]*<\/code><code class=\"java value\">6<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">[I6DG0v51X42t <\/code><code class=\"java keyword\">for<\/code> <code class=\"java plain\">I6DG0v51X42t in IdDG0v51X42t]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Honestly, I could have put anything in the dead block. For fun, I decided to play with the input string. For instance, I constructed a substring and repeated it. Then, I constructed a list from the characters in that new string.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Obfuscate Code by Adding Dead Parameters<\/h3>\n\n\n\n<p>If we can introduce dead branches, we can absolutely introduce dead parameters. However, we don\u2019t want to alter the behavior of the underlying function, so we\u2019ll want to introduce default parameters:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_928216\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t,LdDG0v51X42t=<\/code><code class=\"java value\">0x173<\/code><code class=\"java plain\">):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">7<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">0x66<\/code><code class=\"java plain\">),chr(0o164),chr(0b1110101),chr(<\/code><code class=\"java value\">0x20<\/code><code class=\"java plain\">)])).strip()<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">len(IdDG0v51X42t*<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">)&gt;-<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDG0v51X42t=IdDG0v51X42t[len(IdDG0v51X42t)\/<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">::<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">]*<\/code><code class=\"java value\">6<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">[I6DG0v51X42t <\/code><code class=\"java keyword\">for<\/code> <code class=\"java plain\">I6DG0v51X42t in IdDG0v51X42t]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Of course, this parameter is of no use currently. In other words, let\u2019s try doing something with it:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_52657\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t,LdDG0v51X42t=<\/code><code class=\"java value\">0x173<\/code><code class=\"java plain\">):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">7<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">0x66<\/code><code class=\"java plain\">),chr(0o164),chr(0b1110101),chr(<\/code><code class=\"java value\">0x20<\/code><code class=\"java plain\">)])).strip()<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">LdDG0v51X42t%<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">!=<\/code><code class=\"java value\">0<\/code> <code class=\"java plain\">or len(IdDG0v51X42t*<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">)&gt;-<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDG0v51X42t=IdDG0v51X42t[len(IdDG0v51X42t)\/<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">::<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">]*<\/code><code class=\"java value\">6<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">[I6DG0v51X42t <\/code><code class=\"java keyword\">for<\/code> <code class=\"java plain\">I6DG0v51X42t in IdDG0v51X42t]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Now, there is something beautiful about the expression <code>LdDG0v51X42t%2!=0<\/code>. To me, it looks like a password\u2014not a test for odd numbers.<\/p>\n\n\n\n<p>Of course, why stop there? Another cool thing we can do with parameters is take advantage of variable length arguments:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_805593\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t,LdDG0v51X42t=<\/code><code class=\"java value\">0x173<\/code><code class=\"java plain\">,*LdDG0v51X42tf):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">7<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">0x66<\/code><code class=\"java plain\">),chr(0o164),chr(0b1110101),chr(<\/code><code class=\"java value\">0x20<\/code><code class=\"java plain\">)])).strip()<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">LdDG0v51X42t%<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">!=<\/code><code class=\"java value\">0<\/code> <code class=\"java plain\">or len(IdDG0v51X42t*<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">)&gt;-<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDG0v51X42t=IdDG0v51X42t[len(IdDG0v51X42t)\/<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">::<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">]*<\/code><code class=\"java value\">6<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">[I6DG0v51X42t <\/code><code class=\"java keyword\">for<\/code> <code class=\"java plain\">I6DG0v51X42t in IdDG0v51X42t]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Now, we\u2019ve opened the door to an unlimited number of arguments. Let\u2019s add some code to make this interesting:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_18758\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t,LdDG0v51X42t=<\/code><code class=\"java value\">0x173<\/code><code class=\"java plain\">,*LdDG0v51X42tf):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">7<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">0x66<\/code><code class=\"java plain\">),chr(0o164),chr(0b1110101),chr(<\/code><code class=\"java value\">0x20<\/code><code class=\"java plain\">)])).strip()<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">LdDG0v51X42t%<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">!=<\/code><code class=\"java value\">0<\/code> <code class=\"java plain\">or len(IdDG0v51X42t*<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">)&gt;-<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">elif LdDG0v51X42tf:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">list()<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDG0v51X42t=IdDG0v51X42t[len(IdDG0v51X42t)\/<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">::<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">]*<\/code><code class=\"java value\">6<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">[I6DG0v51X42t <\/code><code class=\"java keyword\">for<\/code> <code class=\"java plain\">I6DG0v51X42t in IdDG0v51X42t]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Again, we\u2019ll never hit this branch because the first condition is always true. Of course, the casual reader doesn\u2019t know that. At any rate, let\u2019s have some fun with it:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_872542\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t,LdDG0v51X42t=<\/code><code class=\"java value\">0x173<\/code><code class=\"java plain\">,*LdDG0v51X42tf):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">7<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">0x66<\/code><code class=\"java plain\">),chr(0o164),chr(0b1110101),chr(<\/code><code class=\"java value\">0x20<\/code><code class=\"java plain\">)])).strip()<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">LdDG0v51X42t%<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">!=<\/code><code class=\"java value\">0<\/code> <code class=\"java plain\">or len(IdDG0v51X42t*<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">)&gt;-<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">elif LdDG0v51X42tf:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">while<\/code> <code class=\"java plain\">LdDG0v51X42tf:<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">LdDG0v51X42tx=LdDG0v51X42tf.pop()<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">LdDG0v51X42tf.append(LdDG0v51X42tx)<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">LdDG0v51X42tf<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDG0v51X42t=IdDG0v51X42t[len(IdDG0v51X42t)\/<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">::<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">]*<\/code><code class=\"java value\">6<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">[I6DG0v51X42t <\/code><code class=\"java keyword\">for<\/code> <code class=\"java plain\">I6DG0v51X42t in IdDG0v51X42t]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Yep, that\u2019s an infinite loop! Unfortunately, it\u2019s sort of obvious. That said, I suspect that the variable names will obscure the intent for a little while.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Other Ways to Obfuscate Code<\/h3>\n\n\n\n<p>Once again, I\u2019ll mention that this article was more of a thought experiment for me. I had seen obfuscated code in the past, and I thought it would be fun to give it a try myself. As a result, here\u2019s the original snippet and the final snippet for comparison:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_489948\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def read_solution(solution_path: str) -&gt; list:<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Reads the solution and returns it as a list of lines.<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:param solution_path: path to the solution<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">:<\/code><code class=\"java keyword\">return<\/code><code class=\"java plain\">: the solution as a list of lines<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(solution_path, encoding=<\/code><code class=\"java string\">\"utf8\"<\/code><code class=\"java plain\">) as solution:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">data = solution.readlines()<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">data<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<div>\n<div id=\"highlighter_302205\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def IdDG0v5lX42t(IdDG0v51X42t,LdDG0v51X42t=<\/code><code class=\"java value\">0x173<\/code><code class=\"java plain\">,*LdDG0v51X42tf):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">I6DGOv51X4Rt=<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(reversed([chr(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">7<\/code><code class=\"java plain\">*<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">),chr(<\/code><code class=\"java value\">0x66<\/code><code class=\"java plain\">),chr(0o164),chr(0b1110101),chr(<\/code><code class=\"java value\">0x20<\/code><code class=\"java plain\">)])).strip()<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">LdDG0v51X42t%<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">!=<\/code><code class=\"java value\">0<\/code> <code class=\"java plain\">or len(IdDG0v51X42t*<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">)&gt;-<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">elif LdDG0v51X42tf:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">while<\/code> <code class=\"java plain\">LdDG0v51X42tf:<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">LdDG0v51X42tx=LdDG0v51X42tf.pop()<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">LdDG0v51X42tf.append(LdDG0v51X42tx)<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">LdDG0v51X42tf<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDG0v51X42t=IdDG0v51X42t[len(IdDG0v51X42t)\/<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">::<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">]*<\/code><code class=\"java value\">6<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">[I6DG0v51X42t <\/code><code class=\"java keyword\">for<\/code> <code class=\"java plain\">I6DG0v51X42t in IdDG0v51X42t]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>At this point, I suppose we could continue to iterate, but I\u2019m not sure that would be the best use of my time. That said, there were a few things I considered trying. For instance, I thought about compressing lines of code such as:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_722095\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">IdDGOv51X4Rt=IdDGOv51X42t.readlines()<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X4Rt<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Into something like:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_543134\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">with open(IdDG0v51X42t,encoding=I6DGOv51X4Rt) as IdDGOv51X42t:<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">IdDGOv51X42t.readlines()<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>However, part of me felt like this would actually make the code easier to read since we wouldn\u2019t have to map variable names.<\/p>\n\n\n\n<p>In addition, I thought about making some methods just to pollute the namespace a little bit. For example, we could create functions that overwrite some of the standard library. Then, give them totally different behavior. In our case, we might redefine <code>reversed<\/code> to confuse the reader into thinking it has its typical behavior:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_955974\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def reversed(x):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java string\">\"utf8\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Then, we could pass whatever we wanted into it as bait. Wouldn\u2019t that be sinister?<\/p>\n\n\n\n<p>Beyond that, I\u2019m aware that there are obfuscation tools out there, but I\u2019m not sure how widely used they are. Here are a few examples:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/github.com\/dashingsoft\/pyarmor\">pyarmor<\/a>: \u201cA tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts.\u201d<\/li><li><a href=\"https:\/\/liftoff.github.io\/pyminifier\/\">pyminifier<\/a>: \u201cMinify, obfuscate, and compress Python code\u201d<\/li><li><a href=\"https:\/\/github.com\/QQuick\/Opy\">Opy<\/a>: \u201cObfuscator for Python\u201d<\/li><li><a href=\"http:\/\/pyob.oxyry.com\/\">Oxyry<\/a>: \u201cthe power to protect your python source code\u201d<\/li><\/ul>\n\n\n\n<p>I haven\u2019t tried many of these tools, but Oxyry is definitely the most convenient. When I plug our function into it, it generates the following code:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_864794\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def read_solution (OOOO0OO0OO00OOOOO :str )-&gt;list :#line:<\/code><code class=\"java value\">1<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">#line:<\/code><code class=\"java value\">6<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">with open (OOOO0OO0OO00OOOOO ,encoding =<\/code><code class=\"java string\">\"utf8\"<\/code><code class=\"java plain\">)as OO0O00OO0O0O0OO0O :#line:<\/code><code class=\"java value\">7<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">OO0000O00O0OO0O0O =OO0O00OO0O0O0OO0O .readlines ()#line:<\/code><code class=\"java value\">8<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">OO0000O00O0OO0O0O<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Clearly, that\u2019s not great, but I suppose it\u2019s effective. If you know of any other tools or cool techniques, feel free to share them in the comments.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Challenge<\/h2>\n\n\n\n<p>For today\u2019s challenge, pick a piece of code and try to obfuscate it. Feel free to use all of the ideas leveraged in this article. However, the challenge will be to come up with your own ideas. What other ways can we obfuscate Python code?<\/p>\n\n\n\n<p>If you\u2019re looking for some ideas, I mentioned a couple in the previous section. Of course, there are other things you could try. For instance, you could always add a logger which prints erroneous messages to the console. Something like this would have no effect on your program\u2019s behavior, but it could confuse a reader.<\/p>\n\n\n\n<p>If you want to go the extra mile, try writing a program which performs your favorite obfuscation technique. For instance, could you write a program which could identify Python variables? If so, you could generate your own symbol table which would track all variables. Then, you could generate new names without any worries about clashes.<\/p>\n\n\n\n<p>At the end of the day, however, treat this challenge like a fun thought experiment. I don\u2019t expect any of these methods to be all that practical. After all, if a machine can run the code even in an obfuscated state, so can a human (eventually).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Little Recap<\/h2>\n\n\n\n<p>Typically, in this section, I would list off all the solutions. However, the code snippets are quite long, and I don\u2019t think it makes a lot of sense for me to dump them here. As a result, I\u2019ll just share the options as a list:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Remove comments, type hints, and whitespace<\/li><li>Abandon naming conventions<\/li><li>Manipulate strings and numbers<\/li><li>Introduce dead code and parameters<\/li><li>Try something else<\/li><\/ul>\n\n\n\n<p>With that, I think we\u2019re don for the day. If you like this sort of content, I\u2019d appreciate it if you checked out an article on <a href=\"https:\/\/therenegadecoder.com\/blog\/ways-you-can-help-grow-the-renegade-coder\/\">the different ways you can support the site<\/a>. <\/p>\n\n\n\n<p>Finally, here are some related articles:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/therenegadecoder.com\/code\/how-to-compare-strings-in-python\/\">How to Compare Strings in Python: Equality and Identity<\/a><\/li><li><a href=\"https:\/\/therenegadecoder.com\/code\/how-to-perform-a-reverse-dictionary-lookup-in-python\/\">How to Perform a Reverse Dictionary Lookup in Python: Generator Expressions and More<\/a><\/li><\/ul>\n\n\n\n<p>Once again, thanks for stopping by. See you next time!<\/p>\n\n\n\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Web Code Geeks with permission by Jeremy Grifski, partner at our <a href=\"\/\/www.webcodegeeks.com\/join-us\/wcg\/\" target=\"_blank\" rel=\"noopener noreferrer\">WCG program<\/a>. See the original article here: <a href=\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/\" target=\"_blank\" rel=\"noopener noreferrer\">How to Obfuscate Code in Python: A Thought Experiment<\/a><\/p>\n<p>Opinions expressed by Web Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>As with most articles in this series, I was doing some browsing on Google, and I found that some folks had an interest in learning how to obfuscate code in Python. Naturally, I thought that would be a fun topic. By no means am I an expert, but I\u2019m familiar with the idea. As a &hellip;<\/p>\n","protected":false},"author":14722,"featured_media":1651,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53],"tags":[],"class_list":["post-25102","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Obfuscate Code in Python: A Thought Experiment - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Interested to learn about Obfuscate Code? Check our article explaining thoroughly how to obfuscate code in Python with examples.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Obfuscate Code in Python: A Thought Experiment - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Obfuscate Code? Check our article explaining thoroughly how to obfuscate code in Python with examples.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2020-03-16T10:15:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-06-23T11:51:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jeremy Grifski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@RenegadeCoder94\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Grifski\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/how-to-obfuscate-code-in-python-a-thought-experiment\/\"},\"author\":{\"name\":\"Jeremy Grifski\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/7eaa8e89cf23a5de82a048beb4c59aa1\"},\"headline\":\"How to Obfuscate Code in Python: A Thought Experiment\",\"datePublished\":\"2020-03-16T10:15:18+00:00\",\"dateModified\":\"2020-06-23T11:51:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/how-to-obfuscate-code-in-python-a-thought-experiment\/\"},\"wordCount\":2012,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"articleSection\":[\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/how-to-obfuscate-code-in-python-a-thought-experiment\/\",\"url\":\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/\",\"name\":\"How to Obfuscate Code in Python: A Thought Experiment - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"datePublished\":\"2020-03-16T10:15:18+00:00\",\"dateModified\":\"2020-06-23T11:51:00+00:00\",\"description\":\"Interested to learn about Obfuscate Code? Check our article explaining thoroughly how to obfuscate code in Python with examples.\",\"breadcrumb\":{\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/python\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Obfuscate Code in Python: A Thought Experiment\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/7eaa8e89cf23a5de82a048beb4c59aa1\",\"name\":\"Jeremy Grifski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9d50311a27dff0a54d775b6106b8f804d5d11d0b5182ed537f325046a020c6f5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9d50311a27dff0a54d775b6106b8f804d5d11d0b5182ed537f325046a020c6f5?s=96&d=mm&r=g\",\"caption\":\"Jeremy Grifski\"},\"description\":\"Jeremy is the founder of The Renegade Coder, a software curriculum website launched in 2017. In addition, he is a PhD student with an interest in education and data visualization.\",\"sameAs\":[\"https:\/\/therenegadecoder.com\/\",\"https:\/\/www.linkedin.com\/in\/jeremy-grifski-22240552\/\",\"https:\/\/x.com\/RenegadeCoder94\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/jeremy-grifski\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Obfuscate Code in Python: A Thought Experiment - Web Code Geeks - 2026","description":"Interested to learn about Obfuscate Code? Check our article explaining thoroughly how to obfuscate code in Python with examples.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/","og_locale":"en_US","og_type":"article","og_title":"How to Obfuscate Code in Python: A Thought Experiment - Web Code Geeks - 2026","og_description":"Interested to learn about Obfuscate Code? Check our article explaining thoroughly how to obfuscate code in Python with examples.","og_url":"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2020-03-16T10:15:18+00:00","article_modified_time":"2020-06-23T11:51:00+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","type":"image\/jpeg"}],"author":"Jeremy Grifski","twitter_card":"summary_large_image","twitter_creator":"@RenegadeCoder94","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Jeremy Grifski","Est. reading time":"21 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/python\/how-to-obfuscate-code-in-python-a-thought-experiment\/"},"author":{"name":"Jeremy Grifski","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/7eaa8e89cf23a5de82a048beb4c59aa1"},"headline":"How to Obfuscate Code in Python: A Thought Experiment","datePublished":"2020-03-16T10:15:18+00:00","dateModified":"2020-06-23T11:51:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/python\/how-to-obfuscate-code-in-python-a-thought-experiment\/"},"wordCount":2012,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","articleSection":["Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/python\/how-to-obfuscate-code-in-python-a-thought-experiment\/","url":"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/","name":"How to Obfuscate Code in Python: A Thought Experiment - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#primaryimage"},"image":{"@id":"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","datePublished":"2020-03-16T10:15:18+00:00","dateModified":"2020-06-23T11:51:00+00:00","description":"Interested to learn about Obfuscate Code? Check our article explaining thoroughly how to obfuscate code in Python with examples.","breadcrumb":{"@id":"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/therenegadecoder.com\/code\/how-to-obfuscate-code-in-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Python","item":"https:\/\/www.webcodegeeks.com\/category\/python\/"},{"@type":"ListItem","position":3,"name":"How to Obfuscate Code in Python: A Thought Experiment"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/7eaa8e89cf23a5de82a048beb4c59aa1","name":"Jeremy Grifski","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9d50311a27dff0a54d775b6106b8f804d5d11d0b5182ed537f325046a020c6f5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9d50311a27dff0a54d775b6106b8f804d5d11d0b5182ed537f325046a020c6f5?s=96&d=mm&r=g","caption":"Jeremy Grifski"},"description":"Jeremy is the founder of The Renegade Coder, a software curriculum website launched in 2017. In addition, he is a PhD student with an interest in education and data visualization.","sameAs":["https:\/\/therenegadecoder.com\/","https:\/\/www.linkedin.com\/in\/jeremy-grifski-22240552\/","https:\/\/x.com\/RenegadeCoder94"],"url":"https:\/\/www.webcodegeeks.com\/author\/jeremy-grifski\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/25102","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/14722"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=25102"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/25102\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/1651"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=25102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=25102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=25102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}