【事件の表示】
　特願２０１６−５２０９７３「情報処理装置，プログラム，及び記録媒体」拒絶査定不服審判事件〔平成２７年１１月２６日国際公開，ＷＯ２０１５／１７８０８２，請求項の数（５）〕について，次のとおり審決する。
【結　論】
　原査定を取り消す。
　本願の発明は，特許すべきものとする。
【理　由】
第１．手続の経緯
　本願は，２０１５年３月１７日（優先権主張２０１４年５月２１日　日本国）を国際出願日とする出願であって，
　平成２８年８月１日付けで手続補正がなされ，平成２８年１２月１９日付けで審査請求がなされ，平成２９年１月１６日付けで審査官により拒絶理由が通知され，これに対して平成２９年３月２７日付けで意見書が提出されると共に手続補正がなされたが，平成２９年６月１５日付けで審査官により拒絶査定がなされ，これに対して平成２９年８月２３日付けで審判請求がなされると共に手続補正がなされ，平成２９年１０月２６日付けで審査官により特許法第１６４条第３項の規定に基づく報告がなされ，平成３０年４月１９日付けで当審により拒絶理由が通知され，これに対して平成３０年６月１１日付けで意見書が提出されると共に手続補正がなされ，平成３０年１１月３０日付けで当審により拒絶理由が通知され，これに対して平成３０年１２月７日付けで手続補正がなされたものである。
　
第２．本願発明について
　本願の請求項１〜本願の請求項５に係る発明（以下，これを「本願発明１〜本願発明５」という）は，平成３０年１２月７日付けの手続補正により補正された特許請求の範囲の請求項１〜請求項５に記載された次のとおりのものである。
　
「　【請求項１】
　演算装置と，ＡＥＳ方式で前記演算装置に，暗号化されたデータ又は平文のデータである第１データを暗号化又は復号化させるための処理を実行させるプログラムを記憶する記憶装置とを有する組み込みシステムが有する前記演算装置に，各処理を実行させるためのプログラムであって，
　１バイト単位の変数の配列を用いて，拡張鍵データを生成するのに入力される第２データを１バイトごとに処理して前記拡張鍵データを生成する処理を行う生成処理手順と，
　前記第１データを並替テーブルを用いて並び替える処理である並替処理を行わせる並替処理手順と，
　前記並替処理されたデータを１次元配列の置換テーブルを用いて置換する処理である置換処理を行わせる置換処理手順と，
　前記置換処理されたデータを等価式に基づいて変換する処理である変換処理を行わせる変換処理手順と，
　前記拡張鍵データ及び前記変換処理されたデータに基づいての排他的論理和を計算する処理である拡張処理を行わせる拡張処理手順と
を含み，
　前記並替処理，前記置換処理，前記変換処理，及び前記拡張処理を４バイトごとに実行させるためのプログラム。
　　【請求項２】
　前記変換処理を，
　変換テーブルによって行う請求項１に記載のプログラム。
　　【請求項３】
　前記変換処理は，前記変換テーブルによる１回のマッピング処理である請求項２に記載のプログラム。
　　【請求項４】
　前記並替テーブルは，１次元配列のデータである請求項１乃至３のいずれか一項に記載のプログラム。
　　【請求項５】
　前記変換処理に係る重複する計算を共通化させる請求項１乃至４のいずれか一項に記載のプログラム。」
　
第３．引用文献に記載の事項及び引用文献に記載の発明
１．引用文献１について
ア．記載事項
　原審が平成２９年１月１６日付けの拒絶理由（以下，これを「原審拒絶理由」という）に引用した，「Chodowiec, P. and Gaj, K., Very Compact FPGA Implementation of the AES Algorithm, Lecture Notes in Computer Science, Vol.2779, 2003年, p.319-333」（以下，これを「引用文献１」という）には，関連する図面と共に，次の事項が記載されている。
　
Ａ．「Abatract. In this paper a compact FPGA architecture for the AES algorithm with 128-bit key targeted for low-cost embedded application is presented.」（３１９頁１行〜３行）
（アブストラクト．　この論文において，低コストの組込アプリケーションを対象とする１２８ビット鍵のＡＥＳアルゴリズムのための，コンパクトなＦＰＧＡアーキテクチャが，提示される。当審にて訳出。以下同じ。）
　
Ｂ．「1. Read input bytes: 0, 5, A, F; execute SubBytes, MixColumns and AddRoundKey on them;write results to the output at locations: 0, 1, 2, 3. This step is highlighted in the Fig. 3.
・・・・中略・・・・
4. Repeat above operations for bytes: C, 1, 6, B; write results at locations: C,D, E, F. Output now becomes input for the next step.
・・・・中略・・・・
The correct execution of ShiftRows and InvShiftRows is now resolved to the proper addressing of each of the memories at the consecutive clock cycles.」（３２２頁８行〜１０行，同１５行〜１６行，同２１行〜２３行）
（１．入力バイト：０，５，Ａ，Ｆの読み込み：それらへＳｕｂＢｙｔｅｓ，ＭｉｘＣｏｌｕｍｎｓ，及び，ＡｄｄＲｏｕｎｄＫｅｙを実行：結果を，ロケーション：０，１，２，３に書込。このステップは，図３に強調されている。
・・・・中略・・・・
４．複数バイト：Ｃ，１，６，Ｂのために上記処理を繰り返す；結果をロケーションＣ，Ｄ，Ｅ，Ｆに書込。出力は，直ちに，次のステップのための入力になる。
・・・・中略・・・・
ＳｈｉｆｔＲｏｗｓと，ＩｎｖＳｈｉｆｔＲｏｗｓの正確な実行は，直ちに，連続したクロック・サイクルで，メモリのそれぞれの適切なアドレス指定が，決定される。）
　
Ｃ．「We decided to keep a good balance between utilization of LUTs and Block RAMs for the entire design, and implemented our S-boxes on dedicated Block RAMs.
・・・・中略・・・・
A single SubBytes or InvSubBytes implementation requires a 256x8 ROM. A Block RAM has enough space to implement both SubBytes and InvSubBytes, as shown in Fig. 5. Each port has access to the entire memory space, and can perform a SubBytes or InvSubBytes transformation independently of each other.」（３２４頁１１行〜１３行，同１７行〜２１行）
（我々は，全体のデザインのため，ＬＵＴの利用と，ブロックＲＡＭの間の良好なバランスを維持すること決定し，専用のブロックＲＡＭ上の我々のＳ−ｂｏｘに，実装した。
・・・・中略・・・・
単独のＳｕｂＢｙｔｅｓ，或いは，ＩｎｖＳｕｂＢｙｔｅｓの実装は，２５８×８のＲＯＭを要求する。ブロックＲＡＭは，図５に示すように，ＳｕｂＢｙｔｅｓと，ＩｎｖＳｕｂＢｙｔｅｓの両方を実装するのに十分な空間を有する。それぞれのポートは，全部のメモリ空間へのアクセスを有し，それぞれ独立に，ＳｕｂＢｙｔｅｓ，或いは，ＩｎｖＳｕｂＢｙｔｅｓの変換を，実行することができる。）
　
Ｄ．「The MixColumns multiplies the input polynomial by a constant polynomial
 c(x) = {03}x3 + {01}x2 + {01}x + {02} (1)
 modulo x4 +1. The coefficients in GF(28) are multiplied modulo x8+x4+x3+x+1.
・・・・中略・・・・
The MixColumns and InvMixColumns can be implemented using shared logic resources as shown in Fig. 6.」（３２５頁１１行〜１４行，３２６頁１２行〜１３行）
（ＭｉＸＣｏｌｕｍｎｓは，入力多項式を，ｘ４＋１を法とする常数多項式
ｃ（ｘ）＝｛０３｝ｘ３＋｛０１｝ｘ２＋｛０１｝ｘ＋｛０２｝　（１）
と乗算する。ＧＦ（２８）における係数は，ｘ８＋ｘ４＋ｘ３＋ｘ＋１を法として，乗算される。
・・・・中略・・・・
ＭｉＸＣｏｌｕｍｎｓと，ＩｎｖＭｉＸＣｏｌｕｍｎｓは，図６に示すように，共用の論理資源を用いることで，実装し得る。）
　
Ｅ．「
」
　
Ｇ．「we selected to implement the key schedule that precomputes all round keys. The implementation of the key schedule is shown in Fig. 8. It computes 32-bits of the key material per clock cycle, therefore, full key schedule execution takes 44 clock cycles. The computed round keys are stored in a single Block RAM.」（３２８頁２行〜６行）
（我々は，全てのラウンド・キーを事前に計算する，キー・スケジューリングを実装することを，選択した。キー・スケジューリングの実装を，図８に示す。クロック・サイクル毎に，キー素材の３２ビットを計算し，それ故，全てのキー・スケジュール実行は，４４クロック・サイクルを要する。計算されたラウンド・キーは，単独のブロックＲＡＭに格納される。）
　
イ．引用文献１に記載の発明
　上記Ａ〜Ｇに引用した，引用文献１の記載内容から，引用文献１には，次の発明（以下，これを「引用発明」という）が記載されているものと認める。
　
「データをＡＥＳ方式で暗号化する情報処理装置であって，
　拡張鍵データを生成する処理を行う生成処理手段と，
　前記データを並び替える処理である並替処理を行う並替処理手段と，
　前記並替処理されたデータを１次元の配列の置換テーブルを用いて置換する処理である置換処理を行う置換処理手段と，
　前記置換処理されたデータを変換する処理である変換処理を行う変換処理手段と，
　前記拡張鍵データ及び前記変換処理されたデータの排他的論理和を計算する処理である拡張処理を行う拡張処理手段と，を有し，
　前記並替処理，前記置換処理，前記変換処理，及び前記拡張処理を４バイトごとに処理する，情報処理装置。」
　
２．引用文献２について
　原審拒絶理由に引用された，「Chang, C.-H. et al., 8-bit AES FPGA Implementation using Block RAM, Proc. of the 33rd Annual Conference of the IEEE Industrial Electronics Society, 2007年, p.2654-2659」（以下，これを「引用文献２」という）には，関連する図面と共に，次の事項が記載されている。
　
Ｈ．「This paper proposes an 8-bit AES implementation design that keeps MixColumn and sequential controls for AES operation in the processing area while moving the circuit necessary for other operations such as Sbox, ShiftRow and KeyExpansion to Block RAMs (BRAMs) of Xilinx FPGAchip.」（２６５４頁左欄５行〜１０行）
（この論文は，ザイリンクスＦＰＧＡチップのブロックメモリ（ＢＲＡＭｓ）へ，Ｓｂｏｘ，ＳｈｉｆｔＲｏｗ，及び，ＫｅｙＥｘｐａｎｓｉｏｎのような，他の処理のために必要な回路を移動している間，処理エリアにおいて，ＭｉＸＣｏｌｕｍｎと，ＡＥＳ処理のためのシーケンシャル制御を続ける，８−ビットＡＥＳ実装案を提案する。）
　
Ｉ．「The above observation is summarized in Fig.7, two keys in KA are added and the new keys are stored in KB」（２６５８頁左欄１５行〜１７行）
（上記見解は，図７において要約され，ＫＡにおける２つのキーは，加えられ，そして，新しいキーは，ＫＢに格納される。）
　
３．引用文献３について
　原審拒絶理由に引用された，特開２０１３−０４５０７２号公報（平成２５年３月４日公開，以下，これを「引用文献３」という）には，関連する図面と共に，次の事項が記載されている。
　
Ｊ．「【００１２】
　本実施形態では，最低限必要な５種類の命令（擬似命令）のみでＡＥＳを実現する。５種類の命令には，３種類の演算処理の命令（ｓｂｏｘ，ｘｔｉｍｅ，および，ｘｏｒ）と，２種類のメモリアクセスの命令（ｌｄ（ロード）およびｓｔ（ストア））とが含まれる。また，演算結果を記憶するためのレジスタとして８ビットのアキュムレータを設ける。また，これらの命令によりＡＥＳ暗号をハードウェアで実行する順序機械である制御部を備える。命令や各構成部の詳細は後述する。」
　
Ｋ．「【００２６】
　次に，詳細なＡＥＳ擬似コード（詳細版擬似コード）を記載する。詳細版擬似コードは，上記簡易版擬似コードの各関数（ＡＫ，ＫＳ，ＳＢ，ＳＲ，ＭＣなど）を具体化したコードを含む。
【００２７】
round=0
rc=0x01
//AddRoundKey:m=AK（m,k）
for（i=0;  i16;  i++）｛
　ld  m[i]
　xor  k[i]
　st  m[i]
｝
while（1）｛
　//KeyExpansion:k=KS（k）
　for（i=0;  i16;  i++）｛
　  ld  k[kp（i）]
　  if（i4）｛
　    sbox
　    if（i==0）  xor  rc
　  ｝
　  xor  k[i]
　  st  k[i]
　｝
　//SubBytes:m=SB（m）
　for（i=0;  i16;  i++）｛
　  ld  m[i]
　  sbox
　  st  m[i]
　｝
　//ShiftRows:w=SR（m）
　for（i=0;  i16;  i++）｛
　  ld  m[sr（i）]
　  st  w[i]
　｝
　//loop  control
　round=round+1
　if（round==10）  break;//exit  while  loop
　//MixColumns:m=MC（w）
　for（i=0;  i16;  i++）｛
　  ld  w[i]
　  xor  w[ofs1（i）]
　  xtime
　  xor  w[ofs1（i）]
　  xor  w[ofs2（i）]
　  xor  w[ofs3（i）]
　  st  m[i]
　｝
//AddRoundKey:m=AK（m,k）
for（i=0;  i16;  i++）｛
　  ld  m[i]
　  xor  k[i]
　  st  m[i]
　｝
　//rc  update:rc=xtime（rc）
　ld  rc
　xtime
　st  rc
｝
//AddRoundKey:m=AK（w,k）
for（i=0;  i16;  i++）｛
　ld  w[i]
　xor  k[i]
　st  m[i]
｝
//end」
　
Ｌ．「【００５５】
　SR（ShiftRows）は１６バイトの並び替えだが，上書きすると元の値が消えるので，別な領域である作業領域ｗにコピーしながら並び替えている（ステップＳ１０５）。この処理（ステップＳ１０５）をＣ言語で記載すると次のようなコードになる。
　for（i=0;  i16;  i++）｛
　  w[i]=m[sr[i]];
  ｝
【００５６】
  上記コード内の変数srは，
　int  sr[16]=｛0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11｝;
であるため，上記コードは，
　w[0]=m[0]
　w[1]=m[5]
　w[2]=m[10]
　w[3]=m[15]
　w[4]=m[4]
　w[5]=m[9]
　w[6]=m[14]
　w[7]=m[3]
　w[8]=m[8]
　w[9]=m[13]
　w[10]=m[2]
　w[11]=m[7]
　w[12]=m[12]
　w[13]=m[1]
　w[14]=m[6]
　w[15]=m[11]
という代入をしているのと同じことになる。
【００５７】
　１変数だけで逐次的に実行しようとすると，これから先に必要な値が上書きされて消されてしまうので，別な変数にコピーしながら順番を入れ替えている。
【００５８】
　MC（MixColumns）も，値が上書される問題が生じるので，別の変数にコピーしながら変換している（ステップＳ１０８）。
【００５９】
　ＡＥＳ暗号の規格（ＦＩＰＳ−１９７）では，
　m[0]=xtime（w[0]）^xtime（w[1]）^w[1]^w[2]^w[3]
のように計算することが定められている。一方，xtime（a）^xtime（b）=xtime（a^b）であるため，次のようにxtimeをまとめて計算することもできる。
m[0]=xtime（w[0]^w[1]）^w[1]^w[2]^w[3]
【００６０】
　MC全体では以下のような計算をすることになる。
　m[0]=xtime（w[0]^w[1]）^w[1]^w[2]^w[3]
　m[1]=xtime（w[1]^w[2]）^w[2]^w[3]^w[0]
　m[2]=xtime（w[2]^w[3]）^w[3]^w[0]^w[1]
　m[3]=xtime（w[3]^w[0]）^w[0]^w[1]^w[2]
　m[4]=xtime（w[4]^w[5]）^w[5]^w[6]^w[7]
　m[5]=xtime（w[5]^w[6]）^w[6]^w[7]^w[4]
　m[6]=xtime（w[6]^w[7]）^w[7]^w[4]^w[5]
　m[7]=xtime（w[7]^w[4]）^w[4]^w[5]^w[6]
　m[8]=xtime（w[8]^w[9]）^w[9]^w[10]^w[11]
　m[9]=xtime（w[9]^w[10]）^w[10]^w[11]^w[8]
　m[10]=xtime（w[10]^w[11]）^w[11]^w[8]^w[9]
　m[11]=xtime（w[11]^w[8]）^w[8]^w[9]^w[10]
　m[12]=xtime（w[12]^w[13]）^w[13]^w[14]^w[15]
　m[13]=xtime（w[13]^w[14]）^w[14]^w[15]^w[12]
　m[14]=xtime（w[14]^w[15]）^w[15]^w[12]^w[13]
　m[15]=xtime（w[15]^w[12]）^w[12]^w[13]^w[14]
【００６１】
　添え字の並びを考慮し，本実施形態では以下のようにxtimeを計算する。
　m[i]=xtime（w[i]^w[ofs1（i）]）^w[ofs1（i）]^w[ofs2（i）]^w[ofs3（i）]
【００６２】
　図１４は，詳細版擬似コードを状態遷移表として書き直した図である。図１５は，状態遷移表の各項目の読み方を表す図である。ｃｏｄｅは，５種類の命令のうち各状態で実行される機能（命令）のコードである。ｒｅａｄは，記憶装置３００からデータを読み出すときに１が設定され，読み出さない場合は０が設定される。ｗｒｉｔｅは，記憶装置３００にデータを書き込むときに１が設定され，書き込まない場合は０が設定される。ｆｕｎｃは，ＬＤ，ＸＴＩＭＥ，ＳＢＯＸ，ＸＯＲ，および，任意（ＡＬＵ１２０による演算は実行しない）のいずれかが設定される。ａｃｃ−ｗｅは，アキュムレータ１３０にデータを書き込むときに１が設定され，書き込まない場合は０が設定される。」
　
Ｍ．「
」
　
４．引用文献４について
　原審拒絶理由に引用された，特開２０１４−０８９２７１号公報（平成２６年５月１５日公開，以下，これを「引用文献４」という）には，関連する図面と共に，次の事項が記載されている。
　
Ｎ．「【０００８】
　＜実施形態１＞
　図１は，実施形態１における情報処理装置である。ここで，情報処理装置は，ハッシュ演算を行う装置である。
【０００９】
　ＣＰＵ１は，情報処理装置全体の制御を行う。とりわけ，後述のＤＭＡコントローラ２及びハッシュ演算部分回路３の状態制御を行う。
【００１０】
　ＤＭＡコントローラ２は，ＣＰＵ１またはハッシュ演算部分回路３からの信号に基づき任意の転送元アドレスと転送先アドレスの間でデータ伝送を行う。ＤＭＡコントローラ２は，データ伝送装置に相当する。
【００１１】
　ハッシュ演算部分回路３は，ハッシュ演算のうちの一部の演算を行う。具体的には，ハッシュ演算のうち，出力ビットのデータ長のデータをブロック毎に順序入替する回路（Ｐｅｒｍｕｔｅ回路）以外の演算を行う。ここでは，ＳＨＡ−３の候補であるＳＫＥＩＮアルゴリズムにおけるＭＩＸ回路に相当する。
【００１２】
　図２は，ＳＨＡ３のＳＫＥＩＮアルゴリズムにおける，ハッシュ長が１０２４ｂｉｔである場合のＰｅｒｍｕｔｅ回路とＭＩＸ回路の構成の一部を示している。１０２４ｂｉｔの入力に対して，６４ｂｉｔ×２入力をそれぞれＭＩＸ回路に入力し，出力された１０２４ｂｉｔをＰｅｒｍｕｔｅ回路に入力し，６４ｂｉｔ単位で並べ替える処理を７２回繰り返す。
【００１３】
　本実施形態は，図２に示されるＰｅｒｍｕｔｅ回路とＭＩＸ回路による処理を，ＤＭＡコントローラ２及びハッシュ演算部分回路３を１回以上用いることでハッシュ演算を実施するものである。ただし，ハッシュ演算部分回路３の演算内容はアルゴリズムに依存するが，いずれのアルゴリズムであっても，ハッシュ演算部分回路３は，順序入替する回路であるＰｅｒｍｕｔｅ回路以外の演算を行えばよい。また，ハッシュ演算部分回路３は演算アルゴリズムに応じた回路を複数実装もよい。
【００１４】
　ＲＡＭ４は，プログラムあるいはハッシュ演算の入出力及び中間値を保持し，ＣＰＵ１およびＤＭＡコントローラ２からアクセス可能である。
【００１５】
　システムバス５は，ＣＰＵ１，ＤＭＡコントローラ２，ハッシュ演算部分回路３及びＲＡＭ４が接続されている。
【００１６】
　次に，本実施形態を含んだＤＭＡコントローラ２について図３を用いて説明する。
【００１７】
　データ取得部２１は，バスインターフェイスであって，システムバス５に接続されており，ＣＰＵ１によって設定された転送元アドレスからハッシュ演算対象のデータを取得す
る。データは，ハッシュ演算部分回路３及びＲＡＭ４から取得する。
【００１８】
　ＤＭＡ転送用バッファ２２は，データ取得部２１で取得したデータを保持する。尚，ＤＭＡコントローラ２がサポートするバースト長分またはハッシュ長分のいずれか長い方以上の容量が必要である。仮にバス幅が６４ｂｉｔであり最大バースト長が８ｂｅａｔのＤＭＡ転送が可能である場合である場合には１０２４ｂｉｔのハッシュ値をサポートする場合においては，ハッシュ長の上限である１０２４ｂｉｔの容量以上を持つ必要がある。
【００１９】
　コマンド取得部２３はＣＰＵ１によって設定された，ハッシュアルゴリズムの情報を取得する。ここで，ハッシュアルゴリズムの情報は，ハッシュアルゴリズムを識別する情報だけでなく，出力されるハッシュ長に関する情報も含まれる。尚，ここで，ハッシュ長とは，ハッシュ演算後に得られるハッシュ値の長さである。
【００２０】
　データ送出部２４は，システムバス５に接続されており，ＣＰＵ１によって設定された転送先アドレスに対して，ＤＭＡ転送用バッファ２２のデータを出力する。このとき，データ送出部２４はＤＭＡ転送用バッファ２２に，後述のテーブルメモリ２５の内容に基づいて順次アクセスし，データを送出する。
【００２１】
　テーブルメモリ２５には，起動時にＣＰＵ１により後述のテーブル登録部２６を介してハッシュアルゴリズム毎に，ワード単位で入れ替える入替順序（Ｐｅｒｍｕｔｅの順序）が記録される。あるいは，ＣＰＵ１による記録ステップを省略し，従前にハッシュアルゴリズム毎に構成された固定のテーブルメモリであっても良い。テーブルメモリ２５のエントリは，ハッシュアルゴリズムに固有の値を複数設定することができる。尚，テーブルメモリ２５は，ハッシュアルゴリズム毎に，ワード単位で入れ替える順序を保持する保持部であればよい。
【００２２】
　図５は，順序入替テーブルの一例である。
【００２３】
　図５（ａ）は，ハッシュアルゴリズム毎の順序入替テーブルの例であり，ハッシュアルゴリズム毎に，読み出し順（入替順序）が記載されている。
【００２４】
　図５（ａ）は，ハッシュアルゴリズム１，ハッシュアルゴリズム２，ハッシュアルゴリズム３に対する，ワード単位毎の読み出し順が記載されている。ワード単位は，ハッシュアルゴリズムが特定されると決まる単位であって，処理単位である。ここでは，ワード単位が６４ｂｉｔであるハッシュアルゴリズムを処理する例を用いて説明する。ハッシュアルゴリズム１，ハッシュアルゴリズム２，ハッシュアルゴリズム３は，それぞれ，ハッシュ長が，２５６ｂｉｔ，５１２ｂｉｔ，１０２４ｂｉｔであり，ワード単位は６４ｂｉｔであるとする。ハッシュアルゴリズム１は，ＤＭＡ転送用バッファ２２のデータを，６４ｂｉｔ毎に，０番目，３番目，１番目，２番目の順に取得する。ここで，ＤＭＡ転送用バッファ２２のデータにある最初の６４ｂｉｔを，０番目と呼び，次の６４ｂｉｔを，１番目と呼ぶ。尚，最初の６４ｂｉｔを，ここでは，０番目と呼ぶが，１番目と呼んでもよい。その場合は，図５（ａ）のハッシュアルゴリズム１は，１，４，２，３と表記される。
【００２５】
　データ送出部２４は，ハッシュアルゴリズムの情報から，ワード単位を特定し，特定したワード単位毎に，テーブルに記載された順序で，ＤＭＡ転送用バッファにあるデータを取得する。具体的には，ハッシュアルゴリズムの情報から，６４ｂｉｔ毎に処理することを特定し，ＤＭＡ転送用バッファ２２のデータの，０番目にある６４ｂｉｔを取得する。次に，３番目にある６４ｂｉｔ，１番目にある６４ｂｉｔ，２番目にある６４ｂｉｔという順でデータを取得する。図５（ａ）は，テーブルに順序のみ記載しているので，テーブルサイズを小さくできる。また，ワード単位が異なるが，入替順序が同じであるような，
複数のハッシュアルゴリズムに対して，共用することも可能である。
【００２６】
　図５（ｂ）は，ハッシュアルゴリズム毎の順序入替テーブルの他の例で，ハッシュアルゴリズム毎に，データを所定の単位で入れ替えるための複数のアドレスが記載されている。つまり，複数のアドレスを用いて，データを順次，読みだすことで，結果として，データを所定の単位で入れ替えることが可能である。具体的には，ＤＭＡ転送用バッファ２２の読み出しのオフセットアドレスが直接記載されている。図５（ｂ）は，図５（ａ）と同様，ハッシュアルゴリズム１，ハッシュアルゴリズム２，ハッシュアルゴリズム３は，それぞれ，ハッシュ長が，２５６ｂｉｔ，５１２ｂｉｔ，１０２４ｂｉｔであり，ワード単位を，６４ｂｉｔである。
【００２７】
　データ送出部２４は，ＤＭＡ転送用バッファのベースアドレスにテーブルメモリから読み出されたオフセットアドレスを加えたアドレスにアクセスすることを，テーブルに記載された順に行うことで，データを取得する。図５（ｂ）は，読み出し順のアドレスが記載されているので，ハッシュアルゴリズムの情報から，ワード単位を特定する必要がなくなる。
【００２８】
　テーブル登録部２６は，ＣＰＵ１から転送されたハッシュアルゴリズム毎に，ワード単位でデータを入れ替える順序をテーブルメモリ２５に記録する。テーブル登録部２６はＣＰＵ１からハッシュアルゴリズム毎の転送順序を取得し，ハッシュアルゴリズムに応じたＩＤとともに図５に示す順序入替テーブルを作成し，テーブルメモリ２５に記録する。この処理は，後述のステップＳ１０１で実施される内容であり，電源投入時やシステム起動時に１度実施されれば良い。あるいは，工場出荷時にテーブルメモリ２５を予めＲＯＭに記録しておけば，テーブル登録部２６は省略することができる。」
　
５．引用文献５について
　原審拒絶理由に引用された「Poettering, B., RijndaelFurious, AVRAES: The AES block cipher on VR controllers, [online], 2007年3月11日,［2017年1月10日検索］,インターネットURL:http://point-at-infinity.org/avraes/rijndaelfurious.asm.html,http://point-at-infinity.org/avraes/」（以下，これを「引用文献５」という）には，「ＡＥＳ」のソフトウェア実装に関する開示がある。
　
６．引用文献６について
　原審拒絶理由に引用された「Joppe, W. B. et al.,Fast Implementations of AES on Various Platforms, Cryptology ePrint Archive: Report 2009/501, [online], 2009年11月6日,［2017年1月10日検索］, インターネットURL:http://eprint.iacr.org/2009/501」（以下，これを「引用文献６」という）には，関連する図面と共に，次の事項が記載されている。
　
Ｏ．「This paper presents new software speed records for encryption and decryption using the block cipher AES-128 for different architectures.」（１頁１行〜２行）
（この論文は，異なるアーキテクチャのための，ブロック暗号ＡＥＳ−１２８を用いるところの，暗号化，及び，復号に関して，新しい，ソフトウェアの速度記録を提示する。）
　
第４．本願発明と引用発明との対比及び相違点についての判断
１．本願発明１について
（１）対比
ア．引用発明は，「データをＡＥＳ方式で暗号化する情報処理装置」に関するものであって，「ＡＥＳ方式」は，「共通鍵暗号」であるから，復号にも用いられ得るものであるので，
　本願発明１における「演算装置と，ＡＥＳ方式で前記演算装置に，暗号化されたデータ又は平文のデータである第１データを暗号化又は復号化させるための処理を実行させるプログラムを記憶する記憶装置とを有する組み込みシステムが有する前記演算装置に，各処理を実行させるためのプログラム」とは，
“暗号化されたデータ又は平文のデータである第１データを暗号化又は復号化されるためのもの”である点で共通する。
　
イ．引用発明における「拡張鍵データを生成する処理を行う生成処理手段」と，
　本願発明１における「１バイト単位の変数の配列を用いて，拡張鍵データを生成するのに入力される第２データを１バイトごとに処理して前記拡張鍵データを生成する処理を行う生成処理手順」とは，
“拡張鍵データを生成する処理を行う生成処理部”である点で共通する。
　
ウ．引用発明における「データを並び替える処理である並替処理を行う並替処理手段」と，
　本願発明１における「第１データを並替テーブルを用いて並び替える処理である並替処理を行わせる並替処理手順」とは，
“データを並び替える処理である並替処理を行う並替処理部”である点で共通する。
　
エ．引用発明における「並替処理されたデータを１次元の配列の置換テーブルを用いて置換する処理である置換処理を行う置換処理手段」と，
　本願発明１における「並替処理されたデータを１次元配列の置換テーブルを用いて置換する処理である置換処理を行わせる置換処理手順」とは，
“並替処理されたデータを１次元の配列の置換テーブルを用いて置換する処理である置換処理を行う置換処理”である点で共通する。
　
オ.引用発明における「置換処理されたデータを変換する処理である変換処理を行う変換処理手段」と，
　本願発明１における「置換処理されたデータを等価式に基づいて変換する処理である変換処理を行わせる変換処理手順」とは，
“置換処理されたデータを変換する処理である変換処理を行う変換処理部”である点で共通する。
　
カ．引用発明における「拡張鍵データ及び前記変換処理されたデータの排他的論理和を計算する処理である拡張処理を行う拡張処理手段」と，
　本願発明１における「拡張鍵データ及び前記変換処理されたデータに基づいての排他的論理和を計算する処理である拡張処理を行わせる拡張処理手順」とは，
“拡張鍵データ及び前記変換処理されたデータに基づいての排他的論理和を計算する処理である拡張処理を行わせる拡張処理部”である点で共通する。
　
キ．引用発明における「並替処理，前記置換処理，前記変換処理，及び前記拡張処理を４バイトごとに処理する」ことと，
　本願発明１のおける「並替処理，前記置換処理，前記変換処理，及び前記拡張処理を４バイトごとに実行させる」こととは，
“前記並替処理，前記置換処理，前記変換処理，及び前記拡張処理を４バイトごとに行う”ことである点で共通する。
　
ク．以上，上記ア．〜キ．において検討した事項から，本願発明１と，引用発明との，一致点，及び，相違点は，次のとおりである。
　
［一致点］
　暗号化されたデータ又は平文のデータである第１データを暗号化又は復号化されるためのものであって，
　拡張鍵データを生成する処理を行う生成処理部と，
　前記データを並び替える処理である並替処理を行う並替処理部と，
　前記並替処理されたデータを１次元の配列の置換テーブルを用いて置換する処理である置換処理を行う置換処理と，
　前記置換処理されたデータを変換する処理である変換処理を行う変換処理部と，
　前記拡張鍵データ及び前記変換処理されたデータに基づいての排他的論理和を計算する処理である拡張処理を行わせる拡張処理部と，を有し，
　前記並替処理，前記置換処理，前記変換処理，及び前記拡張処理を４バイトごとに行う，暗号化又は復号化されるためのもの。
　
［相違点１］
“暗号化又は復号化されるためのもの”に関して，
　本願発明１においては，「演算装置に，各処理を実行させるためのプログラム」であるのに対して，
　引用発明においては，「情報処理装置」である点。
　
［相違点２］
“生成処理部，並替処理部，置換処理，変換処理部，及び，拡張処理部”に関して，
　本願発明１においては，「生成処理手順」，「並替処理手順」，「置換処理手順」，「変換処理手順」，及び，「拡張処理手順」が，「プログラム」における，一連の「処理手順」であるのに対して，
　引用発明においては，「生成処理手段」，「並替処理手段」，「置換処理手段」，「変換処理手段」，及び，「拡張処理手段」が，それぞれ，「情報処理装置」の“装置構成”の一部である点。
　
［相違点３］
“拡張鍵データを生成する処理”に関して，
　本願発明１においては，「１バイト単位の変数の配列を用いて，拡張鍵データを生成するのに入力される第２データを１バイトごとに処理して前記拡張鍵データを生成する処理」であるのに対して，
　引用発明においては，「１バイト単位の変数の配列を用いて，拡張鍵データを生成するのに入力される第２データを１バイトごとに処理」することについては，言及されていない点。
　
［相違点４］
“置換処理されたデータを変換する処理”に関して，
　本願発明１においては，「置換処理されたデータを等価式に基づいて変換する処理」であるのに対して，
　引用発明においては，「等価式に基づく」点については，言及がない点。
　
（２）判断
　事案に鑑みて，上記相違点３について先に検討すると，相違点３に係る“１バイト単位の変数の配列を用いて，拡張鍵データを生成するのに入力される第２データを１バイトごとに処理して前記拡張鍵データを生成する処理”は，本願発明１においては，「プログラム」が，「演算装置」に実行されるもの，即ち，「プログラム」である。
　そして，本願発明１は，既存の組み込み用のハードウェアにおいて，ＡＥＳを実行できるようにすることを，発明の課題としている。
　一方，上記Ｈ，及び，Ｉに記載を引用した，引用文献２は，“ＦＰＧＡに８−ｂｉｔのＡＥＳを実装する”ことが開示されているが，これは，“ＦＰＧＡ上に８−ビット処理のハードウェアを構築する”ものであって，“既存のハードウェアが処理可能なプログラム”を示すものではない。その他，上記に記載を引用した，引用文献３〜引用文献６の何れにも，当該「プログラム」に関する記載は存在せず，本願の出願前に周知技術であるともいえない。
　したがって，他の相違点について判断するまでもなく，本願発明１は，当業者であっても引用発明，引用文献２〜引用文献６に記載された技術的事項に基づいて容易に発明できたものであるとはいえない。
　
２．本願発明２〜本願発明５について
　本願の請求項２〜本願の請求項５は，本願の請求項１を引用するものであるから，本願発明２〜本願発明５についても，上記「１．本願発明１について」の「イ．判断」において検討した，［相違点３］に係る構成を有している。
　したがって，本願発明１と同じ理由により，当業者であっても，引用発明，引用文献２〜引用文献６に記載された技術的事項に基づいて容易に発明できたものとはいえない。
　
第５．原審拒絶査定の概要及び原審拒絶査定についての判断
　原審における平成２９年６月１５日付けの拒絶査定（以下，これを「原審拒絶査定」という）は，請求項１〜請求項１０について，引用文献１〜引用文献６に基づいて，当業者が容易に発明できたものであるから，特許法第２９条第２項の規定により特許を受けることができないというものである。しかしながら，平成３０年１２月７日付け手続補正により補正された請求項１〜請求項５は，上記において検討した，［相違点３］に係る構成を有するものとなっており，上記のとおり，本願発明１〜本願発明５は，上記引用文献１に記載された発明及び上記引用文献２〜引用文献６に記載された技術的事項に基づいて，当業者が容易に発明できたものではない。したがって，原査定を維持することはできない。
　
第６．当審拒絶理由について
１．平成３０年４月１９日付けの拒絶理由（以下，これを「当審拒理１」という）
（１）３６条６項２号について，
ア．請求項１に係る発明が，ＡＥＳのハードウェア実装を示すのか，ソフトウェア実装を示すのか不明である。
イ．請求項９に係るプログラムに関する発明を，どのようにプログラムとして実現してるか不明である。
　
（２）３６条４項１号について
　本願の請求項１に記載の「生成処理部」，「並替処理部」，「置換処理部」，「変換処理部」，「拡張処理部」，及び，「ＡＥＳ方式に係る各処理を実行させるための高水準言語のプログラムを記憶する記憶部」に関して，本願明細書の発明の詳細な説明に記載の内容からは，不明である。
　
２．平成３０年１１月３０日付けの拒絶理由
・３６条６項２号について
（１）当審拒理１において補正された，請求項１に記載の「生成処理部」をどのように実現しているか，不明である。
　
（２）当審拒理１において補正された，「生成処理手順」をどのように実現しているのか不明である。
　
　上記指摘の拒絶理由は，何れも，平成３０年１２月７日付けの手続補正により解消している。
　
第７．むすび
　以上のとおり，本願発明１〜本願発明５は，当業者が引用発明，及び，引用文献２〜引用文献６に記載された技術的事項に基づいて容易に発明をすることができたものではない。
　したがって，原査定の理由によっては，本願を拒絶することはできない。
　また，他に本願を拒絶すべき理由を発見しない。
　
　よって，結論のとおり審決する。