【事件の表示】
　特願２００２−　８２９３１「ソースプログラム変換方法及び装置並びにソース変換プログラム」拒絶査定不服審判事件〔平成１５年１０月　２日出願公開、特開２００３−２８０７５４〕について、次のとおり審決する。
【結　論】
　本件審判の請求は、成り立たない。
【理　由】
１．手続の経緯と本願発明
　本願は、平成１４年３月２５日の出願であって、平成１７年１０月１４日付けで拒絶理由通知がなされ、同年１２月１３日付けで手続補正がなされたが、平成１８年１０月１０日付けで拒絶査定がなされ、これに対し、同年１１月１６日に拒絶査定に対する審判請求がなされたものである。
　
　そして、その請求項１に係る発明(以下「本願発明」という。)は、平成１７年１２月１３日付け手続補正書により補正された特許請求の範囲の請求項１に記載された次のとおりのものと認める。 
「プログラム変換装置の第１の手段が、主プログラムのソースコードに含まれる定数データの初期化部を、可逆な変換処理によって解読困難な状態に変換した代替定数データの初期化部に置き換え、前記プログラム変換装置の第２の手段が、前記定数データが参照される前の箇所に前記代替定数データから元の定数データを主記憶上で復元する逆変換処理のソースを挿入するソースプログラム変換方法。」 
　 
　 
２．引用文献
　原査定の拒絶の理由に引用された、本願出願前の平成１１年８月３日に頒布された刊行物である、特表平１１−５０９０２３号公報(以下「引用文献」という。)には、図面とともに、以下の事項が記載されている。（下線は、参考のため、当審において付したもの。以下同様。）
　
(Ａ)「16．相応の権限がある場合にのみコンピュータで使用されるソフトウェア、特に無償頒布を意図したソフトウェアの作成のための装置であって、この装置が、
　−　
前記ソフトウェアの少なくとも一部の暗号化を第一のアルゴリズムと第一のキーに従って実行する暗号手段
　−　前記コンピュータに接続するよう適合された外部ユニットからなり、この外部ユニットが少なくとも、それ自体のプロセッサと、第二のアルゴリズム及びキーを格納するためのコンピュータ読み取り可能な記憶媒体とを有し、前記第二のアルゴリズム及びキーに従ってソフトウェアの暗号化された部分の解読を実行するよう配置されており、
　当該装置が、第二のアルゴリズム（g2）による前記解読に用いることを意図した前記第二のアルゴリズム（g2）及び第二のキー（k2）をもたらす発生手段をさらに含み、この第二のキーが第一のアルゴリズム（g1）によるソフトウェアの前記部分の暗号化の実行において前記暗号手段により用いられた第一のキー（k1）と異なることを特徴とする装置。」（第７頁第１６行〜第８頁第３行）
　
(Ｂ)「本発明は、著作権保有者の許可のない使用に対する、ソフトウェア、特に無償で配布されるアプリケーションソフトウェアの保護に関する。」（第１２頁第４〜５行）
　
(Ｃ)「図８は、図４及び５に示したタイプの
暗号化プロセスの一例
ソースコードにおいて、幾つかのパラメータが選択され、暗号化関数ｇを用いて暗号化される。例えば、保護されていないソースコードのあるコマンド中に存在する式、ｘ: ＝ｙ＋10は、次のように表すことができる。
　　　
Ｃ: ＝decrypt(ｇ(10)＋t)
　　　
ｘ: ＝ｙ＋（Ｃ‐Ｔ）
式中、g(10)は暗号化パラメータであり、Ｔは変数であり、そのランダム値はこの場合、スマートカードからフェッチされている。
ｘの正しい値を得るためには、保護されたプログラムは、10＋Ｔに等しいＣの値に「到達」しなければならない。
　
(Ｄ)「暗号化関数ｇと解読関数ｇ-1が、対称的ではない公的キー暗号システムを表すことが重要であることに注意しなければならない。……（中略）……
　関数ｆ,ｆ-1,ｇ,ｇ-1は、可変である（即ち、値を変えることなしに交換可能である）ことが必要とされる。ここではこのことは、それらが次の性質を有していなければならないことを示している。    　
　　　ｆ-1(ｇ-1(ｆ(ｇ(ｘ))))＝ｘ   　
　このようにして保護されたプログラムをコンピュータで使用する際、このプログラムの実行は、通常の通りに開始される(図７)。
スマートカードとの通信を介して、変数Ｔの値と、関数ｆ又はｆ
-1
のためのキーが、ソフトウェアに入力される。
　
(Ｅ)「本発明によるこの種の
暗号化−解読構成
　……（中略）……
−　ソースコードレベルにおける暗号化により、この構成をオペレーティングシステムに依存しないものとする。
コマンドファイルの如きファイルのみの、小部分、又は断片を暗号化することにより、何とかしてこうした部分を攻撃しようとする目的で、暗号化されたソフトウェアのこれらの部分を識別することは困難になる。
　
(Ｆ)「図４及び５は本発明によりソースコードレベルの暗号化がどのようにして実行されるかを概略的に示し、
　……（中略）……
　図８は図４及び５に示したタイプの暗号化プロセスの一例を示し」（第１８頁第２１〜２７行）
　
(Ｇ)そして、Fig.８には、ソースコードを暗号化して暗号化されたソースコードを生成すること、該暗号化されたソースコードに対してコンパイル及びリンクの処理を実行することで保護されたソフトウェアが生成されること、が図示されるとともに、
　前記暗号化されたソースコード中のコードとして、
「Ｃ＝ＤＥＣＲＹＰＴ(ｇ(10)＋Ｔ)   　
　ｘ：＝ｙ＋（Ｃ−Ｔ）」の記載がある。
　
　
　(Ａ)の「ソフトウェアの作成のための装置であって、この装置が、
　−　前記ソフトウェアの少なくとも一部の暗号化を第一のアルゴリズムと第一のキーに従って実行する暗号手段」及び「前記暗号手段が、第一のアルゴリズム（g1）によるソフトウェアの前記部分の前記暗号化を、コンパイル及びリンクに先立って…(中略)…それぞれのソフトウェアのソースコードそれ自体に対して実行する」の記載、(Ｇ)の図示態様から、引用文献には、
　保護されたソフトウェアの作成のための装置が暗号手段を備えること、及び
　前記暗号手段がソフトウェアのソースコードを暗号化すること、
が記載されている。
　
　(Ｂ)の「本発明は…（中略）…アプリケーションソフトウェアの保護に関する」、(Ｃ)の「ソースコードにおいて、幾つかのパラメータが選択され、暗号化関数ｇを用いて暗号化される。例えば、保護されていないソースコードのあるコマンド中に存在する式、ｘ: ＝ｙ＋10は、次のように表すことができる。   　
　　　Ｃ: ＝decrypt(ｇ(10)＋t)  　
　　　ｘ: ＝ｙ＋（Ｃ‐Ｔ）   　
式中、g(10)は暗号化パラメータであり、Ｔは変数であり、そのランダム値はこの場合、スマートカードからフェッチされている。」の記載から、引用文献において、暗号手段はアプリケーションソフトウェアのソースコードを暗号化するものである。
　そして、(Ｃ)の上記記載、(Ｅ)の「ソースコードレベルにおける暗号化により、この構成をオペレーティングシステムに依存しないものとする。コマンドファイルの如きファイルのみの、小部分、又は断片を暗号化することにより、何とかしてこうした部分を攻撃しようとする目的で、暗号化されたソフトウェアのこれらの部分を識別することは困難になる。」、(Ｇ)の
「Ｃ＝ＤＥＣＲＹＰＴ(ｇ(10)＋Ｔ)   　
　ｘ：＝ｙ＋（Ｃ−Ｔ）」の各記載から、前記暗号手段は、ソースコードに含まれていた定数データ“10”を暗号化するために、定数データ“10”の暗号化パラメータ“ｇ(10)”に変数Ｔを加える処理を行うものである。ここで、前記変数Ｔは、(Ｃ)に「Ｔは変数であり、そのランダム値はこの場合、スマートカードからフェッチされている。」と、(Ｄ)に「スマートカードとの通信を介して、変数Ｔの値と、関数ｆ又はｆ-1のためのキーが、ソフトウェアに入力される。」と記載されるように、外部のスマートカードからはランダム値としてソースコードに入力されるが、該入力された後の、(Ｃ)に記載の「暗号化プロセス」の過程においては、その値は変化しないから、静的な変数である。
　そして、引用文献において、暗号化パラメータ“ｇ(10)”に前記変数Ｔを加えることで得られたデータは、前記(Ｅ)の「ソースコードレベルにおける暗号化により…(中略)…小部分、又は断片を暗号化することにより…(中略)…識別することは困難に」されたデータであり、この暗号化により、前記ソースコードに含まれていた定数データの記述“10”は、識別困難な状態に変換されたデータの記述“ｇ(10)＋ｔ”に置き換えられると認められる。
　また、前記暗号化パラメータを生成する(Ｃ)の暗号化関数ｇは、(Ｄ)に記載されるように対応する解読関数を有しており、変数Ｔを加える加算処理は可逆な変換処理であるから、定数データ“10”の暗号化パラメータ“ｇ(10)”に変数Ｔを加えるという処理は、可逆な変換処理である。
　してみれば、引用文献には、
　前記暗号手段が、アプリケーションソフトウェアのソースコードに含まれる定数データの記述“10”を、該定数データの暗号化パラメータ“ｇ(10)”に静的な変数Ｔを加えるという可逆な変換処理によって識別困難な状態に変換したデータの記述“ｇ(10)＋ｔ”に置き換えること、
が記載されている。
　
　(Ｇ)の「暗号化されたソースコード」中のコードとしての、
「Ｃ＝ＤＥＣＲＹＰＴ(ｇ(10)＋Ｔ)   　
　ｘ：＝ｙ＋（Ｃ−Ｔ）」の記載、及び、(Ｃ)の「保護されていないソースコードのあるコマンド中に存在する式、ｘ：＝ｙ＋10は、次のように表すことができる。
　　　Ｃ：＝decrypt(ｇ(10)＋t)    　
　　　ｘ：＝ｙ＋（Ｃ‐Ｔ）   　
式中、g(10)は暗号化パラメータであり、Ｔは変数であり、そのランダム値はこの場合、スマートカードからフェッチされている。
　ｘの正しい値を得るためには、保護されたプログラムは、10＋Ｔに等しいＣの値に「到達」しなければならない。」の記載において、“Ｃ：＝decrypt(ｇ(10)＋t)”の行は、前記識別困難な状態に変換されたデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”に前記変数Ｔを加えたデータ“10＋Ｔ”を解読する処理を表す関数の記述であると認められる。
　前記“Ｃ：＝decrypt(ｇ(10)＋t)”の行は、項“(Ｃ−Ｔ)”を参照する「ｘ：＝ｙ＋（Ｃ‐Ｔ）」の行の前に挿入されている。そして、Ｃは「10＋Ｔに等しい」から、前記Ｃから前記変数Ｔを減じた値は、当然、“10”である。したがって、Ｃ−Ｔ＝10の演算を意味する項“(Ｃ−Ｔ)”は、前記前の行の関数によって解読されたデータ“10＋Ｔ”から前記変数Ｔを減じて元の定数データ“10”を復元する項であると認められる。
　そして、(Ｄ)に記載される「暗号化プロセス」は、前記暗号手段が実行するプロセスであることは明らかである。
　してみれば、引用文献には、
　前記暗号手段が、前記定数データを復元する項“(Ｃ−Ｔ)”が参照される前の行に、識別困難な状態に変換したデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”に静的な変数Ｔを加えたデータ“10＋Ｔ”を解読する処理を表す関数の記述“Ｃ：＝decrypt(ｇ(10)＋t)”を挿入し、前記定数データを復元する項“(Ｃ−Ｔ)”は前記解読されたデータ“10＋Ｔ”から前記変数Ｔを減じて前記定数データ“10”を復元する項であること、
が記載されている。
　
　
　以上から、引用文献には、次の発明(以下「引用発明」という。)が記載されているものと認められる。
　
　保護されたソフトウェアの作成のための装置の暗号手段が、アプリケーションソフトウェアのソースコードに含まれる定数データの記述“10”を、該定数データの暗号化パラメータ“ｇ(10)”に静的な変数Ｔを加えるという可逆な変換処理によって識別困難な状態に変換したデータの記述“ｇ(10)＋ｔ”に置き換え、
　前記暗号手段が、前記定数データを復元する項“(Ｃ−Ｔ)”が参照される前の行に、前記識別困難な状態に変換したデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”に前記変数Ｔを加えたデータ“10＋Ｔ”を解読する処理を表す関数の記述“Ｃ：＝decrypt(ｇ(10)＋t)”を挿入し、前記定数データを復元する項“(Ｃ−Ｔ)”は前記解読されたデータ“10＋Ｔ”から前記変数Ｔを減じて前記定数データ“10”を復元する項である、
ソースコードを暗号化する方法。
　
　
３．対比
　本願発明と引用発明とを比較する。
　
　本願発明の「主プログラム」は、「定数データ」を含む「ソースコード」で作成されたプログラムである。これに対して、引用発明の「アプリケーションソフトウェア」は、「ソースコード」で作成されたプログラムであり、該ソースコードは「定数データ“10”」を含んでいる。したがって、引用発明の「アプリケーションソフトウェア」は本願発明の「主プログラム」に相当し、引用発明の「アプリケーションソフトウェアのソースコード」は本願発明の「主プログラムのソースコード」に相当する。
　
　引用発明の「ソースコードを暗号化する方法」により、アプリケーションソフトウェアのソースコードが暗号化されるが、これは、アプリケーションソフトウェアのソースコードを暗号化されたソースコードに変換することを意味するものである。よって、引用発明の「ソースコードを暗号化する方法」は、本願発明の「ソースプログラム変換方法」に相当する。
　そして、引用発明における、前記「ソースコードを暗号化する方法」を実行する「暗号手段」を備える「保護されたソフトウェアの作成のための装置」は、本願発明の「プログラム変換装置」に相当する。
　
　引用発明における「識別困難な状態」は、本願発明における「解読困難な状態」に相当する。
　また、引用発明における「識別困難な状態に変換したデータ」は、暗号化されたソースコードにおいて、定数データを代替するものであるから、本願発明の「代替定数データ」に相当する。
　したがって、引用発明において「アプリケーションソフトウェアのソースコードに含まれる定数データの記述“10”を、該定数データの暗号化パラメータ“ｇ(10)”に静的な変数Ｔを加えるという可逆な変換処理によって識別困難な状態に変換したデータの記述“ｇ(10)＋ｔ”に置き換え」ることと、本願発明の「主プログラムのソースコードに含まれる定数データの初期化部を、可逆な変換処理によって解読困難な状態に変換した代替定数データの初期化部に置き換え」ることとは、主プログラムのソースコードに含まれる定数データに代えて、可逆な変換処理によって解読困難な状態に変換した代替定数データを前記ソースコードにおいて使用する点で一致する。
　
　引用発明における「定数データを復元する項“(Ｃ−Ｔ)”が参照される」という記載における「定数データを復元する項“(Ｃ−Ｔ)”」は、「解読されたデータ“10＋Ｔ”から前記変数Ｔを減じて前記定数データ“10”を復元する項」であり、該項が表すデータの値は前記定数データに等しいから、前記定数データを示すものである。そして、引用発明の前記「項」は、ソースコードにおいては“(Ｃ−Ｔ)”という文字列に他ならない。
　ところで、本願発明は、「定数データ」を「解読困難な状態」にすることを課題とするから、変換されたソースコードにおいて定数データそのものは隠蔽されているものであり、本願明細書の段落【００３１】には「配列data1[ ]が初めて参照される前の箇所に逆変換関数挿入位置マーク564が挿入されている。」と記載されている。すなわち、本願発明の「定数データが参照される」の記載は、当該定数データを示す変数の文字列が参照されることを意味している。
　したがって、引用発明の「定数データを復元する項が参照される」と本願発明の「定数データが参照される」とは、定数データを示す文字列が参照される点で、一致する。
　そして、引用発明における「前の行」は、本願発明の「前の箇所」に相当する。
　
　ところで、本願明細書の発明の詳細な説明及び図面の記載を参照すると、図３のマーク付きソースコードS1における逆変換関数挿入位置マークの位置に挿入するのが、「data1pの配列から鍵protect_key=1234567を用いて逆変換を行い、結果をdata1の配列に入れるという動作g(A1,key)を指示する」ところの「関数deprotect( )の行の記述」であることが、同明細書の段落【００３５】に記載されている。そして、同段落【００３９】に「図５の９行目に示すように変換前後の配列名と鍵をパラメータとする逆変換関数の呼出し文を生成し（ステップS510）、この文を逆変換挿入位置に挿入する」と、同段落【００４５】には「記憶部503に格納されたソースコードS2と、このソースコードS2の#include文により指定された記憶部504上のソースファイルdeprotect_func.cとから、コンパイラを用いたコンパイル動作によって、オブジェクト(実行形式)E2を生成する。こうして生成されたオブジェクトE2は、その実行時に自オブジェクト内の変換箇所を自オブジェクト自身が有する逆変換処理で元の内容に復元する機能を持つ」と記載されている。
　すなわち、本願発明における「逆変換処理のソース」とは、逆変換関数の本体の処理を記述するコードではなく、該本体の処理を記述するコードを呼び出す逆変換関数の記述を意味している。
　これに対して、引用発明において、「前記識別困難な状態に変換したデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”に前記変数Ｔを加えたデータ“10＋Ｔ”を解読する処理を表す関数の記述“Ｃ：＝decrypt(ｇ(10)＋t)”」は、次の行の「前記解読されたデータ“10＋Ｔ”から前記変数Ｔを減じて前記定数データ“10”を復元する項」である“(Ｃ−Ｔ)”により元の定数データ“10”を復元するためのものであるから、前記部分から元の定数データを復元することを目的とする関数の記述である。
　したがって、引用発明における「前記識別困難な状態に変換したデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”に前記変数Ｔを加えたデータ“10＋Ｔ”を解読する処理を表す関数の記述“Ｃ：＝decrypt(ｇ(10)＋t)”」と、本願発明における「前記代替定数データから元の定数データを主記憶上で復元する逆変換処理のソース」とは、代替定数データから元の定数データを復元することを目的とする関数の記述である点で一致する。
　
　よって、引用発明において「前記定数データを復元する項“(Ｃ−Ｔ)”が参照される前の行に、前記識別困難な状態に変換したデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”に前記変数Ｔを加えたデータ“10＋Ｔ”を解読する処理を表す関数の記述“Ｃ：＝decrypt(ｇ(10)＋t)”を挿入」することと、本願発明における「前記定数データが参照される前の箇所に前記代替定数データから元の定数データを主記憶上で復元する逆変換処理のソースを挿入する」こととは、定数データを表す文字列が参照される前の箇所に、前記代替定数データから元の定数データを復元することを目的とする関数の記述を挿入する点で、一致する。
　
　そして、本願発明において、前記「置き換え」を「プログラム変換装置の第１の手段」が行い、前記「挿入」を「プログラム変換装置の第２の手段」が行うのに対して、引用発明においては、前記「置き換え」と前記「挿入」を、保護されたソフトウェアの作成のための装置が備える「暗号手段」が行うものである。
　すなわち、両者は、前記「置き換え」と前記「挿入」をプログラム変換装置の手段が行う点で共通する。
　
　以上から、本願発明と引用発明とは、以下の点で一致し、また、以下の点で相違する。
　
（一致点）
　プログラム変換装置の手段が、主プログラムのソースコードに含まれる定数データに代えて、可逆な変換処理によって解読困難な状態に変換した代替定数データを前記ソースコードにおいて使用し、前記手段が、定数データを示す文字列が参照される前の箇所に、前記代替定数データから元の定数データを復元することを目的とする関数の記述を挿入する、ソースプログラム変換方法。
　
（相違点１）
　主プログラムのソースコードに含まれる定数データに代えて、可逆な変換処理によって解読困難な状態に変換した代替定数データを前記ソースコードにおいて使用する具体的方法が、本願発明においては「主プログラムのソースコードに含まれる定数データの初期化部を、可逆な変換処理によって解読困難な状態に変換した代替定数データの初期化部に置き換え」ることであるのに対して、引用発明においては、「アプリケーションソフトウェアのソースコードに含まれる定数データ“10”の記述を、該定数データを可逆な変換処理によって識別困難な状態に変換したデータの記述“ｇ(10)＋ｔ”に置き換え」ることである点
　
（相違点２）
　定数データを示す文字列が、本願発明においては「定数データ」であるのに対して、引用発明においては、「前記解読されたデータ“10＋Ｔ”から前記変数Ｔを減じて前記定数データ“10”を復元する項」である点
　
（相違点３）
　定数データを示す文字列が参照される前の箇所に挿入する処理を表す関数の記述が、本願発明においては「代替定数データから元の定数データを主記憶上で復元する逆変換処理のソース」であるのに対して、引用発明においては「前記識別困難な状態に変換したデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”に前記変数Ｔを加えたデータ“10＋Ｔ”を解読する処理を表す関数の記述“Ｃ：＝decrypt(ｇ(10)＋t)”」である点
　
（相違点４）
　本願発明は、プログラム変換装置の手段が、主プログラムのソースコードに含まれる定数データの初期化部を、可逆な変換処理によって解読困難な状態に変換した代替定数データの初期化部に置き換える「第１の手段」と、前記定数データが参照される前の箇所に前記代替定数データから元の定数データを主記憶上で復元する逆変換処理のソースを挿入する「第２の手段」とからなるものであるのに対して、引用発明は、置き換え及び挿入の各処理を１つの「暗号手段」が行う点
　
　
４．判断
相違点１について
　本願の出願の日前である１９９１年２月１日に頒布された刊行物である、高木聡，“はじめて学ぶプログラミング第１７回　総まとめ(１)宣言・定義と記憶クラス・結合”，Ｃ　ＭＡＧＡＺＩＮＥ，ソフトバンク株式会社，1991年02月01日，第３巻，第２号，p.１１８〜１２７には、
(ア)「今までなにげなく行っていた変数宣言について，厳密に考えてみましょう。変数宣言は，Fig.２のような書式になっています。」（第１１９頁中欄第３〜６行）
(イ)　
(ウ)「●staticの記憶クラス
　次に，staticの記憶クラスについて説明しましょう。staticの日本語訳は，静的ですね。内部変数でも記憶クラスをstaticにすると静的変数になります。静的変数はコンパイル時に固定アドレスが割り当てられます。つまり，自動変数のように関数が呼び出されるたびにスタック上に生成されては消滅するといったたぐいのものではありません。
関数呼び出しが終わったあとでも，staticの記憶クラスの内部変数は，関数呼び出しが終わった時点の値を保持しているのです。変数宣言時の初期化は，その関数が最初に呼ばれたときだけ行われます(一般的にはコンパイル時に初期値が埋め込まれます）。
と記載されている。
　
　そして、本願の出願の日前である１９９９年１１月１日に頒布された刊行物である、日下部陽一，“スーパー実践講座 Ｃプログラミング入門 static宣言”，Ｃ　ＭＡＧＡＺＩＮＥ，ソフトバンク株式会社，1996年11月01日，第８巻，第１１号，p.５４〜６１には、その第５６頁左欄第１９行〜同頁右欄第１９行に、
(エ)「もうひとつの方法は，
　　　　　　　　　　　　　　　　　　　　　　　　　　　　var5.c    
　　main()     　
　　{   　
　　　　test();  　
　　　　printf(“and then...?n”);  　
　　　　test();  　
　　}  　
　　　　test();  　
　　{
　　　　static　int　i　=　50;  　
　　　　i+　=　10;  　
　　　　printf(“i = %d?n”,i);  　
のようにする方法だ。
　
変数は関数の内部で宣言するのだが，宣言するときに“static”というキーワードを付けて宣言するのだ。このように宣言された変数は静的(static)に確保される。関数のなかのコードを実行し終わって，関数から“抜けて”もこの変数は無効にならずに保たれている。
　通常“static”を付けないで関数内で宣言された変数はauto変数(auto variables)もしくは自動変数などと呼ばれ，その関数に入ると毎回，スタック上に動的に確保され，その関数を抜けたら破棄される変数だ。つまりその関数のなかにいる間だけ記憶場所が割り付けられているといってもよい。だから，関数を抜けても値を保持していて，次回のその関数呼び出しのときにその値を使いたい場合には，staticキーワードを使って静的に確保する必要がある。
　
このvar5.cのプログラムは関数内の変数宣言時に初期化を行っている
プログラムが起動して動き始める前に５０に初期化されるだけ
　また，このことはvar4.cの“関数の外で宣言”して静的に確保した変数についても同様だ。つまり，その場合も“関数のなかでstaticキーワードを付けて”宣言した変数と同じく，
値の初期化は最初に行われるだけ
と記載されている。
　
　同様に、本願の出願の日前である２０００年１０月１日に頒布された刊行物である、多治見寿和，“プログラミング・テクニック ｇｒｅｐ(７)”，ＵＮＩＸ　ＭＡＧＡＺＩＮＥ，株式会社アスキー，2000年10月01日，第１５巻，第１０号，p.５８〜６６には、その第６４頁左欄第５行〜同頁右欄第１０行に、
（オ）「まず、関数内で使う定数に名前を付けます。
＃define NUMSTATES　　　7
＃define NUMCHARS 　　　256
＃define INITIALSTATE　 0
　ここでは、状態がいくつあるかを示すＮＵＭＳＴＡＴＥＳ、文字か何通りあるかを示すＮＵＭＣＨＡＲＳ、開始状態の番号を示すＩＮＩＴＩＡＬＳＩＡＴＥの３つを定義しています。
　
関数の先頭では、状態遷移表を表す配列を初期化しています。
int  　
check(char *s)  　
{  　
　　　static  int　　　trans[NUMSTATES] [4] = {  　
　　　　　　　{-1 ,  1 , -1 , -1},  　
　　　　　　　{-1 , -1 ,  2 ,  4},  　
　　　　　　　{-1 , -1 ,  2 ,  3},  　
　　　　　　　{-1 ,  5 ,  2 ,  4},  　
　　　　　　　{-1 ,  5 , -1 , -1},  　
　　　　　　　{-1 , -1 , -1 ,  6},  　
　　　　　　　{-1 , -1 , -1 , -1},  　
　表１がそのまま初期化する値となっているのが分かるでしょうか。
　……（中略）……
　実際に状態遷移をおこなう部分は次のように簡単です（誌面の都合上、⇒で折り返しています。以下同様）。  　
　　　　for　(state　=　INITIALSTATE; *s, s++)  {  　
　　　　　　　　state　=　trans[state] [grp⇒  　
　　　　　　　　　　　　[(unsigned char)*s]];  　
　　　　　　　　if　(state  0)  　
　　　　　　　　　　　return 0;  　
　　　　}  　
　　　　return　accept[state];  　
}」  　
と記載されている。
　
　さらに、本願の出願の日前である１９９１年２月１日に頒布された刊行物である、龍崎昌平，“part１　拡張ＣとしてのＣ＋＋”，Ｃ　ＭＡＧＡＺＩＮＥ，ソフトバンク株式会社，1991年02月01日，第３巻，第２号，p.３８〜４６には、その第４３頁に記載された「List　１４」中に、
(カ)「static　　int a[]　=　{1,2,3,4,5,-1};  　
　　　1nt　i　=　func( 10 ):  　
　　　1nt　j　=　func( “ ohshima junichi” ):  　
　　　1nt　K　=　func( a ):」  　
と記載されている。
　
　前記(ア)〜(カ)の記載から、
　プログラムのソースコードに含まれる定数データを、当該プログラムが実行されている間、その値を保持している静的な変数として宣言・初期化する前記定数データの初期化部を設けることは、プログラミング手法として常套手段である。
　
　してみれば、引用発明において、「アプリケーションソフトウェアのソースコードに含まれる定数データ」を、前記常套手段のように、初期化部を伴う静的な変数としてソースコード中に記述することは、当業者が適宜なし得たものと認められる。
　
　ところで、引用発明において、「該定数データの暗号化パラメータ“ｇ(10)”に静的な変数Ｔを加えるという可逆な変換処理によって識別困難な状態に変換したデータ」において、「暗号化パラメータ“ｇ(10)”」は定数データに暗号化関数を施したデータを示すものであるから、当然に定数を示していると認められる。してみれば、該暗号化パラメータ“ｇ(10)”に静的な変数Ｔを加えた、前記識別困難な状態に変換したデータも、引用発明の「ソースコードを暗号化する方法」を実行する間は確定している定数である。
　したがって、上記のように、「アプリケーションソフトウェアのソースコードに含まれる定数データ」を、前記常套手段のように、初期化部を伴う静的な変数としてソースコード中に記述する場合、引用発明の「ソースコードを暗号化する方法」により変換された暗号化されたソースコードにおいては、暗号化パラメータ“ｇ(10)”に変数Ｔを加えたデータを初期化部を伴う静的な変数として記述することは当然である。
　
　よって、相違点１は格別のものではない。
　
　
相違点２、３について
　本願発明は、「代替定数データから元の定数データを主記憶上で復元」する逆変換処理のソースの次の箇所において、前記復元された「定数データが参照される」が、そもそも本願発明は「定数データ」を「解読困難な状態」にすることを課題とするから、変換されたソースコードにおいては定数データはそのままの状態では記述されていないものであり、したがって、前記「３．対比」で述べた通り、前記「定数データが参照される」の記載は、当該定数データを示す変数の文字列が参照されることを意味するものである。
　
　ところで、引用発明は、「関数」によって、「識別困難な状態に変換したデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”に前記変数Ｔを加えたデータ“10＋Ｔ”を解読」し、前記関数の記述の次の行において、「前記解読されたデータ“10＋Ｔ”から前記変数Ｔを減じて前記定数データ“10”を復元する項」が参照されるものである。
　換言すれば、引用発明は、定数データの暗号化パラメータ“ｇ(10)”に静的な変数Ｔを加えるという可逆な変換処理によって識別困難な状態に変換したデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”を復元するに当たり、挿入された「関数」においては、元の定数データ“10”に前記変数Ｔを加えたデータ“10＋Ｔ”の解読という、元の定数データの「復元」に必要な処理の一部を行い、残りの前記変数Ｔを減じるという処理は参照される箇所で行うものである。
　
　そして、変数Ｔを減じるという前記残りの処理は単なる減算処理であり、これを前記解読する関数とは別の箇所で行うか、前記解読する関数中で行わせるかは、当業者が適宜選択し得る事項にすぎないものと認められる。
　すなわち、引用発明において、「前の行」において「関数」によって、「識別困難な状態に変換したデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”に前記変数Ｔを加えたデータ“10＋Ｔ”を解読」し、前記関数の記述の次の行において「前記解読されたデータ“10＋Ｔ”から前記変数Ｔを減じて前記定数データ“10”を復元する項」を参照することに代えて、前の行において関数によって、識別困難な状態に変換したデータ“ｇ(10)＋Ｔ”から、元の定数データ“10”に前記変数Ｔを加えたものを解読したデータ“10＋Ｔ”より前記変数Ｔを減じて元の定数データ“10”を復元し、前記「関数」の記述の次の行において、該復元された定数データを示す文字列を参照するように、プログラミングを変更することは、当業者が容易に想到し得たものと認められる。
　
　なお、プログラムの実行に当たっては、実行形式のオブジェクトを主記憶にロードして実行することは、コンピュータ技術においては一般である。したがって、引用発明においても、定数データを主記憶上で復元さすることは、当業者であれば当然に行う事項にすぎないものである。
　
　よって、相違点２及び３は格別のものではない。
　
相違点４について
　コンピュータ技術において、コンピュータの１つの手段に複数の機能を実現させること、及び、コンピュータが実行する方法の各機能毎に当該機能を実現する手段を設けることは、いづれも周知である。
　そして、引用発明において、「置き換え」の機能及び「挿入」の機能を、１つの「暗号手段」に実現させることに代えて、「置き換え」の機能及び「挿入」の機能をそれぞれ実現する手段を、それぞれ設けることは、当業者が適宜選択し得たものと認められる。
　
　よって、相違点４は格別のものではない。
　
　
　以上のとおりであるから、各相違点は、いずれも格別のものではなく、また、本願発明によってもたらされる効果も、当業者であれば予測可能なものにすぎないものであり、格別のものとは認められない。
　
　
５．審判請求人の主張について
　なお、審判請求人は、引用文献との差異として、
(１)「引用文献１の構成は、ソフトウェアの無権限な使用から保護することを実現するために、暗号を用いており、暗号を解読するための鍵をスマートカード等の外部装置に配置してあります。…(中略)…本願発明では、主プログラムのソースコードに含まれる定数データの初期化部を、可逆な変換処理によって解読困難な状態に変換した代替定数データの初期化部に置き換え、前記定数データが参照される前の箇所に前記代替定数データから元の定数データを主記憶上で復元する逆変換処理のソースを挿入するので、ソフトウェア本体と暗号を解読するための鍵が同一のプログラムに配置されています。このため、スマートカード等の外部装置、は不要です。」、
(２)「さらに、本願発明では、主記憶上で暗号解読がおこなわれ、外部と通信する必要がないために鍵を盗聴される危険が削減され、より安全にかつ簡易に秘匿化をすることができます。また、外部と通信し鍵を取得する必要がないため、当該ソフトウェアが暗号化されているか否かも秘匿することができます。」、
と主張している。
　
　しかしながら、上記主張の検討の基礎となっている本願発明(請求項１に係る発明)には、「鍵」をどこに配置するかを限定する記載は存在しておらず、「鍵」をどのように取得するかも記載されていない。
　したがって、「ソフトウェア本体と暗号を解読するための鍵が同一のプログラムに配置」や、「外部と通信し鍵を取得する必要がない」という上記主張の差異は、本願発明(請求項１に係る発明)と引用発明との間には存在しない。
　したがって、上記主張は当を得ておらず、採用することができない。
　
　
６．まとめ 
　以上のとおり、本願発明は、引用文献、常套手段及び周知技術に基づいて、当業者が容易に発明をすることができたものであるので、特許法第２９条第２項の規定により特許を受けることができない。
　よって、結論のとおり、審決する。