HDLコードの難読化

概要

アルデックは、VHDL, Verilog および SystemVerilog コードを難読コードに変換するスクリプトを提供しています。HDLコードの難読化は、コードの記述内容を
他のユーザに判読させたくない方に有効です。難読コードはコードを受け取った人には判読できませんが、コンパイラやシミュレータでは動作可能です。
これは特別なソースファイルのデバッグが必要だが、実際のファイルの内容を開示したくない場合に特に有効です。

難読化用のスクリプト

アルデックは、ユーザの用途に応じて、ファイルを難読化するスクリプトを提供しています。obfuscator_procedure.tcl スクリプトでは、次のコマンドを提供しています。

  1. obfuscator.vhdlfile

  2. obfuscator.verilogfile

  3. obfuscator.dir

Tcl スクリプトの実行方法

  1. obfuscator_procedures.tcl ファイルの内容を Tcl インタプリタにパスします。

    source obfuscator_procedures.tcl
    
  2. 次のフォーマットで必要なプロシージャを呼び出します。

    obfuscator.vhdlfile   <入力ファイル名> <出力ファイル名>
    
    obfuscator.verilogfile   <入力ファイル名> <出力ファイル名>
    
    obfuscator.dir  <ソースディレクトリ名> <出力ディレクトリ名>
    

注意: obfuscator_procedure.tcl スクリプトは、下記からダウンロードできます。
http://www.aldec.com/downloads/private/409

難読化ツールコマンド

下記コマンドは Active-HDL, Riviera-PRO, および ALINTのコンソールウィンドウで、単独で使用できます。

obfuscator.vhdlfile/obfuscator.verilogfile

上記コマンドを使って、単一のVHDL/Verilog/SystemVerilogファイルを難読コードに変換します。ユーザ定義の識別子が、md5ハッシュ値と置き換えられます。
コメントを全て削除し、コードのフォーマットを変形します。

ファイルを変換するには、次のシンタックスを使用します。

obfuscator.vhdlfile  <入力ファイル名> <出力ファイル名>

または

obfuscator.verilogfile  <入力ファイル名> <出力ファイル名>

VHDL 例

難読化実行前のコード

component AND2
	port (
		I0 : in STD_LOGIC;
		I1 : in STD_LOGIC;
		O : out STD_LOGIC);
end component;

component INV
	port (
		I : in STD_LOGIC;
		O : out STD_LOGIC);
end component;

component BIN2BCD
	port (
		BIN : in STD_LOGIC_VECTOR (4 downto 0);
		BCD_H : out STD_LOGIC_VECTOR (1 downto 0);
		BCD_L : out STD_LOGIC_VECTOR (3 downto 0));
end component;

難読化実行後のコード

 component IE78B0DC123245A66D28424B7441786C2  port ( IA9E26254E651465C89FF715D5733E97C : in std_logic ; I9CE88802F07591E5CE0457EF51ECE021 :
in std_logic ; ID95679752134A2D9EB61DBD7B91C4BCC : out std_logic ); end component ; component I545F7F577C93318B34476E9999931731 
port ( I865C0C0B4AB0E063E5CAA3387C1A8741 : in std_logic ; ID95679752134A2D9EB61DBD7B91C4BCC : out std_logic ); end component ;
component IE204BDD6D6610E296B5C4727A490693E  port ( IC1111BD512B29E821B120B86446026B8 : in std_logic_vector (4 downto 0);
I2E082C56D8BBC0B0C0A888AD7A5D6A4B : out std_logic_vector (1 downto 0); I0695DFE458CCCA4B0E57C8660F3873DF : out std_logic_vector (3
downto 0)); end component ;

Verilog 例

難読化実行前のコード

module BIN2BCD (BIN, BCD_H, BCD_L);
input  [4:0]BIN;
output [1:0]BCD_H;
output [3:0]BCD_L;

assign BCD_L = (BIN == 5'b00001 || BIN == 5'b01011 || BIN == 5'b10101 || BIN == 5'b11111) ? 4'b0001 :
			   (BIN == 5'b00010 || BIN == 5'b01100 || BIN == 5'b10110) ? 4'b0010 :
			   (BIN == 5'b00011 || BIN == 5'b01101 || BIN == 5'b10111) ? 4'b0011 :
			   (BIN == 5'b00100 || BIN == 5'b01110 || BIN == 5'b11000) ? 4'b0100 :
			   (BIN == 5'b00101 || BIN == 5'b01111 || BIN == 5'b11001) ? 4'b0101 :
			   (BIN == 5'b00110 || BIN == 5'b10000 || BIN == 5'b11010) ? 4'b0110 :
			   (BIN == 5'b00111 || BIN == 5'b10001 || BIN == 5'b11011) ? 4'b0111 :
			   (BIN == 5'b01000 || BIN == 5'b10010 || BIN == 5'b11100) ? 4'b1000 :
			   (BIN == 5'b01001 || BIN == 5'b10011 || BIN == 5'b11101) ? 4'b1001 :
			   4'b0000 ;

assign BCD_H = (BIN < 5'd10) ? 2'b00 :
			   (BIN < 5'd20) ? 2'b01 :
			   (BIN < 5'd30) ? 2'b10 :
			   2'b11 ;

endmodule

難読化実行後のコード

module I36DFB826C984926D0D99D7A8CAFBF71F (I35D3245A21B0942070419EF6602D239E , IF755C48F393913F48C1C13D3F07E3D62 ,
I3F74699ECAB4A004DA8DEDDEB9AB9B49 ); input [4:0]I35D3245A21B0942070419EF6602D239E ; output [1:0]IF755C48F393913F48C1C13D3F07E3D62 ;
output [3:0]I3F74699ECAB4A004DA8DEDDEB9AB9B49 ; assign I3F74699ECAB4A004DA8DEDDEB9AB9B49 = (I35D3245A21B0942070419EF6602D239E
== 5'b00001 || I35D3245A21B0942070419EF6602D239E == 5'b01011 || I35D3245A21B0942070419EF6602D239E == 5'b10101 ||
I35D3245A21B0942070419EF6602D239E == 5'b11111) ? 4'b0001 : (I35D3245A21B0942070419EF6602D239E == 5'b00010 || I35D3245A21B0942070419EF6602D239E
== 5'b01100 || I35D3245A21B0942070419EF6602D239E == 5'b10110) ? 4'b0010 : (I35D3245A21B0942070419EF6602D239E ==
5'b00011 || I35D3245A21B0942070419EF6602D239E == 5'b01101 || I35D3245A21B0942070419EF6602D239E == 5'b10111) ? 4'b0011
: (I35D3245A21B0942070419EF6602D239E == 5'b00100 || I35D3245A21B0942070419EF6602D239E == 5'b01110 || I35D3245A21B0942070419EF6602D239E
== 5'b11000) ? 4'b0100 : (I35D3245A21B0942070419EF6602D239E == 5'b00101 || I35D3245A21B0942070419EF6602D239E ==
5'b01111 || I35D3245A21B0942070419EF6602D239E == 5'b11001) ? 4'b0101 : (I35D3245A21B0942070419EF6602D239E == 5'b00110
|| I35D3245A21B0942070419EF6602D239E == 5'b10000 || I35D3245A21B0942070419EF6602D239E == 5'b11010) ? 4'b0110 : (I35D3245A21B0942070419EF6602D239E
== 5'b00111 || I35D3245A21B0942070419EF6602D239E == 5'b10001 || I35D3245A21B0942070419EF6602D239E == 5'b11011) ?
4'b0111 : (I35D3245A21B0942070419EF6602D239E == 5'b01000 || I35D3245A21B0942070419EF6602D239E == 5'b10010 || I35D3245A21B0942070419EF6602D239E
== 5'b11100) ? 4'b1000 : (I35D3245A21B0942070419EF6602D239E == 5'b01001 || I35D3245A21B0942070419EF6602D239E ==
5'b10011 || I35D3245A21B0942070419EF6602D239E == 5'b11101) ? 4'b1001 : 4'b0000 ; assign IF755C48F393913F48C1C13D3F07E3D62
= (I35D3245A21B0942070419EF6602D239E < 5'd10) ? 2'b00 : (I35D3245A21B0942070419EF6602D239E < 5'd20) ? 2'b01 : (I35D3245A21B0942070419EF6602D239E
< 5'd30) ? 2'b10 : 2'b11 ; endmodule

obfuscator.dir

このコマンドは、指定したソースディレクトリにある HDL ファイルを探して、コード内の全ての識別子を md5 ハッシュ値に置き換えます。

注意: ソースディレクトリの内容は変更できません。

指定したソースディレクトリを難読化するには、次のシンタックスを使用します。

obfuscator.dir   <ソースディレクトリ名> <出力ディレクトリ名>


Printed version of site: www.aldec.com/jp/support/resources/documentation/articles/1586