はじめに この記事を書いている2018年9月現在、OpenSSHでは、鍵に使用する公開鍵暗号(電子署名)アルゴリズムとして、楕円曲線暗号であるECDSAを選択することができます。 そして、公開鍵暗号の常ですが、秘密鍵の中で本当に秘密にすべき情報というのは実はそれほど大きなデータではありません。 であれば、その核となるデータから鍵を復元できるのではないかと思い立ちテストしたため、その備忘録として記します。 なお、環境は Windows10 WSL/Ubuntu 16.04.5 LTS + OpenSSL 1.0.2g + OpenSSH 7.2p2、使用する楕円曲線は prime256v1 とします。 ECDSA鍵について OpenSSHのECDSA鍵は、ssh-keygenコマンドで、-t ecdsaオプションを指定することで作成できます。 例えば次は、256bit ECDSA ( pri
ECDSAでJWTによる電子署名を作成することがあったのでメモ ECDSAとは 楕円曲線暗号 - Wikipedia の一つ 楕円曲線暗号(だえんきょくせんあんごう、Elliptic Curve Cryptography、ECC)とは、 楕円曲線 上の 離散対数問題 (EC-DLP) の困難性を安全性の根拠とする 暗号。 暗号化と復号とで異なる2つの鍵を使用し、暗号化の鍵を公開できるようにした公開鍵暗号 RSA暗号 と比べて、短いデータ長で処理速度も早いが同レベル安全性が実現できるのがメリット CryptoKit を使ってやること CryptoKitを使って以下の手順により署名を作成していきます。 鍵の生成 電子署名の作成 全体のコードはこちらに上げてあります。 Key Pairの生成 CryptoKitの P256.Signing.PrivateKey を使えば2行で書けます let p
import "crypto/elliptic" // Alice と Bob の事前合意。共通パラメーターとして NIST P256 の曲線を使用する、とする。 // 選択肢は: P224, P256, P384, P521 paramCommon := elliptic.P256() import "crypto/ecdsa" // -------------------------------------------------------------- // Alice の公開鍵暗号のペア鍵作成 // -------------------------------------------------------------- alicePriv, err := ecdsa.GenerateKey(paramCommon, rand.Reader) PanicOnError(err)
ECDSAの署名からどうして公開鍵が取得できるの?という聞かれて何でだろうねって話になったので調べてみた。 署名から公開鍵のセットを復元 Rubyではecdsaのgemを使えば以下のように署名と署名対象のメッセージから公開鍵を取得できる。(署名対象のメッセージはどうせなのでBitcoinで使用されているのと同じトランザクションのsighashを使用。そのためbitcoinrbのgemも利用している) 実行すると↓のように2つの公開鍵が抽出できる。 0259f6658325c4e3ca6fb38f657ffcbf4b1c45ef4f0c1dd86d5f6c0cebb0e09520 03a9255e098f4075e9ebfaf7859f459095667879db33e977fc8c91029afa8a2490 ↑のコード上の署名はこの内の0259f6658325c4e3ca6fb38f65
Mastering Bitcoinにデジタル署名の仕組みが詳しく書いてなかったので、備忘録と内容補完のためにまとめます。 暗号学的ハッシュ関数についての用語 メッセージ:入力するデータのこと ダイジェスト(要約):メッセージをハッシュ関数に通した時の出力のこと 完全性:オリジナルのメッセージから1bitの変化もしていないこと。ダイジェストから確認・検証できる。 コミットメント:ハッシュ値を使ってメッセージとそのハッシュ計算を行った人間を確実に関係づけること ハッシュチェーン:ハッシュ値を入力としてハッシュ値を計算して行くことで、ハッシュ値の間の連続構造を改変不可能にしたもの ハッシュ値の衝突:異なるメッセージを入力したのに出力されたハッシュ値が同じになってしまうこと 衝突耐性がある:このハッシュ値の衝突が起きる確率が「ハッシュ値のサイズの平方根」という理想のとても低い確率になること 公開鍵
デジタル署名とは、書面上のサインを代替する電子的なサインのことです。なかでも公開鍵・秘密鍵によるデジタル署名は多くのシステムで活用されている重要なセキュリティー技術です。しかし、デジタル署名の流れを理解している人は少ないでしょう。本記事ではデジタル署名の概要と、プログラミングコードを通じた署名プロセスを解説します。デジタル署名の仕組みの理解や、システム実装などの参考にしてください。 デジタル署名とは デジタル署名とは、書面による署名を電子的に代替する方法のひとつです。そのため電子署名とも呼ばれます。法的な効力については、電子署名及び認証業務に関する法律という法律で規定されています。近年注目されているスマートコントラクトにおいて重要な技術要素で、多くの電子署名サービスやブロックチェーンなどで活用されています。 デジタル署名で利用される公開鍵・秘密鍵 一部のデジタル署名のプロセスでは、公開鍵,
Golang, Node.js, Kotlin, Swift での ECDSA それぞれの言語でキーペア生成、署名生成、署名検証をおこないます。 公開鍵は PEM 形式, 署名データは ASN.1 エンコードした結果のバイナリデータを Base64 形式で出力します。 公開鍵を PEM 形式としたのはただ単によく見かけるから、という理由からです。(検証をおこなうという意味では DER エンコード されたバイナリデータを Base64 もしくは Hex 形式で出力するだけで十分だと、後から気づきました...) Golang Golang は標準ライブラリが充実しているため、さほど苦労することなく扱うことができます。 参考: golang ecdsa パッケージ 以下のコードは version: 1.13.3 で動作を確認しています。 package main import ( "crypto
よく使われているRSA暗号方式からECC(楕円曲線暗号)に変えると、同程度の強度のRSAと較べて鍵長が短くなってサーバ側の鍵認証のsign処理が速くなる。クライアント側の鍵認証のverify処理は少し遅くなるようだがトータルでは速くなると考えて良さそう。なによりサーバ側が軽くなるのが良い。 ちなみにRSAで鍵長が1024bitから2048bitになって数倍の処理、何年か後に4096bitになったらまたその数倍の処理が必要になるのだが、ECCだと256bitでRSAの3072bit相当と言われている。10年とかそれ以上の有効期間の長いEE証明書を使うならともかく5年以下のEE証明書でアホみたいにRSAで鍵長を4096bitにする人は殆どいないと思うけど、2048bitでもちょっと重いかなと思うことがあるので軽めのP-256でRSAの2048bitよりずっと暗号強度が高いというのは良いわぁ。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く