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   <ソースディレクトリ名> <出力ディレクトリ名>
Ask Us a Question
x
Ask Us a Question
x
Captcha ImageReload Captcha
Incorrect data entered.
Thank you! Your question has been submitted. Please allow 1-3 business days for someone to respond to your question.
Internal error occurred. Your question was not submitted. Please contact us using Feedback form.
We use cookies to ensure we give you the best user experience and to provide you with content we believe will be of relevance to you. If you continue to use our site, you consent to our use of cookies. A detailed overview on the use of cookies and other website information is located in our Privacy Policy.