(57)【特許請求の範囲】
【請求項１】
ソースコードからコメントを表すコメント情報を削除するコメント情報削除部と、
前記ソースコードから、前記ソースコードの記述言語における所定種類の構成要素を表す文字列を難読化対象のキーワードとして抽出して難読化リストを生成する難読化対象キーワード抽出部と、
前記難読化リストにおいて前記キーワードを文字列長の降順に並び替えるとともに、前記難読化リストから所定の条件を満たすキーワードを除外する難読化リスト調整部と、
前記コメント情報が削除されたソースコードにおいて、前記難読化リストに含まれるキーワードを他の文字列に変換する処理を、前記難読化リストに含まれる順に実行する難読化実行部と、
を備えた難読化装置。
【請求項２】
前記コメント情報削除部は、前記ソースコードから、前記コメント情報のうち所定の条件を満たすもの以外を削除することを特徴とする請求項１に記載の難読化装置。
【請求項３】
前記難読化対象キーワード抽出部は、前記ソースコードの記述スタイルを所定のスタイルに整形してから、前記難読化対象のキーワードを抽出することを特徴とする請求項１または請求項２に記載の難読化装置。
【請求項４】
前記難読化リスト調整部は、前記難読化リストから、文字列長が閾値未満のキーワードを除外することを特徴とする請求項１から請求項３のいずれか１項に記載の難読化装置。
【請求項５】
前記難読化リスト調整部は、前記難読化リストから、除外リストに含まれるキーワードを除外することを特徴とする請求項１から請求項４のいずれか１項に記載の難読化装置。
【請求項６】
前記難読化リスト調整部は、前記記述言語の予約語の部分文字列となっているキーワードを検出し、検出結果に基づき前記難読化リストまたは前記ソースコードを修正することを特徴とする請求項１から請求項５のいずれか１項に記載の難読化装置。
【請求項７】
前記難読化実行部は、前記難読化リストに含まれるキーワードを、前記難読化リストに含まれる順に他の文字列に変換する難読化変換スクリプトを生成し、生成した難読化変換スクリプトを、前記コメント情報が削除されたソースコードに対して実行することを特徴とする請求項１から請求項６のいずれか１項に記載の難読化装置。
【請求項８】
コンピュータ装置が、ソースコードからコメントを表すコメント情報を削除し、
前記ソースコードから、前記ソースコードの記述言語における所定種類の構成要素を表す文字列を難読化対象のキーワードとして抽出して難読化リストを生成し、
前記難読化リストにおいて前記キーワードを文字列長の降順に並び替えるとともに、前記難読化リストから所定の条件を満たすキーワードを除外し、
前記コメント情報が削除されたソースコードにおいて、前記難読化リストに含まれるキーワードを他の文字列に変換する処理を、前記難読化リストに含まれる順に実行する方法。
【請求項９】
ソースコードからコメントを表すコメント情報を削除するコメント情報削除ステップと、
前記ソースコードから、前記ソースコードの記述言語における所定種類の構成要素を表す文字列を難読化対象のキーワードとして抽出して難読化リストを生成する難読化対象キーワード抽出ステップと、
前記難読化リストにおいて前記キーワードを文字列長の降順に並び替えるとともに、前記難読化リストから所定の条件を満たすキーワードを除外する難読化リスト調整ステップと、
前記コメント情報が削除されたソースコードにおいて、前記難読化リストに含まれるキーワードを他の文字列に変換する処理を、前記難読化リストに含まれる順に実行する難読化実行ステップと、
をコンピュータ装置に実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコードに含まれる秘密情報を難読化する技術に関する。
【背景技術】
【０００２】
最先端ＬＳＩ（Large Scale Integration）デバイスの微細化が進むにしたがい、ＬＳＩを設計するＥＤＡ（electronic design automation）ツールの機能自体も大規模化／複雑化している。それに伴い、デバイス起因、あるいはＥＤＡツール起因による不具合が発生するケースが増えてきている。
【０００３】
当然ながら、これらの不具合は、ＬＳＩを設計したデザインのみを解析しただけでは原因究明できないことがほとんどである。このため、設計者だけで問題解決することは困難であり、デバイスベンダやＥＤＡベンダに対して解析依頼をするケースが増えている。多くの場合、設計者は、次のような方法（１）または（２）等により解析を依頼する。
（１）デバイスベンダ、ＥＤＡベンダとの間で秘密保持契約（以下、ＮＤＡ：Non-disclosure agreement）を締結し、秘密情報を含む当該デザインを支給する。
（２）当該デザインから秘密情報を手作業で削除して、デバイスベンダ、ＥＤＡベンダに支給する。
【０００４】
このように、設計者からデバイスベンダやＥＤＡベンダへの解析依頼には、デザインの支給が不可欠になる。
【０００５】
しかし、上記の方法では、以下の問題が発生する。方法（１）では、開発プロジェクトの方針によりＮＤＡそのものを締結できないケースが多い。また、ＮＤＡを締結していたとしても、モジュール名や信号名などでデザインの機能が特定されるのを嫌い、デザインの開示を行うことができない開発プロジェクトが多い。これは、デバイスベンダやＥＤＡベンダ経由で、競合他社に情報が漏れる可能性を考慮するからである。
【０００６】
方法（２）では、デザインの機能を特定されないようモジュール名や信号名などを変更する作業に非常に工数がかかる。また、手作業での変更では、ミスが発生しやすい。
【０００７】
このような問題に関連する技術の一例が、特許文献１に記載されている。特許文献１に記載された関連技術は、ＬＳＩの設計内容がハードウェア記述言語で記述されたソースコードにおいて、各変数名を他の文字列に変換する。このとき、この関連技術は、あらかじめ設定された非変換文字列に該当する変数名については、文字列変換処理を行わない。この技術を利用することにより、設計者は、秘密情報となる各変数名が他の文字列に変換されたソースコードを、デバイスベンダやＥＤＡベンダに支給する。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００５−２３５８４８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、特許文献１に記載された関連技術には、秘密情報となる各変数名等に対してどのように文字列変換を行うかについての詳細が記載されていない。ソースコードにおいて秘密情報となりうる変数名等には、多岐にわたる文字列が使用されている。このため、単にソースコードから変数名を抽出して順次文字列変換を行うだけでは、意図しない文字列変換が生じる可能性がある。このため、構文エラーが生じる可能性や、秘密情報が残ってしまう可能性がある。そのため、この関連技術を用いても、結局は、変換結果を目視で確認する作業などが必要となってしまう。
【００１０】
本発明は、上述の課題を解決するためになされたものである。すなわち、本発明は、元のソースコードから秘密情報をより適切に削除しながら、元のソースコードに対して設計内容が等価なソースコードを自動生成する技術を提供することを目的とする。
【課題を解決するための手段】
【００１１】
本発明の難読化装置は、ソースコードからコメントを表すコメント情報を削除するコメント情報削除部と、前記ソースコードから、その記述言語における所定種類の構成要素を表す文字列を難読化対象のキーワードとして抽出して難読化リストを生成する難読化対象キーワード抽出部と、前記難読化リストにおいて前記キーワードを文字列長の降順に並び替えるとともに、前記難読化リストから所定の条件を満たすキーワードを除外する難読化リスト調整部と、前記コメント情報が削除されたソースコードにおいて、前記難読化リストに含まれるキーワードを他の文字列に変換する処理を、前記難読化リストに含まれる順に実行する難読化実行部と、を備える。
【００１２】
また、本発明の方法は、コンピュータ装置が、ソースコードからコメントを表すコメント情報を削除し、前記ソースコードから、その記述言語における所定種類の構成要素を表す文字列を難読化対象のキーワードとして抽出して難読化リストを生成し、前記難読化リストにおいて前記キーワードを文字列長の降順に並び替えるとともに、前記難読化リストから所定の条件を満たすキーワードを除外し、前記コメント情報が削除されたソースコードにおいて、前記難読化リストに含まれるキーワードを他の文字列に変換する処理を、前記難読化リストに含まれる順に実行する。
【００１３】
また、本発明のプログラムは、ソースコードからコメントを表すコメント情報を削除するコメント情報削除ステップと、前記ソースコードから、その記述言語における所定種類の構成要素を表す文字列を難読化対象のキーワードとして抽出して難読化リストを生成する難読化対象キーワード抽出ステップと、前記難読化リストにおいて前記キーワードを文字列長の降順に並び替えるとともに、前記難読化リストから所定の条件を満たすキーワードを除外する難読化リスト調整ステップと、前記コメント情報が削除されたソースコードにおいて、前記難読化リストに含まれるキーワードを他の文字列に変換する処理を、前記難読化リストに含まれる順に実行する難読化実行ステップと、をコンピュータ装置に実行させる。
【発明の効果】
【００１４】
本発明は、元のソースコードから秘密情報をより適切に削除しながら、元のソースコードに対して設計内容が等価なソースコードを自動生成する技術を提供することができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の第１の実施の形態としての難読化装置の構成を示すブロック図である。
【図２】本発明の第１の実施の形態としての難読化装置のハードウェア構成の一例を示す図である。
【図３】本発明の第１の実施の形態としての難読化装置の動作を説明するフローチャートである。
【図４】本発明の第２の実施の形態としての難読化装置の構成を示すブロック図である。
【図５】一般的なソースコードの様々な記述スタイルを説明する図である。
【図６】本発明の第２の実施の形態としての難読化装置のコメント情報削除動作の詳細を説明するフローチャートである。
【図７】本発明の第２の実施の形態の具体例においてコメント情報を削除する前の元のソースコードの一例を示す図である。
【図８】本発明の第２の実施の形態の具体例においてコメント情報が削除される際に生成されるテンポラリなソースコードの一例を示す図である。
【図９】本発明の第２の実施の形態の具体例においてコメント情報が削除される際にさらに生成されるテンポラリなソースコードの一例を示す図である。
【図１０】本発明の第２の実施の形態の具体例においてコメント情報が削除されたソースコードの一例を示す図である。
【図１１】本発明の第２の実施の形態の具体例においてコメント情報を削除する前の他の元のソースコードの一例を示す図である。
【図１２】本発明の第２の実施の形態の具体例においてコメント情報が削除された他のソースコードの一例を示す図である。
【図１３】本発明の第２の実施の形態としての難読化装置の難読化対象キーワード抽出動作の詳細を説明するフローチャートである。
【図１４】本発明の第２の実施の形態の具体例において記述スタイルを整形する際に生成されるテンポラリなソースコードの一例を示す図である。
【図１５】本発明の第２の実施の形態の具体例において記述スタイルが整形されたソースコードの一例を示す図である。
【図１６】本発明の第２の実施の形態の具体例において難読化対象のキーワードを抽出するための規則の一例を示す図である。
【図１７】本発明の第２の実施の形態の具体例において抽出される難読化対象のキーワードの一例を示す図である。
【図１８】本発明の第２の実施の形態の具体例において生成／調整される難読化リストの一例を示す図である。
【図１９】本発明の第２の実施の形態としての難読化装置の難読化リスト調整動作の詳細を説明するフローチャートである。
【図２０】本発明の第２の実施の形態の具体例において参照される予約語テーブルの一例を示す図である。
【図２１】本発明の第２の実施の形態としての難読化装置の難読化実行動作の詳細を説明するフローチャートである。
【図２２】本発明の第２の実施の形態の具体例において生成される変換テーブルの一例を示す図である。
【図２３】本発明の第２の実施の形態の具体例において生成される難読化変換スクリプトの一例を示す図である。
【図２４】本発明の第２の実施の形態の具体例において難読化されたソースコードの一例を示す図である。
【発明を実施するための形態】
【００１６】
以下、本発明の実施の形態について、図面を参照して詳細に説明する。
【００１７】
（第１の実施の形態）
本発明の第１の実施の形態としての難読化装置１の機能ブロック構成を図１に示す。図１において、難読化装置１は、コメント情報削除部１１と、難読化対象キーワード抽出部１２と、難読化リスト調整部１３と、難読化実行部１４とを備える。
【００１８】
ここで、難読化装置１は、図２に示すようなハードウェア要素によって構成可能である。図２において、難読化装置１は、ＣＰＵ（Central Processing Unit）１００１、メモリ１００２、出力装置１００３および入力装置１００４を含む。メモリ１００２は、ＲＡＭ（Random Access Memory）、ＲＯＭ（Read Only Memory）、補助記憶装置（ハードディスク等）等によって構成される。出力装置１００３は、ディスプレイ装置やプリンタ等のように、情報を出力する装置によって構成される。入力装置１００４は、キーボードやマウス等のように、ユーザ操作の入力を受け付ける装置によって構成される。この場合、難読化装置１の各機能ブロックは、メモリ１００２に格納されるコンピュータ・プログラムを読み込んで実行するとともに出力装置１００３および入力装置１００４の各部を制御するＣＰＵ１００１によって構成される。なお、難読化装置１およびその各機能ブロックのハードウェア構成は、上述の構成に限定されない。
【００１９】
コメント情報削除部１１は、ソースコードから、コメント情報を削除する。ここで、ソースコードとは、集積回路の設計内容がハードウェア記述言語で記述されたテキスト情報であってもよい。具体的には、コメント情報削除部１１は、そのソースコードの記述言語においてコメントの開始または終了を表す文字列に基づいて、コメント情報を削除すればよい。
【００２０】
ここで、ソースコードに埋め込まれているコメントは、秘密情報となりうる。例えば、ソースコードが集積回路の設計内容を表す場合、コメントには、デザインの機能を特定することが可能な情報が含まれる可能性が高い。また、コメントを難読化すると、コメントそのものの存在意義が失われる。したがって、コメントは、ソースコードの難読化という観点からは、難読化の対象となるよりも、ソースコードから削除されることが適している。
【００２１】
なお、ソースコードは、例えば、メモリ１００２に格納されていてもよい。あるいは、ソースコードは、ネットワークを介して接続された外部の装置や可搬型記憶媒体等に格納されていてもよい。その場合、コメント情報削除部１１は、対象のソースコードの格納位置を示す情報を、入力装置１００４を介して取得することにより、ソースコードを取得してもよい。また、入力された情報が、１つ以上のソースコードがまとめて格納されている位置（フォルダ等）を示す場合、コメント情報削除部１１は、該当する位置にある全てのソースコードを取得してコメントの削除を行ってもよい。
【００２２】
難読化対象キーワード抽出部１２は、ソースコードから、難読化対象のキーワードを抽出し、抽出したキーワードの一覧を難読化リストとする。難読化対象のキーワードは、その記述言語における所定種類の構成要素を表す文字列である。構成要素のうち難読化対象とする種類については、あらかじめ設定されている。もし、取得されたソースコード群の記述言語が複数種類に渡る場合、難読化対象キーワード抽出部１２は、記述言語毎に難読化リストを生成すればよい。
【００２３】
難読化リスト調整部１３は、難読化リストにおいて、キーワードを文字列長の降順に並び替える。また、難読化リスト調整部１３は、難読化リストから、所定の条件を満たすキーワードを除外する。
【００２４】
難読化実行部１４は、コメント情報が削除されたソースコードにおいて、難読化リストに含まれるキーワードを他の文字列に変換する処理を、難読化リストに含まれる順に実行する。もし、取得されたソースコード群の記述言語が複数種類に渡る場合、難読化実行部１４は、コメント情報が削除された各ソースコードに対して、その記述言語について生成した難読化リストを用いて変換処理を行えばよい。
【００２５】
以上のように構成された難読化装置１の動作について、図３を参照して説明する。
【００２６】
図３において、まず、コメント情報削除部１１は、対象となる１つまたは複数のソースコードを取得する（ステップＳ１）。
【００２７】
なお、ここで取得されるソースコード群の記述言語が複数種類に渡る場合、以下のステップＳ２〜Ｓ６の動作は、記述言語毎に実行されることが望ましい。
【００２８】
次に、コメント情報削除部１１は、各ソースコードから、コメント情報を削除する（ステップＳ２）。
【００２９】
次に、難読化対象キーワード抽出部１２は、ソースコード群から、その記述言語における所定種類の構成要素を表す文字列を、難読化対象のキーワードとして抽出して難読化リストとする（ステップＳ３）。
【００３０】
次に、難読化リスト調整部１３は、難読化リストに含まれるキーワードを、その文字列長の降順に並べ替える（ステップＳ４）。
【００３１】
次に、難読化リスト調整部１３は、難読化リストにおいて、所定条件を満たすキーワードを除外する（ステップＳ５）。
【００３２】
次に、難読化実行部１４は、コメント情報が削除された各ソースコードにおいて、難読化リストに含まれるキーワードを、難読化リストに含まれる順に、他の文字列に変換する（ステップＳ６）。
【００３３】
以上で、難読化装置１は、動作を終了する。
【００３４】
次に、本発明の第１の実施の形態の効果について述べる。
【００３５】
本発明の第１の実施の形態としての難読化装置は、元のソースコードから秘密情報をより適切に削除しながら、元のソースコードに対して設計内容が等価なソースコードを自動生成することができる。
【００３６】
その理由について説明する。本実施の形態では、コメント情報削除部が、ソースコードからコメント情報を削除する。そして、難読化対象キーワード抽出部が、ソースコードから、その記述言語における所定種類の構成要素を表す文字列を、難読化対象のキーワードとして抽出して難読化リストを生成する。そして、難読化リスト調整部が、難読化リストにおいて、キーワードを文字列長の降順に並び替えるとともに、所定の条件を満たすキーワードを除外する。そして、難読化実行部が、コメント情報が削除されたソースコードにおいて、難読化リストに含まれるキーワードを他の文字列に変換する処理を、難読化リストに含まれる順に実行するからである。
【００３７】
このように、本実施の形態は、ソースコードにおいて、秘密情報を含み得るコメント情報を削除する。また、本実施の形態は、ソースコードにおいて、その記述言語で秘密情報を表し得る各種の構成要素を表す文字列を、全て難読化対象のキーワードとして他の文字列に変換する。つまり、本実施の形態は、ソースコードにおける秘密情報を漏れなく削除することができる。
【００３８】
また、このように、本実施の形態は、キーワードの文字列変換を、難読化対象のキーワードの文字列長の降順に行う。ここで、難読化対象の一方のキーワードが他方のキーワードに含まれる場合がある。この場合、一方のキーワードの文字列変換を先に行ってしまうと、他方のキーワードの一部も変換されてしまうため、他方のキーワードの文字列変換が不可能になってしまう。このため、他方のキーワードに含まれる秘密情報が変換されずに残ってしまう可能性がある。本実施の形態は、キーワードの文字列長の降順に文字列変換を行うため、抽出した全てのキーワードを適切に文字列変換することができる。
【００３９】
（第２の実施の形態）
次に、本発明の第２の実施の形態について図面を参照して詳細に説明する。本実施の形態では、難読化の対象となるソースコードが、ハードウェア記述言語で記載されたＲＴＬ（Register transfer level）ソースコードである例について説明する。なお、本実施の形態の説明において参照する各図面において、本発明の第１の実施の形態と同一の構成および同様に動作するステップには同一の符号を付して本実施の形態における詳細な説明を省略する。
【００４０】
まず、本発明の第２の実施の形態としての難読化装置２の構成を図４に示す。図４において、難読化装置２は、コメント情報削除部２１と、難読化対象キーワード抽出部２２と、難読化リスト調整部２３と、難読化実行部２４とを備える。ここで、難読化装置２およびその各機能ブロックは、図２を参照して説明した本発明の第１の実施の形態と同様のハードウェア要素によって構成可能である。ただし、難読化装置２およびその各機能ブロックのハードウェア構成は、上述の構成に限定されない。
【００４１】
コメント情報削除部２１は、難読化対象のソースコードとして、前述のＲＴＬソースコードを取得する。例えば、コメント情報削除部２１は、入力装置１００４から入力された情報が示すメモリ１００２上のフォルダ以下に含まれる全てのＲＴＬソースコードを取得してもよい。そのようなＲＴＬソースコードの記述言語の種類としては、ＶＨＤＬ（Very High Speed Integrated Circuit Hardware Description Language）、Ｖｅｒｉｌｏｇ、ＳｙｓｔｅｍＶｅｒｉｌｏｇ等がある。このように、コメント情報削除部２１によって取得されるＲＴＬソースコードの記述言語は、複数種類に渡っていてもよい。なお、以下では、コメント情報削除部２１によって取得されたＲＴＬソースコードを、単にソースコードとも記載する。
【００４２】
また、コメント情報削除部２１は、ソースコードから、コメント情報のうち所定の条件を満たすもの以外を削除する。これは、ソースコードにおいてコメントの形式で記述される情報であっても、不具合の解析等に必要な情報を含む場合があるからである。
【００４３】
例えば、ハードウェア記述言語で記載されたソースコードでは、コメントの形式で記述された情報が、合成ツールによって解釈されるディレクティブ（プラグマとも呼ばれる）を表すケースがある。このような情報は、回路動作に関わる制約になる。このため、このような情報をコメント情報として削除してしまうと、オリジナルのソースコードとの等価性が失われてしまう可能性がある。そこで、コメント情報削除部２１は、そのようなディレクティブ記述に当てはまる情報を、コメントの形式であっても削除しないようにする。そして、コメント情報削除部２１は、そのようなディレクティブ記述に当てはまらないコメント情報を削除すればよい。
【００４４】
例えば、ＶＨＤＬでは、「--」から改行コードまでが、コメントを表す。また、ＶｅｒｉｌｏｇやＳｙｓｔｅｍＶｅｒｉｌｏｇでは、「//」から改行コードまでが、コメントを表す。また、ＶＨＤＬ、ＶｅｒｉｌｏｇおよびＳｙｓｔｅｍＶｅｒｉｌｏｇのいずれでも、「/*」から「*/」までが、コメントを表す。そして、例えば、Ｖｅｒｉｌｏｇでは、「// synopsys」や「// synthesis」といった文字列が、ディレクティブを記述する際に用いられる。
【００４５】
そこで、コメント情報削除部２１は、所定条件として上述のディレクティブ記述を表す文字列を事前に検索してディレクティブ記述を検出する。そして、コメント情報削除部２１は、検出したディレクティブ記述のうち、コメントの開始を表す文字列を、ソースコードで使用されない文字列に一時的に置き換える。置き換えた文字列を、一時的変換文字列とも記載する。そして、コメント情報削除部２１は、ソースコードから、コメントの開始または終了を表す情報を検索することにより、コメント情報をソースコードから削除すればよい。その後、コメント情報削除部２１は、一時的変換文字列を、コメントの開始を表す元の文字列に変換すればよい。
【００４６】
難読化対象キーワード抽出部２２は、ソースコードの記述スタイルを所定のスタイルに整形してから、難読化対象のキーワードを抽出する。
【００４７】
ここで、ソースコードの記述スタイルは、設計者、もしくは開発プロジェクトごとによって異なる。記述スタイルとは、例えば、改行の挿入タイミングや、インデントの仕方等をいう。一般的に、記述言語では、同一の内容であっても、見やすさや行数などの観点から、様々な記述スタイルが可能となっていることが多い。様々な記述スタイルの一例を図５に示す。図５において、記述９０１〜９０４は、ＶＨＤＬのｐｏｒｔ宣言記述の様々な記述スタイルを表している。この例のように、一般的な記述言語では、様々な記述スタイルが可能となっている。なお、図５において、太字は、ＶＨＤＬにおいて秘密情報となり得る構成要素を表す文字列である。
【００４８】
ところが、記述スタイルごとに、難読化対象のキーワードを抽出するための規則を設定することは難しい。例えば、図５の例では、記述９０１では、「：ｉｎ」を含む行において「：ｉｎ」の直前の文字列を抽出することにより端子名を表す文字列を抽出することができる。しかし、記述９０２では、１行に複数の「：ｉｎ」が含まれるため、記述９０１と同一の規則では端子名を表す文字列を抽出することができない。また、記述９０３では、直前の文字列の先頭に処理の区切りである「；」が記載されているため、記述９０１と同一の規則では端子名を表す文字列を抽出することができない。また、記述９０４では、「：ｉｎ」の前に複数の端子名が「，」で区切られて記載されているため、記述９０１と同一の規則では端子名を表す文字列を抽出することができない。本実施の形態は、ソースコードの記述スタイルに左右されずに、難読化対象のキーワードをできるだけ正しく抽出する必要がある。そこで、難読化対象キーワード抽出部２２は、ソースコードの記述スタイルを所定のスタイルに統一してから、難読化対象のキーワードを抽出する。
【００４９】
例えば、難読化対象キーワード抽出部２２は、ソースコードにおける改行の挿入タイミングを調整することにより、記述スタイルを統一してもよい。具体的には、この場合、難読化対象キーワード抽出部２２は、ソースコードから一旦全ての改行を削除する処理を行ったあと、処理センテンスの区切りを表す特定の記号の直後に改行を改めて挿入することにより、改行の挿入タイミングを調整してもよい。
【００５０】
また、難読化対象キーワード抽出部２２は、このように改行タイミングを調整したソースコードから、記述言語の所定の構成要素を表す文字列を、難読化対象のキーワードとして抽出する。例えば、そのような構成要素としては、端子名、内部信号名、モジュール名、インスタンス名、ラベル名、内部変数名等がある。そこで、難読化対象キーワード抽出部２２は、記述言語毎に、難読化対象の構成要素についてその構成要素の前または後の文字列を用いた抽出規則を記憶しておいてもよい。そして、難読化対象キーワード抽出部２２は、ソースコードにおいて、そのような抽出規則にマッチする箇所を検索することにより、難読化対象の構成要素を表す文字列を抽出すればよい。
【００５１】
また、難読化対象キーワード抽出部２２は、上述のようにして抽出した難読化対象のキーワードの一覧を、難読化リストとして生成する。なお、取得されたソースコード群の記述言語が複数種類に渡る場合、難読化対象キーワード抽出部２２は、記述言語毎に、ソースコード群から抽出した難読化対象のキーワードの一覧を、難読化リストとすればよい。このとき、難読化対象キーワード抽出部２２は、難読化リストに含まれるキーワードのうち重複するものを取り除くようにする。例えば、難読化対象キーワード抽出部２２は、難読化リストに含まれるキーワードを文字の昇順または降順に並べ替えることにより、複数の同一のキーワードが隣接した場合に、そのうち１つのキーワードを残して残りを削除すればよい。
【００５２】
難読化リスト調整部２３は、上述のようにして生成された難読化リストを、その文字列長の降順に並べ替える。ここで、難読化リストを文字列長の降順に並べ替える理由について説明する。難読化対象の一方のキーワードが、他方のキーワードに含まれる可能性がある。その場合、一方のキーワードを先に無意味な文字列に変換してしまうと、そのキーワードを含む他方のキーワード内の一部が無意味な文字列に変換されてしまう。したがって、他方のキーワードを変換しようとする際には、既にそのキーワードがないため、変換できない。しかしながら、一部が変換された他方のキーワードには、秘密情報が残っている可能性がある。つまり、これらの難読化対象のキーワードについて、抽出した順、文字列の昇順や降順、ランダムな順などで変換を行っても、無意味な文字列に変換できないキーワードが発生する可能性が高い。
【００５３】
具体的な例で説明する。難読化対象のキーワードとして、端子名「ｃｏｕｎｔ」および「ｃｏｕｎｔ＿ｒｅｓｅｔ＿ｒｅｇ」が抽出されているとする。このとき、「ｃｏｕｎｔ」を無意味な文字列「ＥＥＥ」に変換する処理を、「ｃｏｕｎｔ＿ｒｅｓｅｔ＿ｒｅｇ」の変換処理に先行して行ったとする。この場合、端子名「ｃｏｕｎｔ」が「ＥＥＥ」に変換される際に、端子名「ｃｏｕｎｔ＿ｒｅｓｅｔ＿ｒｅｇ」が「ＥＥＥ＿ｒｅｓｅｔ＿ｒｅｇ」に変換されてしまう。すると、その後、「ｃｏｕｎｔ＿ｒｅｓｅｔ＿ｒｅｇ」の変換処理を行うことができない。その結果、変換後のソースコードにおいて、端子名「ＥＥＥ＿ｒｅｓｅｔ＿ｒｅｇ」の中に秘密情報が残っており、難読化が充分でないことになる。この問題は、文字列長がより長い端子名「ｃｏｕｎｔ＿ｒｅｓｅｔ＿ｒｅｇ」の変換処理を、文字列長がより短い端子名「ｃｏｕｎｔ」より先行して実施することで解決する。
【００５４】
このような理由により、難読化リスト調整部２３は、難読化リストにおいて、キーワードをその文字列長の降順に並び替える。
【００５５】
また、難読化リスト調整部２３は、このようにして生成した難読化リストから、文字列長が閾値未満のキーワードを除外する。
【００５６】
ここで、閾値未満のキーワードを除外する理由について説明する。文字列長が短いキーワードは、記述言語の予約語に含まれる可能性が高い。例えば、「ｅｎ」という信号名が難読化対象として抽出され「難読化リスト」に登録されているとする。このとき、キーワード「ｅｎ」を無意味な文字列「ｚｚｚ」に変換することを考える。ところが、ソースコードにおいて制御を表す単語である「ｔｈｅｎ」や「ｅｎｄ」といった文字列は、その一部に「ｅｎ」を含む。このため、信号名「ｅｎ」の「ｚｚｚ」への変換に伴い、「ｔｈｅｎ」や「ｅｎｄ」が、「ｔｈＺＺＺ」や「ＺＺＺｄ」に変換されてしまう。その結果、難読化されたソースコードは、構文エラーを引き起こしてしまう。この問題は、文字列長の短いキーワードを難読化リストから除外することにより解決する。なお、難読化対象の構成要素を表す文字列であっても、文字列長が充分に短い文字列は、秘密情報を表すことが難しい。したがって、文字列長が短いキーワードを難読化リストから除外しても、難読化処理に与える影響は少ないと考えてよい。例えば、１文字や２文字の文字列であれば、実質的に、ＬＳＩデザインの機能を特定される可能性は非常に低い。そこで、前述したように、難読化リスト調整部２３は、難読化リストから、文字列長が閾値未満のキーワードを除外する。閾値は、例えば３であってもよい。なお、除外する文字列長の閾値は、利用者により設定可能であるものとする。
【００５７】
また、難読化リスト調整部２３は、難読化リストから、除外リストに含まれるキーワードを除外する。除外リストは、あらかじめメモリ１００２等に格納され、利用者により設定可能であるものとする。
【００５８】
また、難読化リスト調整部２３は、難読化リストに含まれるキーワードのうち、記述言語の予約語の部分文字列となっているキーワードを検出する。そして、難読化リスト調整部２３は、検出結果に基づいて、難読化リストまたはソースコードを修正する。なお、ここで修正の対象となるソースコードは、コメント情報削除部２１によってコメント情報が削除されたソースコードである。
【００５９】
ここで、記述言語の予約語の部分文字列となっているキーワードが検出された場合で、その予約語がソースコードに含まれているとする。このような場合、そのキーワードの変換に伴い、予約語の一部の文字列が変換されてしまう。例えば、ＶＨＤＬのソースコードから抽出された難読化リストにキーワード「ａｃｋ」が含まれているとする。このキーワードは、ＶＨＤＬの予約語「ｐａｃｋａｇｅ」の部分文字列となっている。仮に、キーワード「ａｃｋ」を無意味な文字列「ＸＸＸ」に変換すると、予約語「ｐａｃｋａｇｅ」の一部までもが変換され「ｐＸＸＸａｇｅ」となってしまう。その結果、難読化後のソースコードが構文エラーを引き起こしてしまう。
【００６０】
そこで、難読化リスト調整部２３は、検出したキーワードを含む予約語がソースコードに含まれていれば、難読化リストからそのキーワードを除外するか、難読化リストおよびソースコードにおいてそのキーワードを別のキーワードに変更する修正を行う。
【００６１】
なお、難読化リスト調整部２３は、検出したキーワードを含んでいる予約語がソースコードに含まれるか否かを解析する処理を必ずしも行わなくてもよい。例えば、難読化リスト調整部２３は、検出したキーワードを、そのキーワードを含む予約語と共に、警告情報として出力装置１００３に出力してもよい。そして、この場合、難読化リスト調整部２３は、警告情報の出力に応じて、入力装置１００４を介して入力される入力情報を取得し、入力情報に基づいて難読化リストまたはソースコードを修正してもよい。あるいは、この場合、難読化リスト調整部２３は、警告情報の出力後、修正された難読化リストまたはソースコードを取得してもよい。
【００６２】
具体的には、難読化リスト調整部２３は、ハードウェア記述言語のリファレンスマニュアルで規定されている予約語の一覧を参照する。例えば、ＶＨＤＬ、Ｖｅｒｉｌｏｇ、ＳｙｓｔｅｍＶｅｒｉｌｏｇ等でそれぞれ定められた予約語を含む予約語テーブルが、あらかじめメモリ１００２に記憶されていてもよい。そして、難読化リスト調整部２３は、この予約語テーブルを用いて、難読化リストに含まれるキーワードのうち、予約語テーブルに含まれる予約語の部分文字列となっているキーワードを検出する。
【００６３】
そして、難読化リスト調整部２３は、検出したキーワードを、そのキーワードを含む予約語と共に、警告情報として出力装置１００３に出力する。利用者は、検出されたキーワードを含む予約語をソースコード中に発見した場合、難読化リストから該当するキーワードを削除する編集を行う。あるいは、利用者は、検出されたキーワードを含む予約語をソースコード中に発見した場合、難読化リストおよびソースコードの双方において、該当するキーワードを他のキーワードに変更する編集を行う。また、利用者は、検出されたキーワードを含む予約語をソースコード中に発見しない場合、難読化リストおよびソースコードを編集せずにそのままとする。このようにして、難読化リスト調整部２３は、警告情報の出力後、修正された難読化リストまたはソースコードを取得することができる。
【００６４】
難読化実行部２４は、難読化リストに含まれるキーワードを、難読化リストに含まれる順に他の文字列に変換する難読化変換スクリプトを生成する。そして、難読化実行部２４は、生成した難読化変換スクリプトを、コメント情報が削除されたソースコードに対して実行する。なお、取得されたソースコード群の記述言語が複数種類に渡る場合、難読化実行部２４は、記述言語毎に難読化変換スクリプトを生成すればよい。そして、難読化実行部２４は、コメント情報が削除された各ソースコードに対して、その記述言語に対応する難読化変換スクリプトを実行すればよい。そして、難読化実行部２４は、難読化変換スクリプトから出力された情報を、難読化ソースコードとして、元のソースコードとは異なる名称でメモリ１００２に格納すればよい。
【００６５】
例えば、難読化実行部２４は、難読化リストに含まれるキーワードに対して、無意味な文字列をペアで記述した変換テーブルを、難読化リストに含まれる順で生成してもよい。無意味な文字列は、互いに異なる文字列であればよい。例えば、任意の文字列に連番を付加した文字列を、変換後の無意味な文字列として採用してもよい。連番を採用することにより、キーワード数の増加に容易に対応可能となる。この場合、難読化実行部２４は、変換テーブルに基づいて、難読化変換スクリプトを生成するよう構成される。なお、難読化変換スクリプトの記述言語は、テキスト情報処理に適した言語であることが望ましい。
【００６６】
以上のように構成された難読化装置２の動作について、図面を参照して説明する。
【００６７】
難読化装置２の動作の概略は、図３を参照して説明した本発明の第１の実施の形態としての動作と略同一だが、ステップＳ２〜Ｓ６の詳細が異なる。なお、本発明の第１の実施の形態と同様に、ステップＳ１で取得されるソースコードの記述言語が複数種類に渡る場合、ステップＳ２〜Ｓ６の動作は、記述言語毎に実行されることが望ましい。
【００６８】
まず、ステップＳ２における本実施の形態でのコメント情報削除動作の詳細を図６に示す。
【００６９】
図６では、まず、コメント情報削除部２１は、対象のソースコードにおいて、コメント情報のうち所定の条件を満たす情報を検出する（ステップＳ２１）。
【００７０】
例えば、前述のように、コメント情報削除部２１は、ソースコードにおけるディレクティブ記述を検出する。
【００７１】
次に、コメント情報削除部２１は、ソースコードにおいて、ステップＳ２１で検出した情報以外のコメント情報を削除する（ステップＳ２２）。
【００７２】
例えば、前述のように、コメント情報削除部２１は、ステップＳ２１で検出した情報に含まれるコメントの開始または終了を表す文字列を一時的変換文字列に変換してから、コメントの開始または終了を表す文字列に基づきコメント情報を削除してもよい。この場合、その後、コメント情報削除部２１は、コメント情報を削除後のソースコードにおいて、一時的変換文字列を、コメントの開始または終了を表す文字列に戻す変換を行えばよい。
【００７３】
以上で、難読化装置２は、コメント情報削除動作を終了する。
【００７４】
ここで、コメント情報削除動作の具体例を２つ示す。
【００７５】
１つ目の具体例では、対象のソースコードが、図７に示すようにＶｅｒｉｌｏｇで記述されたソースコード９０５であるとする。なお、図７では、ソースコードの一部を抜粋して示している。前述のように、Ｖｅｒｉｌｏｇでは、「//」から改行コードまでが、コメントを表す。また、「/*」から「*/」までが、コメントを表す。また、「// synopsys」や「// synthesis」といったディレクティブ記述の文字列が、所定条件として定められている。
【００７６】
このとき、ステップＳ２１において、コメント情報削除部２１は、ソースコード９０５において太字で示したコメント情報のうち、所定条件として定められたディレクトリ記述として、破線の矩形で囲まれた箇所を検出する。
【００７７】
そして、ステップＳ２２において、コメント情報削除部２１は、ソースコード９０５から、ステップＳ２１で検出した箇所以外のコメント情報を削除する。
【００７８】
具体的には、ここでは、コメント情報削除部２１は、ソースコード９０５におけるディレクティブ記述において、コメントの開始を表す文字列「//」を一時的変換文字列「##」に置き換える。この時点で、ソースコード９０５は、図８に示すようにテンポラリなソースコード９０６となる。ソースコード９０６において、破線の楕円で囲まれた箇所が一時的変換文字列に変換された箇所である。
【００７９】
次に、コメント情報削除部２１は、ソースコード９０６の先頭から、コメントの開始を表す「//」を検索していき、「//」を検出する度、以降改行までを削除して次の行から「//」を検索することを続ける。
【００８０】
次に、コメント情報削除部２１は、ソースコードから、コメントの開始を表す「/*」を検索し、「/*」を検出すると、その行に「*/」が含まれていれば、その行を削除して次の行から「/*」の検索を続ける。また、コメント情報削除部２１は、ソースコードから、「/*」を検出したとき、その行に「*/」が含まれていなければ、次の行以降で「*/」を検索し、先に検出した「/*」以降で初めて検出した「*/」までを削除する。そして、コメント情報削除部２１は、その次の行から「/*」の検索を続ける。
【００８１】
これにより、「//」から改行まで記述されたコメント情報と、「/*」から「*/」まで記述されたコメント情報とが削除される。この時点で、ソースコード９０６は、図９に示すテンポラリなソースコード９０７となる。
【００８２】
最後に、コメント情報削除部２１は、ソースコード９０７において、一時的変換文字列「##」を、コメントの開始を表す文字列「//」に戻す変換を行えばよい。その結果、図１０に示すように、コメント情報が削除されたソースコード９０８が生成される。なお、ソースコード９０８において、破線の楕円で囲まれた箇所が一時的変換文字列から元の文字列に変換された箇所である。
【００８３】
コメント情報削除部２１は、このようにして生成したソースコード９０８を、元のソースコードとは異なる名称のファイルとしてメモリ１００２に保存する。
【００８４】
また、２つ目の具体例では、対象のソースコードが、図１１に示すようにＶＨＤＬで記述されたソースコード９０９であるとする。なお、図１１では、ソースコードの一部を抜粋して示している。この場合、前述のように、ＶＨＤＬでは、「--」から改行コードまでが、コメントを表す。また、「/*」から「*/」までが、コメントを表す。
【００８５】
ここで、ソースコード９０９には、ディレクティブ記述は含まれていない。
【００８６】
このため、ステップＳ２１において、コメント情報削除部２１は、コメント情報のうち所定条件として定められたディレクティブ記述を検出しない。
【００８７】
そして、ステップＳ２２において、コメント情報削除部２１は、ソースコード９０９から、コメント情報を削除する。
【００８８】
具体的には、コメント情報削除部２１は、ソースコード９０９の先頭から、コメントの開始を表す「--」を検索していき、「--」を検出する度、以降改行までを削除して次の行から「--」を検索することを続ける。
【００８９】
次に、コメント情報削除部２１は、ソースコードから、コメントの開始を表す「/*」を検索するが、ソースコード９０９には、「/*」が含まれていないため、検索を終了する。
【００９０】
これにより、「--」から改行まで記述されたコメント情報が削除される。その結果、図１２に示すように、コメント情報が削除されたソースコード９１０が生成される。
【００９１】
以上で、コメント情報削除動作の詳細な説明を終了する。
【００９２】
次に、ステップＳ３における本実施の形態での難読化対象キーワード抽出動作の詳細を図１３に示す。
【００９３】
図１３において、まず、難読化対象キーワード抽出部２２は、コメント情報が削除されたソースコードについて、記述スタイルを所定のスタイルに整形する（ステップＳ３１）。
【００９４】
例えば、前述のように、難読化対象キーワード抽出部２２は、ソースコードにおける改行タイミングの調整を行う。
【００９５】
次に、難読化対象キーワード抽出部２２は、整形したソースコードにおいて、所定の構成要素を表す文字列を難読化対象のキーワードとして検出する（ステップＳ３２）。
【００９６】
次に、難読化対象キーワード抽出部２２は、ステップＳ３２で検出したキーワードの一覧を表す難読化リストを生成する（ステップＳ３３）。
【００９７】
例えば、前述のように、難読化対象キーワード抽出部２２は、検出したキーワードを文字の昇順または降順に並べ替えることで重複を削除して、難読化リストを生成してもよい。
【００９８】
以上で、難読化装置２は、難読化対象キーワード抽出動作を終了する。
【００９９】
ここで、難読化対象キーワード抽出動作を具体例で示す。
【０１００】
ここでは、コメント情報が削除されたソースコードとして、図１２に示したソースコード９１０が生成されているとする。
【０１０１】
まず、ステップＳ３１において、難読化対象キーワード抽出部２２は、ソースコード９１０に対して、改行コードの削除を行う。これにより、どのような記述スタイルのソースコードでも、全て１行のファイルに一旦加工される。ここでは、ソースコード９１０から改行コードが削除され、図１４に示すテンポラリなソースコード９１１が生成される。そして、難読化対象キーワード抽出部２２は、１行に加工されたソースコード９１１に対して、「；」文字の直後に改行コードを再挿入する。なお、ハードウェア記述言語において「；」は、処理センテンスの区切りを指している。これにより、図１５に示すように、整形されたソースコード９１２が生成される。このように、難読化対象キーワード抽出部２２は、一旦改行コードを削除後、処理センテンス単位に改行コードを再挿入することで、元のソースコードの記述スタイルに関わらず、一行に一処理を含む記述スタイルのソースコードを生成する。
【０１０２】
そして、ステップＳ３２において、難読化対象キーワード抽出部２２は、図１５に示したソースコード９１２から、ＶＨＤＬにおいて難読化対象として定められた構成要素を抽出する。ここでは、難読化対象として端子名、内部信号名、モジュール名、インスタンス名、ラベル名、内部変数名等の構成要素が定められているとする。
【０１０３】
図１６に、ＶＨＤＬにおいて難読化対象として定められた構成要素を抽出するための規則の一例として、抽出規則１〜６を示す。抽出規則１〜６は、難読化対象として定められた構成要素の直前または直後に出現する文字列を検索することにより該当する構成要素を表す文字列を抽出する規則である。このような規則を用いることにより、難読化対象キーワード抽出部２２は、図１７に示すように、太字で示した文字列を、難読化対象のキーワードとして抽出する。なお、図１７において斜体で示した文字列は、抽出規則１〜６において定められた、該当する構成要素の直前または直後に出現する文字列を表している。この例のように、難読化対象キーワード抽出部２２は、ソースコードの記述言語に応じてあらかじめ定められた難読化対象の構成要素について、その構成要素の前または後の文字列を用いた抽出規則を記憶しておけばよい。そして、難読化対象キーワード抽出部２２は、ソースコードにおいて、そのような抽出規則を用いて、難読化対象の構成要素を表す文字列を抽出すればよい。
【０１０４】
そして、ステップＳ３３において、難読化対象キーワード抽出部２２は、抽出したキーワードを並べて、図１８に示す難読化リスト９１３を生成する。なお、図１８では、図１７に示した太字のキーワードの他、「ｅｎ」、「ａｃｋ」および「ｎ＿１」の各キーワードが、難読化リスト９１３に加えられている。これらのキーワードは、ソースコード９１２の図示されていない部分や、同時に取得された他のＶＨＤＬのソースコードから抽出されたものとする。
【０１０５】
以上で、難読化対象キーワード抽出動作の詳細な説明を終了する。
【０１０６】
次に、ステップＳ４〜Ｓ５における本実施の形態での難読化リスト調整動作の詳細を図１９に示す。
【０１０７】
図１９において、まず、難読化リスト調整部２３は、難読化リストにおいて、キーワードを文字列長の降順に並べ替える（ステップＳ４１）。
【０１０８】
次に、難読化リスト調整部２３は、文字列長が閾値未満のキーワードを難読化リストから除外する（ステップＳ５１）。
【０１０９】
次に、難読化リスト調整部２３は、除外リストに含まれるキーワードを難読化リストから除外する（ステップＳ５２）。
【０１１０】
次に、難読化リスト調整部２３は、難読化リストから、予約語の部分文字列となっているキーワードを検出する（ステップＳ５３）。
【０１１１】
次に、難読化リスト調整部２３は、ステップＳ５３の検出結果に基づいて、難読化リストまたはソースコードを修正する（ステップＳ５４）。
【０１１２】
例えば、前述のように、難読化リスト調整部２３は、検出したキーワードおよび予約語を、警告情報として出力してもよい。そして、この場合、難読化リスト調整部２３は、警告情報の出力後、修正された難読化リストまたはソースコードを取得してもよい。
【０１１３】
以上で、難読化装置２は、難読化リスト調整動作を終了する。
【０１１４】
ここで、難読化リスト調整動作を具体例で示す。
【０１１５】
ここでは、図１７に示したソースコード９１２から、図１８に示した難読化リスト９１３が抽出されているとする。
【０１１６】
この場合、ステップＳ４１において、難読化リスト調整部２３は、難読化リスト９１３におけるキーワードを文字列長の降順に並べ替える。これにより、難読化リスト９１３は、図１８に示す通り難読化リスト９１４となる。
【０１１７】
そして、ステップＳ５１において、文字列長の閾値は３であるものとする。この場合、難読化リスト調整部２３は、難読化リスト９１４から、文字列長が３未満（１または２）のキーワード「ｅｎ」を除外する。これにより、難読化リスト９１４は、図１８に示す通り難読化リスト９１５となる。
【０１１８】
次に、ステップＳ５２において、除外リストには、「ｎ＿１」が含まれていたとする。この場合、難読化リスト調整部２３は、難読化リスト９１５から、キーワード「ｎ＿１」を除外する。これにより、難読化リスト９１５は、図１８に示す通り難読化リスト９１６となる。
【０１１９】
次に、ステップＳ５３において、難読化リスト調整部２３は、ＶＨＤＬの予約語テーブルを参照する。ここでは、図２０に示すような各記述言語の予約語テーブルが、メモリ１００２にあらかじめ格納されているものとする。そして、難読化リスト調整部２３は、難読化リスト９１６から、キーワード「ａｃｋ」を、ＶＨＤＬの予約語「ｐａｃｋａｇｅ」の部分文字列として検出する。
【０１２０】
次に、ステップＳ５４において、難読化リスト調整部２３は、“キーワード「ａｃｋ」が予約語「ｐａｃｋａｇｅ」の部分文字列である”という内容の警告を出力する。ここで、警告に伴い、利用者は、警告された予約語が対象のソースコードで使用されているか否かを確認し、使用されていれば、難読化リスト９１６から除外する編集を行う。ここでは、ソースコード９１２の図示されていない部分または同時に取得された他のＶＨＤＬのソースコードにおいて、予約語「ｐａｃｋａｇｅ」が使用されていたものとする。その結果、利用者は、難読化リスト９１６を編集し、「ａｃｋ」を除外したとする。その後、難読化リスト調整部２３は、図１８に示す通り、「ａｃｋ」が除外された難読化リスト９１７を取得する。
【０１２１】
以上で、難読化リスト調整動作の詳細な説明を終了する。
【０１２２】
次に、ステップＳ６における本実施の形態での難読化実行動作の詳細を図２１に示す。
【０１２３】
図２１において、難読化実行部２４は、難読化リストに含まれるキーワードに対して、難無意味な文字列を対応付けて、難読化リストに含まれる順に記述した変換テーブルを生成する（ステップＳ６１）。
【０１２４】
次に、難読化実行部２４は、変換テーブルに基づいて、変換テーブルに記述された順にキーワードを無意味な文字列に変換する難読化変換スクリプトを生成する（ステップＳ６２）。
【０１２５】
次に、難読化実行部２４は、コメント情報が削除された各ソースコードに対して、難読化変換スクリプトを実行する(ステップＳ６３)。
【０１２６】
以上で、難読化装置２は、難読化実行動作を終了する。
【０１２７】
ここで、難読化実行動作を具体例で示す。
【０１２８】
例えば、ステップＳ６１において、難読化実行部２４は、図１８に示した難読化リスト９１７から、図２２に示す変換テーブル９１８を生成する。ここでは、変換後の無意味な文字列として「KEYWORD_[連番]」が採用されている。なお、[連番]は、変換テーブルに記載される順序に基づく数値を表す。
【０１２９】
次に、ステップＳ６２において、難読化実行部２４は、変換テーブル９１８に基づいて、図２３に示す難読化変換スクリプト９１９を生成する。ここでは、難読化変換スクリプトの記述言語としては、Ｃ  Ｓｈｅｌｌが採用されている。ただし、難読化変換スクリプト９１９は、処理対象のテキストファイルにおいて、変換テーブル９１８に記載された順に、キーワードを無意味な文字列に全て置換する処理を実行する内容であれば、どのような記述言語で記載されたものであってもよい。
【０１３０】
次に、ステップＳ６３において、難読化実行部２４は、図１７に示したＶＨＤＬのソースコード９１２に対して、図２３に示した難読化変換スクリプト９１９を実行する。これにより、図２４に示すように、難読化後のソースコード９２０が生成される。
【０１３１】
以上で、難読化実行動作の詳細な説明を終了する。
【０１３２】
次に、本発明の第２の実施の形態の効果について述べる。
【０１３３】
本発明の第２の実施の形態としての難読化装置は、元のソースコードから秘密情報をさらに適切に削除しながら、元のソースコードに対して設計内容が等価なソースコードを自動生成することができる。
【０１３４】
その理由について説明する。本実施の形態では、コメント情報削除部が、対象のソースコードにおけるコメント情報のうち、所定の条件を満たすもの以外を削除するからである。これにより、本実施の形態は、コメントの形式で記載されるディレクティブ記述等の有用な情報を削除することなく、秘密情報を含み得る他のコメント情報を削除できる。
【０１３５】
また、本実施の形態では、難読化対象キーワード抽出部が、ソースコードを所定の記述スタイルに整形してから、記述言語の所定の構成要素を表す文字列を、難読化対象となるキーワードとして抽出するからである。これにより、本実施の形態は、対象のソースコードがどのような記述スタイルであっても、秘密情報を含み得る構成要素を表す文字列を確実に抽出して難読化リストを生成できる。
【０１３６】
また、本実施の形態では、難読化リスト調整部が、文字列長が閾値未満のキーワードを難読化リストから除外するからである。これにより、本実施の形態は、記述言語の予約語に含まれる確率の高いキーワードを除外するので、難読化後のソースコードでの構文エラーの発生を防止する。なお、本実施の形態は、このように文字列長が充分に短いキーワードを除外しても、そのようなキーワードは秘密情報を含むことが難しいため、難読化の結果に影響を与えない。
【０１３７】
また、本実施の形態では、難読化リスト調整部が、除外リストに含まれるキーワードを難読化リストから除外するからである。これにより、本実施の形態は、所定の構成要素を表す文字列を一律に変換してしまうことがないため、対象案件毎に柔軟な対応が可能となる。
【０１３８】
また、本実施の形態では、難読化リスト調整部が、難読化リストに含まれるキーワードのうち記述言語の予約語の部分文字列となっているキーワードを検出する。そして、難読化リスト調整部が、検出結果に基づいて難読化リストまたはソースコードを修正するからである。これにより、本実施の形態は、難読化リストに、ソースコードで用いられている予約語の部分文字列となっているキーワードを含むことがなく、難読化後のソースコードでの構文エラーの発生を防止する。
【０１３９】
上述してきたように、本実施の形態は、ＬＳＩ開発時の不具合の解析をデバイスベンダやＥＤＡベンダに依頼する際に支給するデザインを準備するための工数と期間を圧倒的に短縮する。しかも、本実施の形態により自動的に難読化されたソースコードは、難読化リスト調整部によって各種調整がなされた難読化リストに基づいて生成されているため、構文エラーを起こす可能性および秘密情報が残っている可能性が少ない。
【０１４０】
また、本実施の形態は、難読化ソースコードを自動的に生成することで、手作業で修正していた際に発生していた変更ミスやそれに費やすイタレーション等の発生を減らし、難読化後のソースコードの品質自体を向上させる。その結果、本実施の形態は、難読化後のソースコードを用いて通常のＬＳＩ設計フローで開発を進めることを可能とする。
【０１４１】
また、本実施の形態は、テキストベースでの変換アルゴリズムを採用しているため、プログラミング言語やアプリケーションデータベースに依存することのない実装が可能であり、汎用性が非常に高い。
【０１４２】
なお、本実施の形態において、難読化リスト調整部が、難読化リストにおいて予約語の部分文字列となっているキーワードを検出すると、検出したキーワードおよび予約語を警告情報として出力する例について説明した。これにより、難読化リスト調整部は、警告情報に対応して入力される情報に基づいて、難読化リストまたはソースコードを修正するものとして説明した。これにより、本実施の形態は、対象のソースコードにおいて、検出したキーワードを含む予約語が使用されているか否かを解析していない。本実施の形態は、解析しないことにより、解析にかかるコストを節約している。ただし、これに限らず、難読化リスト調整部は、対象のソースコード内で、検出したキーワードを含む予約語が使用されているか否かを解析してもよい。その場合、難読化リスト調整部は、ソースコード内で使用されている予約語およびその部分文字列となっているキーワードを、警告情報として出力してもよい。あるいは、この場合、難読化リスト調整部は、ソースコード内で使用されている予約語およびその部分文字列となっているキーワードを、難読化リストから削除する処理を行ってもよい。
【０１４３】
また、本実施の形態において、難読化リスト調整部は、警告情報の出力に限らず、その他の手法により、難読化リストまたはソースコードを修正してもよい。例えば、難読化リスト調整部は、検出したキーワードおよび予約語を、それぞれを除外するか否かを選択入力可能に出力してもよい。そして、難読化リスト調整部は、入力される選択情報が除外することを示す場合に、難読化リストから該当するキーワードを除外してもよい。いずれにしても、難読化リスト調整部は、難読化リストに、対象のソースコードで使用されている予約語の部分文字列となっているキーワードを含まないように、難読化リストまたはソースコードの修正を行えばよい。
【０１４４】
また、本実施の形態において、コメント情報削除部が、コメント情報であっても削除しない情報として、合成ツールによって解釈されるディレクティブ記述を例として説明した。これに限らず、コメント情報削除部は、コメント情報であっても削除しないことが望ましい他の有用な情報を削除除外対象としてもよい。
【０１４５】
また、本実施の形態において、難読化対象キーワード抽出部が、ソースコードの記述スタイルを所定のスタイルに整形する処理として、改行タイミングを統一する例について説明した。これに限らず、難読化対象キーワード抽出部は、所定の構成要素を表す文字列を確実に抽出するための他の整形を行ってもよい。
【０１４６】
また、上述した本発明の各実施の形態において、難読化リストおよび難読化変換スクリプトが、記述言語毎に作成される例について説明した。さらに、各実施の形態において、難読化リストおよび難読化変換スクリプトは、同一の記述言語のソースコード群のうち指定されたソースコード群毎に生成されてもよい。
【０１４７】
また、上述した本発明の各実施の形態において、ハードウェア記述言語で記述されたソースコードを対象とする例を中心に説明した。これに限らず、各実施の形態は、ソフトウェアを実行するプログラムのソースコードを難読化する場合にも適用可能である。
【０１４８】
また、上述した本発明の各実施の形態において、難読化装置の各機能ブロックが、記憶装置またはＲＯＭに記憶されたコンピュータ・プログラムを実行するＣＰＵによって実現される例を中心に説明した。これに限らず、各機能ブロックの一部、全部、または、それらの組み合わせが専用のハードウェアにより実現されていてもよい。
【０１４９】
また、上述した本発明の各実施の形態において、難読化装置の機能ブロックは、複数の装置に分散されて実現されてもよい。
【０１５０】
また、上述した本発明の各実施の形態において、各フローチャートを参照して説明した難読化装置の動作を、本発明のコンピュータ・プログラムとしてコンピュータの記憶装置（記憶媒体）に格納しておく。そして、係るコンピュータ・プログラムを当該ＣＰＵが読み出して実行するようにしてもよい。そして、このような場合において、本発明は、係るコンピュータ・プログラムのコードあるいは記憶媒体によって構成される。
【０１５１】
また、上述した各実施の形態は、適宜組み合わせて実施されることが可能である。
【０１５２】
また、本発明は、上述した各実施の形態に限定されず、様々な態様で実施されることが可能である。
【産業上の利用可能性】
【０１５３】
本発明は、元のソースコードから秘密情報を削除した等価なソースコードを、より適切に自動生成する技術を提供することができ、ＬＳＩ開発時のＲＴＬ設計フローにおいてデザインを表すソースコードを難読化する装置として好適である。また、本発明は、ソフトウェアのソースコードを難読化する装置としても好適である。
【符号の説明】
【０１５４】
１、２    難読化装置
１１、２１    コメント情報削除部
１２、２２    難読化対象キーワード抽出部
１３、２３    難読化リスト調整部
１４、２４    難読化実行部
１００１  ＣＰＵ
１００２  メモリ
１００３  出力装置
１００４  入力装置
【図１】
0006578841.tif 000002
【図２】
0006578841.tif 000003
【図３】
0006578841.tif 000004
【図４】
0006578841.tif 000005
【図５】
0006578841.tif 000006
【図６】
0006578841.tif 000007
【図７】
0006578841.tif 000008
【図８】
0006578841.tif 000009
【図９】
0006578841.tif 000010
【図１０】
0006578841.tif 000011
【図１１】
0006578841.tif 000012
【図１２】
0006578841.tif 000013
【図１３】
0006578841.tif 000014
【図１４】
0006578841.tif 000015
【図１５】
0006578841.tif 000016
【図１６】
0006578841.tif 000017
【図１７】
0006578841.tif 000018
【図１８】
0006578841.tif 000019
【図１９】
0006578841.tif 000020
【図２０】
0006578841.tif 000021
【図２１】
0006578841.tif 000022
【図２２】
0006578841.tif 000023
【図２３】
0006578841.tif 000024
【図２４】
0006578841.tif 000025