« Prev | Next » HDLコードの難読化 概要 アルデックは、VHDL, Verilog および SystemVerilog コードを難読コードに変換するスクリプトを提供しています。HDLコードの難読化は、コードの記述内容を他のユーザに判読させたくない方に有効です。難読コードはコードを受け取った人には判読できませんが、コンパイラやシミュレータでは動作可能です。これは特別なソースファイルのデバッグが必要だが、実際のファイルの内容を開示したくない場合に特に有効です。 難読化用のスクリプト アルデックは、ユーザの用途に応じて、ファイルを難読化するスクリプトを提供しています。obfuscator_procedure.tcl スクリプトでは、次のコマンドを提供しています。 obfuscator.vhdlfile obfuscator.verilogfile obfuscator.dir Tcl スクリプトの実行方法 obfuscator_procedures.tcl ファイルの内容を Tcl インタプリタにパスします。 source obfuscator_procedures.tcl 次のフォーマットで必要なプロシージャを呼び出します。 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 <ソースディレクトリ名> <出力ディレクトリ名> Previous article Next article