• ポートフォリオ機能


ポートフォリオを新規に作成して保存
既存のポートフォリオに追加保存

  • この表をプリントする
PDF PDFをダウンロード
審決分類 審判 査定不服 2項進歩性 特許、登録しない。 G06F
管理番号 1197560
審判番号 不服2006-25944  
総通号数 115 
発行国 日本国特許庁(JP) 
公報種別 特許審決公報 
発行日 2009-07-31 
種別 拒絶査定不服の審決 
審判請求日 2006-11-16 
確定日 2009-05-14 
事件の表示 特願2002- 82931「ソースプログラム変換方法及び装置並びにソース変換プログラム」拒絶査定不服審判事件〔平成15年10月 2日出願公開、特開2003-280754〕について、次のとおり審決する。 
結論 本件審判の請求は、成り立たない。 
理由 1.手続の経緯と本願発明
本願は、平成14年3月25日の出願であって、平成17年10月14日付けで拒絶理由通知がなされ、同年12月13日付けで手続補正がなされたが、平成18年10月10日付けで拒絶査定がなされ、これに対し、同年11月16日に拒絶査定に対する審判請求がなされたものである。

そして、その請求項1に係る発明(以下「本願発明」という。)は、平成17年12月13日付け手続補正書により補正された特許請求の範囲の請求項1に記載された次のとおりのものと認める。
「プログラム変換装置の第1の手段が、主プログラムのソースコードに含まれる定数データの初期化部を、可逆な変換処理によって解読困難な状態に変換した代替定数データの初期化部に置き換え、前記プログラム変換装置の第2の手段が、前記定数データが参照される前の箇所に前記代替定数データから元の定数データを主記憶上で復元する逆変換処理のソースを挿入するソースプログラム変換方法。」


2.引用文献
原査定の拒絶の理由に引用された、本願出願前の平成11年8月3日に頒布された刊行物である、特表平11-509023号公報(以下「引用文献」という。)には、図面とともに、以下の事項が記載されている。(下線は、参考のため、当審において付したもの。以下同様。)

(A)「16.相応の権限がある場合にのみコンピュータで使用されるソフトウェア、特に無償頒布を意図したソフトウェアの作成のための装置であって、この装置が、
- 前記ソフトウェアの少なくとも一部の暗号化を第一のアルゴリズムと第一のキーに従って実行する暗号手段と、及び
- 前記コンピュータに接続するよう適合された外部ユニットからなり、この外部ユニットが少なくとも、それ自体のプロセッサと、第二のアルゴリズム及びキーを格納するためのコンピュータ読み取り可能な記憶媒体とを有し、前記第二のアルゴリズム及びキーに従ってソフトウェアの暗号化された部分の解読を実行するよう配置されており、
当該装置が、第二のアルゴリズム(g2)による前記解読に用いることを意図した前記第二のアルゴリズム(g2)及び第二のキー(k2)をもたらす発生手段をさらに含み、この第二のキーが第一のアルゴリズム(g1)によるソフトウェアの前記部分の暗号化の実行において前記暗号手段により用いられた第一のキー(k1)と異なることを特徴とする装置。」(第7頁第16行?第8頁第3行)

(B)「本発明は、著作権保有者の許可のない使用に対する、ソフトウェア、特に無償で配布されるアプリケーションソフトウェアの保護に関する。」(第12頁第4?5行)

(C)「図8は、図4及び5に示したタイプの暗号化プロセスの一例を示している。ここで、ソースコードがPascal、C、Modulaのような高級プログラミング言語で存在していると仮定する。暗号化され、かくしていわゆる無権限使用に対して保護されるのは、このソースコードである。ソースコードにおいて、幾つかのパラメータが選択され、暗号化関数gを用いて暗号化される。例えば、保護されていないソースコードのあるコマンド中に存在する式、x: =y+10は、次のように表すことができる。
C: =decrypt(g(10)+t)
x: =y+(C‐T)
式中、g(10)は暗号化パラメータであり、Tは変数であり、そのランダム値はこの場合、スマートカードからフェッチされている。 xの正しい値を得るためには、保護されたプログラムは、10+Tに等しいCの値に「到達」しなければならない。その解読プログラムは、保護されたソフトウェアの一部を構成している「専用ソフトウェア」(付加されたオブジェクトコード)に配置されている(図5参照)。この専用ソフトウェアはまた、スマートカードとの通信のためのプログラムと共に、ここではf及びf^(-1)として示されるスクランブリング及び脱スクランブリング関数機能を含んでいる(図7参照)。」(第21頁第6?22行)

(D)「暗号化関数gと解読関数g^(-1)が、対称的ではない公的キー暗号システムを表すことが重要であることに注意しなければならない。……(中略)……
関数f,f^(-1),g,g^(-1)は、可変である(即ち、値を変えることなしに交換可能である)ことが必要とされる。ここではこのことは、それらが次の性質を有していなければならないことを示している。
f^(-1)(g^(-1)(f(g(x))))=x
このようにして保護されたプログラムをコンピュータで使用する際、このプログラムの実行は、通常の通りに開始される(図7)。スマートカードとの通信を介して、変数Tの値と、関数f又はf^(-1)のためのキーが、ソフトウェアに入力される。プログラムの実行は、次いで普通通りに続けられる。実行中に暗号化パラメータ(図示の例ではg(10))に行き着いた時点で、値(g(10)+T)が専用ソフトウェアに送られ、この専用ソフトウェアはさらにf(g(10)+T)‐T)をスマートカードに伝える。スマートカードでは、g^(-1)((10)+T)‐T)が計算され、この値が専用ソフトウェアに戻される。専用ソフトウェアにより、次いでf^(-1)(g^(-1)((10)+T)‐T)))が計算され、これはx及びx+Tに等しい。そしてこの結果が、プログラム中で用いるためのパラメータCとして、保護されたプログラムに対して供給される。」(第22頁第3?23行)

(E)「本発明によるこの種の暗号化-解読構成を有することにより、以下の利点及び可能性が実現される。
……(中略)……
- ソースコードレベルにおける暗号化により、この構成をオペレーティングシステムに依存しないものとする。コマンドファイルの如きファイルのみの、小部分、又は断片を暗号化することにより、何とかしてこうした部分を攻撃しようとする目的で、暗号化されたソフトウェアのこれらの部分を識別することは困難になる。また、解読アルゴリズム及びキーは、スマートカード上に容易に入力することができる。」(第22頁第24行?第23頁第17行)

(F)「図4及び5は本発明によりソースコードレベルの暗号化がどのようにして実行されるかを概略的に示し、
……(中略)……
図8は図4及び5に示したタイプの暗号化プロセスの一例を示し」(第18頁第21?27行)

(G)そして、Fig.8には、ソースコードを暗号化して暗号化されたソースコードを生成すること、該暗号化されたソースコードに対してコンパイル及びリンクの処理を実行することで保護されたソフトウェアが生成されること、が図示されるとともに、
前記暗号化されたソースコード中のコードとして、
「C=DECRYPT(g(10)+T)
x:=y+(C-T)」の記載がある。


(A)の「ソフトウェアの作成のための装置であって、この装置が、
- 前記ソフトウェアの少なくとも一部の暗号化を第一のアルゴリズムと第一のキーに従って実行する暗号手段」及び「前記暗号手段が、第一のアルゴリズム(g1)によるソフトウェアの前記部分の前記暗号化を、コンパイル及びリンクに先立って…(中略)…それぞれのソフトウェアのソースコードそれ自体に対して実行する」の記載、(G)の図示態様から、引用文献には、
保護されたソフトウェアの作成のための装置が暗号手段を備えること、及び
前記暗号手段がソフトウェアのソースコードを暗号化すること、
が記載されている。

(B)の「本発明は…(中略)…アプリケーションソフトウェアの保護に関する」、(C)の「ソースコードにおいて、幾つかのパラメータが選択され、暗号化関数gを用いて暗号化される。例えば、保護されていないソースコードのあるコマンド中に存在する式、x: =y+10は、次のように表すことができる。
C: =decrypt(g(10)+t)
x: =y+(C‐T)
式中、g(10)は暗号化パラメータであり、Tは変数であり、そのランダム値はこの場合、スマートカードからフェッチされている。」の記載から、引用文献において、暗号手段はアプリケーションソフトウェアのソースコードを暗号化するものである。
そして、(C)の上記記載、(E)の「ソースコードレベルにおける暗号化により、この構成をオペレーティングシステムに依存しないものとする。コマンドファイルの如きファイルのみの、小部分、又は断片を暗号化することにより、何とかしてこうした部分を攻撃しようとする目的で、暗号化されたソフトウェアのこれらの部分を識別することは困難になる。」、(G)の
「C=DECRYPT(g(10)+T)
x:=y+(C-T)」の各記載から、前記暗号手段は、ソースコードに含まれていた定数データ“10”を暗号化するために、定数データ“10”の暗号化パラメータ“g(10)”に変数Tを加える処理を行うものである。ここで、前記変数Tは、(C)に「Tは変数であり、そのランダム値はこの場合、スマートカードからフェッチされている。」と、(D)に「スマートカードとの通信を介して、変数Tの値と、関数f又はf^(-1)のためのキーが、ソフトウェアに入力される。」と記載されるように、外部のスマートカードからはランダム値としてソースコードに入力されるが、該入力された後の、(C)に記載の「暗号化プロセス」の過程においては、その値は変化しないから、静的な変数である。
そして、引用文献において、暗号化パラメータ“g(10)”に前記変数Tを加えることで得られたデータは、前記(E)の「ソースコードレベルにおける暗号化により…(中略)…小部分、又は断片を暗号化することにより…(中略)…識別することは困難に」されたデータであり、この暗号化により、前記ソースコードに含まれていた定数データの記述“10”は、識別困難な状態に変換されたデータの記述“g(10)+t”に置き換えられると認められる。
また、前記暗号化パラメータを生成する(C)の暗号化関数gは、(D)に記載されるように対応する解読関数を有しており、変数Tを加える加算処理は可逆な変換処理であるから、定数データ“10”の暗号化パラメータ“g(10)”に変数Tを加えるという処理は、可逆な変換処理である。
してみれば、引用文献には、
前記暗号手段が、アプリケーションソフトウェアのソースコードに含まれる定数データの記述“10”を、該定数データの暗号化パラメータ“g(10)”に静的な変数Tを加えるという可逆な変換処理によって識別困難な状態に変換したデータの記述“g(10)+t”に置き換えること、
が記載されている。

(G)の「暗号化されたソースコード」中のコードとしての、
「C=DECRYPT(g(10)+T)
x:=y+(C-T)」の記載、及び、(C)の「保護されていないソースコードのあるコマンド中に存在する式、x:=y+10は、次のように表すことができる。
C:=decrypt(g(10)+t)
x:=y+(C‐T)
式中、g(10)は暗号化パラメータであり、Tは変数であり、そのランダム値はこの場合、スマートカードからフェッチされている。
xの正しい値を得るためには、保護されたプログラムは、10+Tに等しいCの値に「到達」しなければならない。」の記載において、“C:=decrypt(g(10)+t)”の行は、前記識別困難な状態に変換されたデータ“g(10)+T”から、元の定数データ“10”に前記変数Tを加えたデータ“10+T”を解読する処理を表す関数の記述であると認められる。
前記“C:=decrypt(g(10)+t)”の行は、項“(C-T)”を参照する「x:=y+(C‐T)」の行の前に挿入されている。そして、Cは「10+Tに等しい」から、前記Cから前記変数Tを減じた値は、当然、“10”である。したがって、C-T=10の演算を意味する項“(C-T)”は、前記前の行の関数によって解読されたデータ“10+T”から前記変数Tを減じて元の定数データ“10”を復元する項であると認められる。
そして、(D)に記載される「暗号化プロセス」は、前記暗号手段が実行するプロセスであることは明らかである。
してみれば、引用文献には、
前記暗号手段が、前記定数データを復元する項“(C-T)”が参照される前の行に、識別困難な状態に変換したデータ“g(10)+T”から、元の定数データ“10”に静的な変数Tを加えたデータ“10+T”を解読する処理を表す関数の記述“C:=decrypt(g(10)+t)”を挿入し、前記定数データを復元する項“(C-T)”は前記解読されたデータ“10+T”から前記変数Tを減じて前記定数データ“10”を復元する項であること、
が記載されている。


以上から、引用文献には、次の発明(以下「引用発明」という。)が記載されているものと認められる。

保護されたソフトウェアの作成のための装置の暗号手段が、アプリケーションソフトウェアのソースコードに含まれる定数データの記述“10”を、該定数データの暗号化パラメータ“g(10)”に静的な変数Tを加えるという可逆な変換処理によって識別困難な状態に変換したデータの記述“g(10)+t”に置き換え、
前記暗号手段が、前記定数データを復元する項“(C-T)”が参照される前の行に、前記識別困難な状態に変換したデータ“g(10)+T”から、元の定数データ“10”に前記変数Tを加えたデータ“10+T”を解読する処理を表す関数の記述“C:=decrypt(g(10)+t)”を挿入し、前記定数データを復元する項“(C-T)”は前記解読されたデータ“10+T”から前記変数Tを減じて前記定数データ“10”を復元する項である、
ソースコードを暗号化する方法。


3.対比
本願発明と引用発明とを比較する。

本願発明の「主プログラム」は、「定数データ」を含む「ソースコード」で作成されたプログラムである。これに対して、引用発明の「アプリケーションソフトウェア」は、「ソースコード」で作成されたプログラムであり、該ソースコードは「定数データ“10”」を含んでいる。したがって、引用発明の「アプリケーションソフトウェア」は本願発明の「主プログラム」に相当し、引用発明の「アプリケーションソフトウェアのソースコード」は本願発明の「主プログラムのソースコード」に相当する。

引用発明の「ソースコードを暗号化する方法」により、アプリケーションソフトウェアのソースコードが暗号化されるが、これは、アプリケーションソフトウェアのソースコードを暗号化されたソースコードに変換することを意味するものである。よって、引用発明の「ソースコードを暗号化する方法」は、本願発明の「ソースプログラム変換方法」に相当する。
そして、引用発明における、前記「ソースコードを暗号化する方法」を実行する「暗号手段」を備える「保護されたソフトウェアの作成のための装置」は、本願発明の「プログラム変換装置」に相当する。

引用発明における「識別困難な状態」は、本願発明における「解読困難な状態」に相当する。
また、引用発明における「識別困難な状態に変換したデータ」は、暗号化されたソースコードにおいて、定数データを代替するものであるから、本願発明の「代替定数データ」に相当する。
したがって、引用発明において「アプリケーションソフトウェアのソースコードに含まれる定数データの記述“10”を、該定数データの暗号化パラメータ“g(10)”に静的な変数Tを加えるという可逆な変換処理によって識別困難な状態に変換したデータの記述“g(10)+t”に置き換え」ることと、本願発明の「主プログラムのソースコードに含まれる定数データの初期化部を、可逆な変換処理によって解読困難な状態に変換した代替定数データの初期化部に置き換え」ることとは、主プログラムのソースコードに含まれる定数データに代えて、可逆な変換処理によって解読困難な状態に変換した代替定数データを前記ソースコードにおいて使用する点で一致する。

引用発明における「定数データを復元する項“(C-T)”が参照される」という記載における「定数データを復元する項“(C-T)”」は、「解読されたデータ“10+T”から前記変数Tを減じて前記定数データ“10”を復元する項」であり、該項が表すデータの値は前記定数データに等しいから、前記定数データを示すものである。そして、引用発明の前記「項」は、ソースコードにおいては“(C-T)”という文字列に他ならない。
ところで、本願発明は、「定数データ」を「解読困難な状態」にすることを課題とするから、変換されたソースコードにおいて定数データそのものは隠蔽されているものであり、本願明細書の段落【0031】には「配列data1[ ]が初めて参照される前の箇所に逆変換関数挿入位置マーク564が挿入されている。」と記載されている。すなわち、本願発明の「定数データが参照される」の記載は、当該定数データを示す変数の文字列が参照されることを意味している。
したがって、引用発明の「定数データを復元する項が参照される」と本願発明の「定数データが参照される」とは、定数データを示す文字列が参照される点で、一致する。
そして、引用発明における「前の行」は、本願発明の「前の箇所」に相当する。

ところで、本願明細書の発明の詳細な説明及び図面の記載を参照すると、図3のマーク付きソースコードS1における逆変換関数挿入位置マークの位置に挿入するのが、「data1pの配列から鍵protect_key=1234567を用いて逆変換を行い、結果をdata1の配列に入れるという動作g(A1,key)を指示する」ところの「関数deprotect( )の行の記述」であることが、同明細書の段落【0035】に記載されている。そして、同段落【0039】に「図5の9行目に示すように変換前後の配列名と鍵をパラメータとする逆変換関数の呼出し文を生成し(ステップS510)、この文を逆変換挿入位置に挿入する」と、同段落【0045】には「記憶部503に格納されたソースコードS2と、このソースコードS2の#include文により指定された記憶部504上のソースファイルdeprotect_func.cとから、コンパイラを用いたコンパイル動作によって、オブジェクト(実行形式)E2を生成する。こうして生成されたオブジェクトE2は、その実行時に自オブジェクト内の変換箇所を自オブジェクト自身が有する逆変換処理で元の内容に復元する機能を持つ」と記載されている。
すなわち、本願発明における「逆変換処理のソース」とは、逆変換関数の本体の処理を記述するコードではなく、該本体の処理を記述するコードを呼び出す逆変換関数の記述を意味している。
これに対して、引用発明において、「前記識別困難な状態に変換したデータ“g(10)+T”から、元の定数データ“10”に前記変数Tを加えたデータ“10+T”を解読する処理を表す関数の記述“C:=decrypt(g(10)+t)”」は、次の行の「前記解読されたデータ“10+T”から前記変数Tを減じて前記定数データ“10”を復元する項」である“(C-T)”により元の定数データ“10”を復元するためのものであるから、前記部分から元の定数データを復元することを目的とする関数の記述である。
したがって、引用発明における「前記識別困難な状態に変換したデータ“g(10)+T”から、元の定数データ“10”に前記変数Tを加えたデータ“10+T”を解読する処理を表す関数の記述“C:=decrypt(g(10)+t)”」と、本願発明における「前記代替定数データから元の定数データを主記憶上で復元する逆変換処理のソース」とは、代替定数データから元の定数データを復元することを目的とする関数の記述である点で一致する。

よって、引用発明において「前記定数データを復元する項“(C-T)”が参照される前の行に、前記識別困難な状態に変換したデータ“g(10)+T”から、元の定数データ“10”に前記変数Tを加えたデータ“10+T”を解読する処理を表す関数の記述“C:=decrypt(g(10)+t)”を挿入」することと、本願発明における「前記定数データが参照される前の箇所に前記代替定数データから元の定数データを主記憶上で復元する逆変換処理のソースを挿入する」こととは、定数データを表す文字列が参照される前の箇所に、前記代替定数データから元の定数データを復元することを目的とする関数の記述を挿入する点で、一致する。

そして、本願発明において、前記「置き換え」を「プログラム変換装置の第1の手段」が行い、前記「挿入」を「プログラム変換装置の第2の手段」が行うのに対して、引用発明においては、前記「置き換え」と前記「挿入」を、保護されたソフトウェアの作成のための装置が備える「暗号手段」が行うものである。
すなわち、両者は、前記「置き換え」と前記「挿入」をプログラム変換装置の手段が行う点で共通する。

以上から、本願発明と引用発明とは、以下の点で一致し、また、以下の点で相違する。

(一致点)
プログラム変換装置の手段が、主プログラムのソースコードに含まれる定数データに代えて、可逆な変換処理によって解読困難な状態に変換した代替定数データを前記ソースコードにおいて使用し、前記手段が、定数データを示す文字列が参照される前の箇所に、前記代替定数データから元の定数データを復元することを目的とする関数の記述を挿入する、ソースプログラム変換方法。

(相違点1)
主プログラムのソースコードに含まれる定数データに代えて、可逆な変換処理によって解読困難な状態に変換した代替定数データを前記ソースコードにおいて使用する具体的方法が、本願発明においては「主プログラムのソースコードに含まれる定数データの初期化部を、可逆な変換処理によって解読困難な状態に変換した代替定数データの初期化部に置き換え」ることであるのに対して、引用発明においては、「アプリケーションソフトウェアのソースコードに含まれる定数データ“10”の記述を、該定数データを可逆な変換処理によって識別困難な状態に変換したデータの記述“g(10)+t”に置き換え」ることである点

(相違点2)
定数データを示す文字列が、本願発明においては「定数データ」であるのに対して、引用発明においては、「前記解読されたデータ“10+T”から前記変数Tを減じて前記定数データ“10”を復元する項」である点

(相違点3)
定数データを示す文字列が参照される前の箇所に挿入する処理を表す関数の記述が、本願発明においては「代替定数データから元の定数データを主記憶上で復元する逆変換処理のソース」であるのに対して、引用発明においては「前記識別困難な状態に変換したデータ“g(10)+T”から、元の定数データ“10”に前記変数Tを加えたデータ“10+T”を解読する処理を表す関数の記述“C:=decrypt(g(10)+t)”」である点

(相違点4)
本願発明は、プログラム変換装置の手段が、主プログラムのソースコードに含まれる定数データの初期化部を、可逆な変換処理によって解読困難な状態に変換した代替定数データの初期化部に置き換える「第1の手段」と、前記定数データが参照される前の箇所に前記代替定数データから元の定数データを主記憶上で復元する逆変換処理のソースを挿入する「第2の手段」とからなるものであるのに対して、引用発明は、置き換え及び挿入の各処理を1つの「暗号手段」が行う点


4.判断
相違点1について
本願の出願の日前である1991年2月1日に頒布された刊行物である、高木聡,“はじめて学ぶプログラミング第17回 総まとめ(1)宣言・定義と記憶クラス・結合”,C MAGAZINE,ソフトバンク株式会社,1991年02月01日,第3巻,第2号,p.118?127には、
(ア)「今までなにげなく行っていた変数宣言について,厳密に考えてみましょう。変数宣言は,Fig.2のような書式になっています。」(第119頁中欄第3?6行)
(イ)

(ウ)「●staticの記憶クラス
次に,staticの記憶クラスについて説明しましょう。staticの日本語訳は,静的ですね。内部変数でも記憶クラスをstaticにすると静的変数になります。静的変数はコンパイル時に固定アドレスが割り当てられます。つまり,自動変数のように関数が呼び出されるたびにスタック上に生成されては消滅するといったたぐいのものではありません。関数呼び出しが終わったあとでも,staticの記憶クラスの内部変数は,関数呼び出しが終わった時点の値を保持しているのです。変数宣言時の初期化は,その関数が最初に呼ばれたときだけ行われます(一般的にはコンパイル時に初期値が埋め込まれます)。つまり,関数が2回以上呼び出されたときには,2回目以降の初期化は行われず,前回の関数呼び出しが終了した時点の値が初期値となるのです(前回の値を保持しているので)。」(第120頁左欄第1?20行)
と記載されている。

そして、本願の出願の日前である1999年11月1日に頒布された刊行物である、日下部陽一,“スーパー実践講座 Cプログラミング入門 static宣言”,C MAGAZINE,ソフトバンク株式会社,1996年11月01日,第8巻,第11号,p.54?61には、その第56頁左欄第19行?同頁右欄第19行に、
(エ)「もうひとつの方法は,
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のプログラムは関数内の変数宣言時に初期化を行っているという点では,var3.cと似ている。しかし,関数が呼び出されるたびに値が50に初期化されるのではなくて,プログラムが起動して動き始める前に50に初期化されるだけで,そのあと毎回50に初期化されるわけではない。
また,このことはvar4.cの“関数の外で宣言”して静的に確保した変数についても同様だ。つまり,その場合も“関数のなかでstaticキーワードを付けて”宣言した変数と同じく,値の初期化は最初に行われるだけである。」
と記載されている。

同様に、本願の出願の日前である2000年10月1日に頒布された刊行物である、多治見寿和,“プログラミング・テクニック grep(7)”,UNIX MAGAZINE,株式会社アスキー,2000年10月01日,第15巻,第10号,p.58?66には、その第64頁左欄第5行?同頁右欄第10行に、
(オ)「まず、関数内で使う定数に名前を付けます。
#define NUMSTATES 7
#define NUMCHARS 256
#define INITIALSTATE 0
ここでは、状態がいくつあるかを示すNUMSTATES、文字か何通りあるかを示すNUMCHARS、開始状態の番号を示すINITIALSIATEの3つを定義しています。
関数の先頭では、状態遷移表を表す配列を初期化しています。
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},
表1がそのまま初期化する値となっているのが分かるでしょうか。
……(中略)……
実際に状態遷移をおこなう部分は次のように簡単です(誌面の都合上、⇒で折り返しています。以下同様)。
for (state = INITIALSTATE; *s, s++) {
state = trans[state] [grp⇒
[(unsigned char)*s];
if (state < 0)
return 0;
}
return accept[state];
}」
と記載されている。

さらに、本願の出願の日前である1991年2月1日に頒布された刊行物である、龍崎昌平,“part1 拡張CとしてのC++”,C MAGAZINE,ソフトバンク株式会社,1991年02月01日,第3巻,第2号,p.38?46には、その第43頁に記載された「List 14」中に、
(カ)「static int a[] = {1,2,3,4,5,-1};
1nt i = func( 10 ):
1nt j = func( “ ohshima junichi” ):
1nt K = func( a ):」
と記載されている。

前記(ア)?(カ)の記載から、
プログラムのソースコードに含まれる定数データを、当該プログラムが実行されている間、その値を保持している静的な変数として宣言・初期化する前記定数データの初期化部を設けることは、プログラミング手法として常套手段である。

してみれば、引用発明において、「アプリケーションソフトウェアのソースコードに含まれる定数データ」を、前記常套手段のように、初期化部を伴う静的な変数としてソースコード中に記述することは、当業者が適宜なし得たものと認められる。

ところで、引用発明において、「該定数データの暗号化パラメータ“g(10)”に静的な変数Tを加えるという可逆な変換処理によって識別困難な状態に変換したデータ」において、「暗号化パラメータ“g(10)”」は定数データに暗号化関数を施したデータを示すものであるから、当然に定数を示していると認められる。してみれば、該暗号化パラメータ“g(10)”に静的な変数Tを加えた、前記識別困難な状態に変換したデータも、引用発明の「ソースコードを暗号化する方法」を実行する間は確定している定数である。
したがって、上記のように、「アプリケーションソフトウェアのソースコードに含まれる定数データ」を、前記常套手段のように、初期化部を伴う静的な変数としてソースコード中に記述する場合、引用発明の「ソースコードを暗号化する方法」により変換された暗号化されたソースコードにおいては、暗号化パラメータ“g(10)”に変数Tを加えたデータを初期化部を伴う静的な変数として記述することは当然である。

よって、相違点1は格別のものではない。


相違点2、3について
本願発明は、「代替定数データから元の定数データを主記憶上で復元」する逆変換処理のソースの次の箇所において、前記復元された「定数データが参照される」が、そもそも本願発明は「定数データ」を「解読困難な状態」にすることを課題とするから、変換されたソースコードにおいては定数データはそのままの状態では記述されていないものであり、したがって、前記「3.対比」で述べた通り、前記「定数データが参照される」の記載は、当該定数データを示す変数の文字列が参照されることを意味するものである。

ところで、引用発明は、「関数」によって、「識別困難な状態に変換したデータ“g(10)+T”から、元の定数データ“10”に前記変数Tを加えたデータ“10+T”を解読」し、前記関数の記述の次の行において、「前記解読されたデータ“10+T”から前記変数Tを減じて前記定数データ“10”を復元する項」が参照されるものである。
換言すれば、引用発明は、定数データの暗号化パラメータ“g(10)”に静的な変数Tを加えるという可逆な変換処理によって識別困難な状態に変換したデータ“g(10)+T”から、元の定数データ“10”を復元するに当たり、挿入された「関数」においては、元の定数データ“10”に前記変数Tを加えたデータ“10+T”の解読という、元の定数データの「復元」に必要な処理の一部を行い、残りの前記変数Tを減じるという処理は参照される箇所で行うものである。

そして、変数Tを減じるという前記残りの処理は単なる減算処理であり、これを前記解読する関数とは別の箇所で行うか、前記解読する関数中で行わせるかは、当業者が適宜選択し得る事項にすぎないものと認められる。
すなわち、引用発明において、「前の行」において「関数」によって、「識別困難な状態に変換したデータ“g(10)+T”から、元の定数データ“10”に前記変数Tを加えたデータ“10+T”を解読」し、前記関数の記述の次の行において「前記解読されたデータ“10+T”から前記変数Tを減じて前記定数データ“10”を復元する項」を参照することに代えて、前の行において関数によって、識別困難な状態に変換したデータ“g(10)+T”から、元の定数データ“10”に前記変数Tを加えたものを解読したデータ“10+T”より前記変数Tを減じて元の定数データ“10”を復元し、前記「関数」の記述の次の行において、該復元された定数データを示す文字列を参照するように、プログラミングを変更することは、当業者が容易に想到し得たものと認められる。

なお、プログラムの実行に当たっては、実行形式のオブジェクトを主記憶にロードして実行することは、コンピュータ技術においては一般である。したがって、引用発明においても、定数データを主記憶上で復元さすることは、当業者であれば当然に行う事項にすぎないものである。

よって、相違点2及び3は格別のものではない。

相違点4について
コンピュータ技術において、コンピュータの1つの手段に複数の機能を実現させること、及び、コンピュータが実行する方法の各機能毎に当該機能を実現する手段を設けることは、いづれも周知である。
そして、引用発明において、「置き換え」の機能及び「挿入」の機能を、1つの「暗号手段」に実現させることに代えて、「置き換え」の機能及び「挿入」の機能をそれぞれ実現する手段を、それぞれ設けることは、当業者が適宜選択し得たものと認められる。

よって、相違点4は格別のものではない。


以上のとおりであるから、各相違点は、いずれも格別のものではなく、また、本願発明によってもたらされる効果も、当業者であれば予測可能なものにすぎないものであり、格別のものとは認められない。


5.審判請求人の主張について
なお、審判請求人は、引用文献との差異として、
(1)「引用文献1の構成は、ソフトウェアの無権限な使用から保護することを実現するために、暗号を用いており、暗号を解読するための鍵をスマートカード等の外部装置に配置してあります。…(中略)…本願発明では、主プログラムのソースコードに含まれる定数データの初期化部を、可逆な変換処理によって解読困難な状態に変換した代替定数データの初期化部に置き換え、前記定数データが参照される前の箇所に前記代替定数データから元の定数データを主記憶上で復元する逆変換処理のソースを挿入するので、ソフトウェア本体と暗号を解読するための鍵が同一のプログラムに配置されています。このため、スマートカード等の外部装置、は不要です。」、
(2)「さらに、本願発明では、主記憶上で暗号解読がおこなわれ、外部と通信する必要がないために鍵を盗聴される危険が削減され、より安全にかつ簡易に秘匿化をすることができます。また、外部と通信し鍵を取得する必要がないため、当該ソフトウェアが暗号化されているか否かも秘匿することができます。」、
と主張している。

しかしながら、上記主張の検討の基礎となっている本願発明(請求項1に係る発明)には、「鍵」をどこに配置するかを限定する記載は存在しておらず、「鍵」をどのように取得するかも記載されていない。
したがって、「ソフトウェア本体と暗号を解読するための鍵が同一のプログラムに配置」や、「外部と通信し鍵を取得する必要がない」という上記主張の差異は、本願発明(請求項1に係る発明)と引用発明との間には存在しない。
したがって、上記主張は当を得ておらず、採用することができない。


6.まとめ
以上のとおり、本願発明は、引用文献、常套手段及び周知技術に基づいて、当業者が容易に発明をすることができたものであるので、特許法第29条第2項の規定により特許を受けることができない。
よって、結論のとおり、審決する。
 
審理終結日 2009-03-10 
結審通知日 2009-03-17 
審決日 2009-03-30 
出願番号 特願2002-82931(P2002-82931)
審決分類 P 1 8・ 121- Z (G06F)
最終処分 不成立  
前審関与審査官 岩崎 志保  
特許庁審判長 山崎 達也
特許庁審判官 久保 光宏
鈴木 匡明
発明の名称 ソースプログラム変換方法及び装置並びにソース変換プログラム  
代理人 谷澤 靖久  
代理人 木村 明隆  
代理人 机 昌彦  

プライバシーポリシー   セキュリティーポリシー   運営会社概要   サービスに関しての問い合わせ