12
Common Cryptoを使っ た共通鍵の暗号と復号 Masayuki Nii [email protected] Cocoa Study #60 July 6, 2013 1 1375日金曜日

Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

Embed Size (px)

Citation preview

Page 1: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

Common Cryptoを使った共通鍵の暗号と復号

Masayuki [email protected]

Cocoa Study #60July 6, 2013

113年7月5日金曜日

Page 2: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

Agenda

OS X/iOSの暗号関連フレームワーク

Common Cryptoを使う

SecTransferを使う

213年7月5日金曜日

Page 3: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

Developer文書をひもとく

Security Starting Point• 認証認可、暗号化、コードのセキュリティ• Common Cryptoについては、CC_crypto(3cc)のmanを参照• リンクすらなし。さらに、Mountain Lionはmanでも出てこないSecurity Overview• まあ、オーバービューCryptographic Services Guide• CDSA/CSSMはdeprecatedだよ、乱数なんてこの領域か!Security Transforms Programming Guide.• CベースのAPI(つまりCore Foundationっぽい感じ)• 暗号やBase64などのエンコード関連、署名などを簡単にできる• 「トランスフォーム」をつなげてまとめて処理ができる• Grand Central Dispatch対応!

313年7月5日金曜日

Page 4: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

暗号や復号について

OpenSSLが組み込まれている• EVT_*というC関数コールがあるが、deprecatedになっている• サポートしている暗号化方式が古く、AESがどうもないみたい• APIがコロコロ変わるのでサポートしたくないらしいCommon Crypto• Leopard、iOS 5以降で利用可能• ローレベルのAPIを提供する• つまり、SecTransformが上位層となるCryptographic Message Syntax Services• S/MIME向けとあるが、そんなに上位層な感じはしない

413年7月5日金曜日

Page 5: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

Common Cryptoによる暗号化と復号

513年7月5日金曜日

Page 6: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

Common CryptoのAPI準備• #include <CommonCrypto/CommonCryptor.h>、フレームワークは不要

初期化• CCCryptorCreate関数でCCCryptorRefを取得• このときにキーや初期化ベクタ、暗号化方式を指定

データ変換• CCCryptorUpdate関数を繰り返し呼び出す• バッファを確保してうんぬん…なので、K&R Cっぽく書くことに

後処理• 全データを処理後、CCCryptorFinalを呼び、残りを取り出す• CCCryptorReleaseで、CCCryptorRef構造体を解放

要するに• OpenSSLのEVT_*関連APIとほぼ同じ• ブロッキング不要なら1コールで暗号復号可能

613年7月5日金曜日

Page 7: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

情報はどこにあるのか?

manはないけど、developerサイトにLionのmanがある

713年7月5日金曜日

Page 8: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

はまりどころ

サンプルコード• CryptoExerciseというのがDeveloperサイトにある• SecKeyWrapperクラスのdoCipher:メソッドApple以外のサイトでは• いくつかのブログや、StackOverflowを見ればサンプルはあるはまったところ• なぜか、別スレッドで動いてくれない• manではスレッドをまたがなければOKとはなっているが…• パディングに気をつけよう

813年7月5日金曜日

Page 9: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

SecTransferによる暗号復号

913年7月5日金曜日

Page 10: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

SecTransformの利用方法

準備• フレームワークの追加、ヘッダ追加は必要なし初期化• SecKeyCreateFromDataで、キーのオブジェクトを作成• SecEncryptTransformCreateで、トランスフォームを準備• 必要なら属性をSecTransformSetAttributeで追加設定実行• SecTransformExecuteを呼び出すだけ。非同期実行もあるその他• 複数のトランスフォームをつなげて処理ができる• ファイル入力というトランスフォームもある

1013年7月5日金曜日

Page 11: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

すべてがバラ色ではない

用意されているトランスフォーム• SecDecodeTransform.h• SecDigestTransform.h• SecEncodeTransform.h• SecEncryptTransform.h• SecSignVerifyTransform.h• SecTransformReadTransform.hLion以降、iOSは非対応• iOSでサポートがあるのは、SecKeyEncrypt、 SecKeyDecryptなどの一部の関数のみ

出力するというトランスフォームがない• ファイルの内容をそのまま暗号化してファイルに保存は無理?• 自分でトランスフォームが書けるとは言え…

1113年7月5日金曜日

Page 12: Cocoa勉強会#60-Common Cryptoを使った共通鍵の暗号と復号

まとめ

CommonCrypto• ちょっと大変だが、ともかく使えるSecTransfer• 今後に期待

1213年7月5日金曜日