Top Page

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

概要(Summary)

本ソフトについて

単一ファイルに対して、暗号・復号を行うソフトウェアです。
入出力する暗号ファイルはCMS(*1)に準拠しており、以下の特徴があります。

  • 疑似乱数を用いる事により、同じパラメータでも毎回異なった暗号文が生成されます。
    その為、例えば、定時報告等の一定時間で一定の定型文が送られる場合でも、暗号文が異なる為、暗号化前の平文が推測不能になります。
  • 用いたアルゴリズムとそのパラメータ(平文の鍵やパスワードを除く)はファイル中に保存されるため、 復号時の際は正しい鍵もしくはパスワードを指定するだけで復号できます。
  • 今後、暗号メッセージ構文(CMS)に対応した暗号ソフトが出てきたら、暗号ファイルに互換性があるはずです。
    その為、暗号ファイルが使っているアルゴリズムにさえ対応していれば、暗号ファイルを相互に扱えるはずです。
    (ソフト側が対応していれば、暗号ファイル自体は様々なアルゴリズムが使える仕様になっています。)

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

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

仕様(Specifications)

対応暗号ファイル形式

CMS (*1)

対応データ・タイプ(及び、暗号鍵管理手法)

  • 暗号化データ(Encrypted-Data)   … 暗号ファイルには、暗号文のみが格納されます。鍵管理はされません。
  • 封筒化データ(Enveloped-Data)   … 鍵管理手法(Key Management Algorithm)により暗号鍵を管理する暗号ファイルです。
    対応鍵管理手法:
    • 鍵導出(Key Derivation)   … パスワードによって暗号鍵が管理されます。

      ASN.1(*2)の対応符号化規則

      • BER (*3)
      (*1) CMS
      暗号メッセージ構文(Cryptographic Message Syntax)   … (参考 : RFC.5652 & PKCS#7)
      (*2) ASN.1
      抽象構文記法1(Abstract Syntax Notation One)   … (参考 : ITU-T Rec. X.680 & ISO/IEC 8824-1 & JIS X 5603:1990)
      (*3) BER
      基本符号化規則(Basic Encoding Rule)   … (参考 : ITU-T Rec. X.690 & ISO/IEC 8825-1 & JIS X 5604:1990)

      対応アルゴリズム

      ハッシュ関数

      • 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

      鍵付きハッシュ関数

      • 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

      コンテンツ用暗号関数

      • 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     … 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)
      CMS191.zip
      S.W. Version 1.91
      単一ファイルに対して、暗号・復号を行うソフトウェアです。
      暗号メッセージ構文(Cryptographic Message Syntax:CMS)(RFC.5652)に準拠しています。
      又、AES暗号処理では、SIMD(SSE2)命令セットを使用し、高速に処理します。
      ソフト名称を、"AES"から"CMS"に変更しました。
      暗号鍵管理手法は、鍵導出(パスワード)に対応しています。
      Win2k〜 32bit)
      20110127_sse_aes.zip
      S.W. CMS形式ではない、独自の形式を吐いていた時代の旧Version。
      過去Versionの独自暗号化ファイルの為に残しておきます。

      ※ 注意 ※
      ハッシュ関数の出力において4Byte単位で上位Byte,下位Byteが反転しているバグがあります。
      ビッグエンディアンに直し忘れていました。
      Win2k〜 32bit)
      sha.zip
      S.W. このアプリケーションは、指定されたファイルのSHA-1, SHA-224, SHA-256ハッシュ値を計算するソフトウェアです。
      以下のハッシュ値を計算して、標準出力に返します。
      • SHA-1
      • SHA-224
      • SHA-256

      注意

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

      使い方

      コマンドラインアプリケーションです。
      コマンドプロンプトで使ってください。
      また、バッチを組むのも良いかと思います。
      詳細は、アーカイブ内のテキストファイルを参照して下さい。

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

      世の中、GUIで動くソフトが多いですが、Windows 7で動作する有料版のVisual C++を所有していないので、GUIは作れません。
      (OSが変わるたびに高い金で開発環境を買うのが嫌なので。)

      注意

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

      技術資料

      各関数の開発時の産物

      資料
      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

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