ソフトウェアにおける難読化（）とは、コンピュータプログラムの動作を変えずに、プログラムコードの内部的なサブルーチン（手続き）の内容・構造・データなどを、人間にとって読み取りにくくなるように改変・加工すること。難読化の対象はソースコードであったり、ソースコードから生成されるマシンコードまたはバイトコードなどの中間表現であったりすることもある。難読化されたコード（）は第三者によるプログラムの解読・解析が困難になる。
概要.
コード難読化はとは本質的に異なっており、後者は電子回路の配置、構造を機能隠蔽を目的として改変することを意味する。
一般に、ソフトウェアの実行にソースコードが必要となるスクリプト言語は解析が容易だが、コンパイラによって機械語を生成する言語は、そのコード変換過程の不可逆性により解析が難しい。機械語は単なる数値の羅列であり、逆アセンブルすることは容易だが、解読には機械語やアセンブラの知識が必要となり、また元のソースコードを復元（逆コンパイル）することは完全にはできないため、コードの意図まで読み取れるとは限らない。
リフレクションのサポートなどの目的で、コンパイル時にシンボル情報をメタデータとして保存する言語や処理系の場合、逆コンパイルによって元のソースコードを復元しやすいため、特にプロプライエタリな商用ソフトウェアでは、難読化によってリバースエンジニアリングを阻止することが多い。通常、プログラミングの際はサブルーチンや変数といったコード上のシンボルには人間にとって分かりやすい名前を付けるが、それらの名前が分かるだけでも解析がかなり容易になるため、そういったシンボルの名前を難読化ツールによって意味のないものに置換するだけでも一定の効果が望める。
娯楽としての難読化.
難読化のパターンには色々あり、単純なキーワード置換、スペースをうまく利用して芸術的な表現を行う、はたまた、自己生成やデータを高圧縮するものなど様々である。
例.
/*
同じ年に勝者としてはエントリーされていないが、次の例は空白を利用し芸術性のある表現を行う。実行すると任意長の迷路を生成する。
次は、の例である。
難読化の欠点.
また、難読化は必然的に第三者による安全性や正当性の検証を阻害するため、Webブラウザの拡張機能などのプラットフォームではセキュリティの観点から禁止されつつある。