- Cryptography API: Next GenerationでECDSAでDH鍵交換し、AESで暗号化する処理の大まかな流れのメモ。
- BCryptOpenAlgorithmProviderで鍵交換用プロバイダー(BCRYPT_ECDH_P256_ALGORITHM)を開く。
- BCryptGenerateKeyPairでキーペアを作成。
- BCryptFinalizeKeyPairでキーペアを作成を完成させる。
- BCryptExportKeyで公開鍵をエクスポートする。
- 相手に自身の公開鍵を渡す。
- 相手から相手の公開鍵を受け取る。
- 受け取った公開鍵をBCryptImportKeyでインポートする。
- BCryptSecretAgreementで、自身の秘密鍵と受け取った公開鍵で共有シークレット を作成する。
- BCryptDeriveKeyで、共有シークレットから派生鍵(共通鍵)を作成する。
- BCryptOpenAlgorithmProviderで、暗号化用プロバイダー(BCRYPT_AES_ALGORITHM)を開く
- BCryptGenerateSymmetricKeyで、共通鍵のためのキーオブジェクトを作成する。
- BCryptEncryptでメッセージを暗号化する。
- BCryptDecrypt でメッセージを復号化する。
- BCryptDestroySecretでシークレットアグリーメントを削除する。
- BCryptDestroyKeyでキーを破棄する
- BCryptCloseAlgorithmProvider でプロバイダを閉じる。
うーん、めんどくさい。。
ちょっとしたメモ
- CNGはハンドル(プロバイダハンドルやキーハンドル)でいろいろ操作する
- 生のキーデータを取るには BCryptExportKeyを使う。ここでとれるのはBLOB形式で、実際の生データはBCRYPT_ECCKEY_BLOBなどの構造体の後に続く形で格納されてる。共通シークレット取れる。共有シークレットはリトルエンディアンになっているので注意。また秘密鍵BLOBは公開鍵も含んでいる。例えばECDSAの秘密鍵のBLOBは
BCRYPT_ECCKEY_BLOB
BYTE X[cbKey] 公開鍵のX
BYTE Y[cbKey] 公開鍵のY
BYTE d[cbKey] 秘密鍵
となっている。
公開鍵をのblob は、
BCRYPT_ECCKEY_BLOB
BYTE X[cbKey] 公開鍵のX
BYTE Y[cbKey] 公開鍵のY
となっている。
0 件のコメント:
コメントを投稿