Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

2018-01-01から1年間の記事一覧

肩こりと腰痛とプログラマー

一日中座りっぱなしのプログラマーにとって、肩こりと腰痛は職業病です。 20代の頃はそれほど心配ないですが、30代に入ったあたりからだんだんと対策を考える必要が出てきます。 座っている時間が長いほど病気になる確率が高くなるとも言われます。 対策につ…

仮想通貨、ブロックチェーンとは何か

2018年は仮想通貨、ブロックチェーンが特に日本で世間一般に認知された年でした。 仮想通貨、ブロックチェーンとは何なのか、今後どうなってゆくのかについてまとめておきたいと思います。 仮想通貨 2008年11月にサトシナカモトという匿名の人物が論文を書き…

AdSenseのブログ審査に2回目で通過しました

Google AdSenseの1回目の審査で落ちたので、日記系(技術系だけど一つの記事は短め)はダメなのかなと思ったら、2回目の審査で通りました。 1回目の審査では、無料版はてなブログで書きためたサイトをグローバルドメインに置き換えて審査に出しました。 審…

go言語実装のed25519のベンチマークを測定してみる

go言語によるed25519実装は2種類あるようですが、こちらにあるもので調べてみました。 GitHub - Bytom/bytom: Official Go implementation of the Bytom protocol go言語では単体テストにベンチマーク機能が組み込まれており、簡単にベンチマークが取れるよ…

C++/ObjC/swift コーディング規約

私が考えるC++/ObjC/swift についてのコーディング規約です。 基本的にコーディング規約はプロジェクトの生産性を最大化するのが目的であり、厳しすぎず、ゆる過ぎないものにするべきです。 以下、箇条書きにしていきます。 守るべき規約 定数は先頭に k の…

mod pでの平方剰余を計算する(p mod 8 = 5) その2

www.pebblewind.com こちらの記事で、平方剰余を計算しましたが、ed25519 においては、aは u/v という形になっています。 u,vの計算量は少ないので、計算効率をあげるため、u,vを用いた掛け算になるように変形します。 (フェルマーの小定理) (余分な項が8の…

go 言語 でed25519ライブラリを使う

go の標準ライブラリにはed25519は含まれない($ go list std | grep cryptoで確認できます。)ため、 以下のライブラリを使います。 github.com 以下のコマンドでインストールします。 $ go get -u golang.org/x/crypto/ed25519 a.goというファイル名で以下を…

はてなブログをproにして独自ドメインに変更する

はてなブログの無料版はサブドメインのため、GoogleAdsenseを導入することができません。 そのため、はてなブログをproにして独自ドメインに変更した時の手順です。 まず、元のURLはこのようになっています。 http://pebble8888.hatenablog.com hatenablog.c…

twisted edwards curve でのaffine加算公式とprojective加算公式

Twisted Edward Curveでのコンピュータでの計算の最適化手法はいくつかありますが、 この記事では、projective座標系を使って、わり算の数をへらし計算量を押さえる手法を紹介します。 twisted edwards curve のaffine座標での加算公式その1は以下です。 式…

ed25519におけるcofactor=8

こちらの記事 ed25519のpython実装を紐解く その2 暗号編キーペア生成からベリファイまで - Pebble Coding で、ed25519の署名のロジックを検証しました。 8の倍数を使う意味が分かった気がしたので、それについて書きます。 結論からいうと、small subgroup…

iOSウォレットアプリ外部ライブラリ依存関係

iOS版ウォレットアプリにはソースが公開されているものがあります。ソースが公開されていれば、自分で脆弱性があるかどうかを調べたり出来るので、ソースが公開されていないものに比べてその点がメリットです。 いくつかのアプリで外部ライブラリ依存関係を…

楕円曲線の点の2倍公式

楕円曲線の点の2倍公式を楕円曲線を簡単にして計算してみよう。 楕円関数の加法公式 - Pebble Coding で計算を簡単にするためa=0とする。2倍公式を得るにはP=Qとすれば良い。 すると、 が得られる。 3倍公式、4倍公式を求めていくと、xの有理式の次数が上が…

体論

定義 1 Kを体とする。任意の定数でない1変数多項式]に対し がありとなるとき、Kを代数閉体(algebraically closed field)という。 定理 1 Kが代数閉体で、fが の形である場合、 が存在し、である。 拡大体のゆるい定義 2 体Kにいくつかの元を添加して得られた…

楕円曲線の自己準同型

有限体 上の楕円曲線 上の有理点(x, y)を考える。 x座標,y座標はともに0以上p(素数)未満の整数。 2つの点に対する加法を以下で定義すると、この点と加法は可換群(アーベル群)をなすことが知られている。 これを点の加法と呼ぶことにする。 楕円関数の加法公…

数学英単語

数学書に出てくる英単語がわかりずらいので、リストしておく。 homothetic 相似の homothety 相似 codomain 終域 homogeneous 同種の automorphy 自己同型 division polynomials 等分多項式 homomorphism 準同型 endomorphism 自己準同型 isomorphism 同型 a…

swiftとアセンブラ

swiftコードがどのようにアセンブラに出力されているのかをみてみましょう。 Xcodeのプロジェクトで、コマンドラインプロジェクトを生成し、以下のソースをmain.swiftに書き込みます。 import Foundation func plus(_ a: Int64, _ b: Int64) -> (Int64) { re…

群論におけるラグランジュの定理

ラグランジュの定理を解説します。 ここでは有限群のみを考慮対象とします。 まず、群の定義です。 有限個の元からなる集合Gを考えます。 集合Gから2つの元を選び、に対してを作用させて結果rを得るという操作(演算)を定義します。 この演算をここではで表…

準同型写像に関するカーネルの元の数についての定理

準同型写像に関する元の数についての定理を直観的に理解したいと思います。 G,Yを有限群とする。 群Gから群Yへの準同型写像(Homomorphism)を とする。 すなわち、 をGの任意の元として、 が成りたちます。 ここで左辺のプラスは群Gでの演算,右辺のプラスは群…

楕円曲線の有理点の数の求め方 schoof アルゴリズムその1

上の楕円曲線 の有理点個数の求め方です。 ここではSchoofアルゴリズムの理解を目的とし、少しづつ理解を進めます。 まず使うのはHasseの定理です。 Hasse-Weilの定理(楕円関数限定版) - Pebble Coding 有理点の数を#Eで表すと、 が成り立つのでaを求めれば…

素体を拡大する

素体 を拡大してみます。 を拡大して、拡大体 を作ることにします。 体の拡大には既約多項式を使います。 ここでは、規約多項式を使います。 を作る場合は素数3で割った余りを使うというルールでした。 の元は{0, 1, 2}の3つですが、加法の単位元が0で乗法の…

BabyStep GiantStep法(BSGS法)

DLP問題を解くアルゴリズムの一つとしてBabyStep GiantStep法があります。 www.pebblewind.com DLP問題とは、対称群の位数nに対して、生成元をg、群のある元をaとして、 を満たすxを求める問題です。 ここで、解はただ一つのみ必ず存在することは前提としま…

主要な仮想通貨のネットワークハッシュレート

いくつかの主要な仮想通貨のネットワークハッシュレートを調べてみました。 値が大きいほど、ある種の攻撃に対して耐性を持ちます。 ビットコインの現在のネットワークハッシュレートはこちらによると https://blockchain.info/charts/hash-rate 30G * GHash…

Hasseの定理から導き出される補題

楕円曲線に限定した Hasse の定理 上の任意の楕円曲線の有理点の個数 の範囲は以下となる。 補題 楕円曲線 E () に含まれる点Pで、 となる m が Hasse の定理により定まる曲線の位数の区間 に唯一存在する時、 となる。 この補題は Hasse の定理から導かれま…

256bitの暗号化はどの程度強固なのか

256bit(=32バイト)の暗号化はどの程度強固なのかというのを説明したYouTubeの動画が面白かったのでリンクを貼っておきます。 www.youtube.com 内容としては、まず、8つの大きさに分解します。 それぞれ、M1, M2, M3, ..., M8と表すことにします。 そして、 …

リカバリーIDについて小さな例を用いて実感する

一つ前の記事では署名のリカバリーIDについて書きました。 Ethereum の署名とBitcoin の署名 - Pebble Coding が、いまいち分からんと思うので、実感するため、小さい例で考えてみます。 曲線はsecp256k1と同じ、 を使いますが、法素数は31=pを使います。 こ…

Ethereum の署名とBitcoin の署名

Ethereum の署名の仕様はイエローペーパー https://ethereum.github.io/yellowpaper/paper.pdf に記載されています。 n = 115792089237316195423570985008687907852837564279074904382605163141518161494337 Rは点でx座標とy座標を持ちます。 n は secp256k1…

base58checkフォーマット出力の先頭文字が決まる理由

ビットコインで使われているbase58checkフォーマット出力の先頭の文字が何になるかって教科書にはよく書かれていますが、 どうやって算出しているのか気になったので、確かめてみました。 取りうる最小値と最大値を与えれば出力値の範囲が分かるという理屈で…

base58check フォーマットとビットコインアドレス

bitcoinでは色々なところでbase58checkフォーマットが使われています。 base58checkフォーマットを行う関数をb58checkとして実装してみたのが以下です。 ここでは、公開鍵から、メインネットのビットコインアドレスを計算しています。 ビットコインアドレス…

macOS に bitcoin explorer をインストールする

$ brew install bx 秘密鍵を生成しファイルに出力(32バイトhex) $ bx seed | bx ec-new > private_key $ cat private_key 4a1bdbb5164f0b096ab56ec74399222e44d13b2a93d5ad7fe8a341bbfa197c46 秘密鍵から公開鍵を計算しファイルに出力(33バイトhex) 先頭が0x…

ripemd160をpythonで試す

ripemd160は160ビット(=20バイト)の値を返すハッシュ関数です。 pythonでは以下で計算できます。 #!/usr/bin/env python import hashlib h = hashlib.new('ripemd160') h.update(b"abc") r1 = h.hexdigest() print(r1) print("len "+str(len(r1))) 8eb208f7e…