Top Page

CMS(RFC.5652 & PKCS#7)対応 暗号/復号ユーティリティ

概要(Summary)

本ソフトについて

単一ファイルに対して、暗号・復号を行うソフトウェアです。
本ソフトウェアは、暗号化ファイルの構造や、各種のアルゴリズムについて、 国際的な標準類(ITU, Fips, PKCS, JIS, RFC等)に準拠しており、 これらに準拠している他のソフトウェアと互換性があります。

暗号化ファイルは、暗号メッセージ構文(CMS:RFC.5652)に準拠しており、以下の特徴があります。

  • 疑似乱数を用いる事により、同じパスワードでも毎回異なった暗号文が生成されます。
    その為、例えば定時報告等、一定時間で同一内容の文章が送られる場合において、暗号文が異なるため暗号化前の文章が推測不能になります。
  • 用いたアルゴリズムとそのパラメータ(平文の鍵やパスワードを除く)はファイル中に保存されるため、 復号時の際は正しい鍵もしくはパスワードを指定するだけで復号できます。

又、AES暗号処理部では、アセンブリ言語にてSIMD(SSE2)命令セットを使用して記述されているため、従来より高速に処理可能です。

※CUI(コマンドライン・ユーザー・インターフェイス)アプリケーションです。

仕様

これらのデータの構造はASN.1(抽象構文表記法)にて定義されています。
本ソフトでは、DER(※BERをより厳しくした規則)での符号化に対応しています。

対応暗号ファイル形式

CMS(暗号メッセージ構文)

暗号文、電子証明書などの構文を定める規格で、PKCS#7の上位互換となる規格です。
本ソフトでは、暗号文の処理に対応しています。

対応するデータ・タイプ

  • 暗号化データ(Encrypted-Data)
    暗号ファイルには、暗号文のみが格納されます。鍵管理はされません。
  • 封筒化データ(Enveloped-Data)
    鍵管理手法(Key Management Algorithm)により暗号鍵を管理する暗号ファイルです。

対応鍵ファイル形式

PKCS#8 [Private-Key Information Syntax Specification Version 1.2]

暗号鍵を格納するファイルです。
本来は、秘密鍵(RSA暗号などの)を格納するための規格ですが、本ソフトでは共通鍵(DES, AESなどの)を格納しています。
構文の詳細について、"RFC.5208 [PKCS#8]"を参照。

鍵ファイルは、暗号化データ(Encrypted-Data)において鍵で暗号化する場合に使いますが、このタイプでの暗号化はお勧めしません。
セキュリティ確保のため、暗号化に際しては鍵管理される封筒化データ(Enveloped-Data)をお勧めします。
尚、この暗号鍵ファイルは暗号化されないので、バイナリエディタ等でファイルを見ることですぐに暗号鍵が解ってしまいます。
このファイルの扱いは注意してください(PKCS#8は、既に過去の規格です)。

対応アルゴリズム

ダイジェスト(ハッシュ)

コンテンツのダイジェスト値(バイト列)を求めるためのアルゴリズムです。
また、HMACアルゴリズムにおいても、このアルゴリズムが土台になります。

  • SHA-1     … oid = 1.3.14.3.2.26
  • SHA-224    … oid = 2.16.840.1.101.3.4.2.4
  • SHA-256    … oid = 2.16.840.1.101.3.4.2.1

鍵管理手法

暗号鍵を管理する手法です。
本ソフトでは、パスワードによる鍵管理手法に対応しています。

・鍵導出による鍵管理

パスワードを用いて暗号鍵を管理する手法です。

  • id-alg-PWRI-KEK     … oid = 1.2.840.113549.1.9.16.3.9

コンテンツ用暗号

コンテンツを暗号・復号するためのアルゴリズムです。

  • DES-CBC     … oid = 1.3.14.3.2.7
  • DES-3EDE-CBC   … oid = 1.2.840.113549.3.7
  • AES-128-CBC   … oid = 2.16.840.1.101.3.4.1.2
  • AES-192-CBC   … oid = 2.16.840.1.101.3.4.1.22
  • AES-256-CBC   … oid = 2.16.840.1.101.3.4.1.42

メッセージ認証符号

コンテンツに改ざんが無いか確認するためのアルゴリズムです。
その他、鍵導出関数PBKDF2にも用いられ、本ソフトではこの用途にて使用しています。

  • HMAC-SHA-1   … oid = 1.3.6.1.5.5.8.1.2
  • HMAC-SHA-224  … oid = 1.2.840.113549.2.8
  • HMAC-SHA-256  … oid = 1.2.840.113549.2.9

鍵導出手法

パスワードを用から、コンテンツ用の暗号鍵を計算するアルゴリズムです。

  • PBKDF2     … oid = 1.2.840.113549.1.5.12

疑似乱数 (※セッション鍵や、初期化ベクタIVに用います。)

  • Mersenne Twister + SHA-256

ダウンロード(Download)

全て、アセンブリ言語(Microsoft Macro Assembler)及び、C++言語(Microsoft Visual C++.net 2008)のソースつきです。
尚、全てCUI(コマンドライン・ユーザー・インターフェイス)です。

AES暗号(AES Cryptograph)
File name Programer Categoly
Win2k〜 32bit)
CMS192.zip
S.W. CMS Version 1.92
ソフトウェア本体(cms.exe)と、取説(cms.chm, readme.txt)です。
Win2k〜 32bit)
CMS192_Src.zip
S.W. CMS Version 1.92 (ソースリスト付き)
ソフトウェア(C++, アセンブリ言語)及び、 ヘルプファイル(HTML, CSSファイル)のソースリストも含めたヴァージョンです。
Win2k〜 32bit)
sha.zip
S.W. このアプリケーションは、指定されたファイルのSHA-1, SHA-224, SHA-256ハッシュ値を計算するソフトウェアです。
以下のハッシュ値を計算して、標準出力に返します。
  • SHA-1
  • SHA-224
  • SHA-256
Win2k〜 32bit)
20110127_sse_aes.zip
S.W. CMS形式ではない、独自の形式を吐いていた時代の旧Version。
過去Versionの独自暗号化ファイルの為に残しておきます。

※ 注意 ※
ハッシュ関数の出力において4Byte単位で上位Byte,下位Byteが反転しているバグがあります。
ビッグエンディアンに直し忘れていました。

注意

基本的に、ソースコードは全て公開していますが、
本サイトにて公開されるクラスや、ソースコードの流用をする際は、ご一報ください。
又、本クラスや、ソースコードの利用により発生したいかなる損害につきましては
法律が許容する最大限において責任を負いませんので、使用者の責任の元、ご利用頂ければ幸いです。

使い方

CUI(コマンドライン・ユーザー・インターフェイス)アプリケーションです。
DOS窓や、コマンドプロンプトで使ってください。

バッチ(*.bat)を組みたい人や、D&D用のショートカット用アイコンを作りたい人には、きっと便利かもしれません。
それ以上に、自分の作ったソフトに、クラスをそのまま組み込みたい人にも便利でしょう。
でも、単一ファイルにしか処理をかけないので、複数のファイルをまとめて暗号化したい場合は、別途に圧縮ソフトとかで圧縮して下さい。

コマンドライン・オプション

CMS filename.ext /option

filename.ext 復号するファイル名(拡張子".p7"は省いてください)
もしくは、暗号化したいファイル名を指定します。

/option
/D 復号処理をします。 (Default)
/E 暗号処理をします。
/Tn出力のファイル形式を指定します。
 3 : Enveloped-data Type (Default)
    ↑セキュリティ性確保の為、なるべくこちらをお使いください。
 6 : Encrypted-data Type
    ↑過去バージョン(AES Ver,1.00)の出力形式です。
/Mn使用する暗号アルゴリズムを指定します。
 1 … DES-CBC ← 弱い暗語であり、標準類は廃止されました。
 2 … DES-3EDE-CBC ← 過去のシステムとの互換性のため、どうしても必要な時に使ってください。
 3 … AES-CBC 128bit
 4 … AES-CBC 192bit
 5 … AES-CBC 256bit (Default)
/Wstrパスワードを指定します。
・Enveloped-data Typeを出力する(/T3を指定)時は、必ずパスワードを設定してください。
・Encrypted-data Typeを出力する(/T6を指定)時に、 設定しなかった場合は暗号鍵は疑似乱数で作成し、 暗号鍵ファイル"filename.ext.key"(PKCS#8形式)に鍵を保存します。
/Fkstr暗号鍵ファイル(PKCS#8形式のファイル)を指定します。
このオプションを使用時は、必ず、Encrypted-data Type(オプションで/T6)を指定してください。
暗号/復号時に、指定されたファイルを暗号鍵にします。

注意

暗号は、今現在においても軍事技術であり、情報戦という戦争における「武器」です。
暗号の輸出には、日本国においても「外国為替および外国貿易法」に基づく輸出許可又は役務取引許可(以下、輸出許可等)の手続きが原則必要となります。
また、国によっては、無認可で暗号を使用した場合、その国の法律によって罰せられる事がありますので、ご注意ください。
(日本国内で刀・銃の使用に認可が必要なように、暗号の使用には認可が必要な国もあります。)
日本国内においての暗号の使用は、問題ないはずです。

技術資料

各関数の開発時の産物

資料
File name Programer Categoly
Win2k〜 32bit)
test.zip
S.W. 以下のアルゴリズムについて、テストベクタを計算しています。
  • ハッシュ関数
    (入力データの要約を求める関数。電子署名、電子証明書等でデータ改ざんの検出の為に使われる。)
    • SHA-1
    • SHA-224
    • SHA-256
  • HMAC関数
    (鍵付きのハッシュ関数。MAC(メッセージアクセス認証)等で使われる。)
    • HMAC with SHA-224
    • HMAC with SHA-256
  • KDF関数
    (鍵導出関数。入力データ(パスワード・パスフレーズ等)から、暗号鍵を生成する為の関数。)
    • PBKDF2 with HMAC-SHA-1
  • 暗号
    (暗号鍵を用いて、暗号文・平文を計算する関数。)
    • DES
    • Triple DES
DOS 3.0〜 16bit)
asn2txt.zip
S.W. ASN.1 (Abstract Syntax Notation One) の BER (Basic Encoding Rules) エンコーディングされたデータを、 テキストに整形するプログラムです。
例えば、.p7b(電子署名), .p7s(電子証明書), .pfx(個人情報交換構文), 暗号メッセージ標準構文 等のBERエンコーディングされたバイナリデータを、テキストに変換し読みやすくします。
※暗号文が解読できるわけでは有りませんが、電子証明書等に入っている公開鍵等は解ります。

intel SSE2命令(SIMD)によるAES暗号処理 高速化実験資料

inten AVX (AES-NI) について

尚、しばらくは、intel AVXが導入されたCPUが搭載されたパソコン等を購入する予定は無いので、
intel AVX版の暗号ソフトは、当分の間は作らない(作れない)と思います。
最新のPCを買うとか、そんな金があったら、オーボエ・ダモーレ買います!!。

↑ と書きましたが、調べてみたら、こんな誰でも思いつく事が特許にされていたので、作れないです。
パラレル・モードでの先進暗号化標準(AES)の暗号化および復号を最適化する方法および装置
誰だ?、こんな誰でも思いつくのを特許にした奴は…と見てみたらintelでした…。
単純に、各xmmレジスタに各ブロックを入れて、intel AVX(AES-NI)命令で並列で処理しているだけです。
パイプライン化されるので、相当早くなります。
ただ、CBCモードの暗号処理にはこの特許の技術は使えないけど(復号処理には使える)。

とりあえず、特許は「出願前にその発明と同じ技術が世の中に知られていない事」も特許登録の条件なので、
使った技術を全部Webに書いておく事で、他社に特許にされる事は無いでしょう。
もちろん、私もこれを特許にしようとか思ってないです。

ソフトウェアによる暗号ソフトのセキュリティーレベル

リスク
高レベルセキュリティーの暗号製品の要件として、秘密情報(暗号鍵等)を探られないようにする為、 外部から暗号・復号を処理する回路やソフトウェア(メモリ等)へアクセスされる事を防ぐ必要があります。
(例:暗号回路を分解したら、暗号鍵や平文が0クリアされる or 暗号回路が破壊され解析も使用も不能になる等。)

しかしながら、Microsoft(R) Windows製品においては、 ソフトウェア(プロセス)は通常、外部プロセスから当該プロセス(仮想メモリ等)へアクセスが可能な権限で実行されます。
(Ctrl + Alt + Deleteで、プロセスを強制停止したり、ソフトウェアのデバッグの為。)
つまり、実行中の当該ソフトの仮想メモリをアクセスして秘密鍵を収集するウィルスを、書こうと思えば書けてしまいます。
(単一ソフトウェアで作られた暗号製品には全てこのリスクがあります。私のソフトウェアに限りません。)

解決策
直接起動する場合は、現状のWindows(2011年現在)には、外部からのアクセスを検知する手段が無く、 又、自プロセスからはアクセス権の変更ができない為、対策不能です。
外部のアプリケーションから当該プログラムを呼び出す際は、 当該プロセスへのReadProcessMemory()関数(Windows API)を拒絶するセキュリティ権限で 当該プログラムを実行する事をお勧めします。
具体的には、CreateProcess()関数にて当プログラムを呼び出す際に、引数にセキュリティ記述子を設定してください(PROCESS_ALL_ACCESS & ~PROCESS_VM_READ)。
その為に、あえてDLL形式にしていないです。

参考文献

文献
(著)尾関 和彦 情報技術のための離散系数学入門(共立出版社)
intel IA-32 インテル(R) アーキテクチャ ソフトウェア・デベロッパーズ・マニュアル
・上巻:基本アーキテクチャ(資料番号253665-013J)
・中巻A:命令セット・リファレンスA-M (資料番号253666-013J)
・中巻B:命令セット・リファレンスN-Z (資料番号253667-013J)
・下巻:システム・プログラミング・ガイド(資料番号253668-013J)
intel インテル・アーキテクチャ最適化マニュアル
資料番号242816J-003
intel インテル(R) アーキテクチャ最適化
資料番号:730795J-001

標準類
T-REC-X.680 Abstract Syntax Notation One (ASN.1): Specification of basic notation
T-REC-X.690 ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)
Fips. 46-3 DATA ENCRYPTION STANDARD (DES)
Fips.180-3 Secure Hash Standard (SHS)
Fips. 197 ADVANCED ENCRYPTION STANDARD (AES)
RFC. 2104 HMAC: Keyed-Hashing for Message Authentication
RFC. 2202 Test Cases for HMAC-MD5 and HMAC-SHA-1
RFC. 2315 PKCS #7: Cryptographic Message Syntax (CMS)
RFC. 2898 PKCS #5: Password-Based Cryptography Specification Version 2.0
RFC. 3211 Password-based Encryption for CMS
RFC. 3370 Cryptographic Message Syntax (CMS) Algorithms
RFC. 3565 Use of the Advanced Encryption Standard (AES) Encryption Algorithm in Cryptographic Message Syntax (CMS)
RFC. 3714 US Secure Hash Algorithm 1 (SHA1)
RFC. 3874 A 224-bit One-way Hash Function: SHA-224
RFC. 4231 Identifiers and Test Vectors for MAC-SHA-224, HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512
RFC. 4634 US Secure Hash Algorithms (SHA and HMAC-SHA)
RFC. 5208 PKCS #8: Public-Key Cryptography Standards: Private-Key Information Syntax Specification Version 1.2
RFC. 5652 Cryptographic Message Syntax (CMS)
RFC. 5754 Using SHA2 Algorithms with Cryptographic Message Syntax
RFC. 6070 PKCS #5: Password-Based Key Derivation Function 2 (PBKDF2) Test Vectors

Copyright

各技術の著作権は、各技術の設計者にあります。

アルゴリズム 設計
暗号関数:
AES (Advanced Encryption Standard)
Joan Daemen博士, Vincent Rijmen博士
技術コンサルティング:アメリカ国家安全保障局(NSA)
ハッシュ関数:
SHA (Secure Hash Algorithm)
アメリカ国家安全保障局(NSA)
擬似乱数:
MT (Mersenne Twister)
Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved.
松本眞教授 西村拓士助手
ライセンス条文

本ソフトウェアの著作権は、私S.W.に帰属します。

メール :メールアドレス
URL :S.W. Homepage
mixi:id=16558

誤植、改善案等ありましたら、お気兼ねなく連絡頂けると幸いです。