ブロック暗号(AES)

平文をある決まったサイズに分割し、その分割した固まりごとに暗号化する方法
端数があれば、パディングと呼ばれる方法で一つのブロックを作って処理する
ブロックごとに暗号化モードに応じた処理を行う

1970年にDESと呼ばれるブロック暗号が使われていた(64ビット、鍵長は56ビット)
DESに変わる標準的暗号としてAES(Advanced Encryption Standard)が選出された

### AES概要
AESブロックは128ビットで鍵長は128, 192, 256ビットを選べる
AESの暗号化は、秘密鍵の初期設定後(AddRoundKey)、ラウンド関数と呼ばれる処理を一定回数繰り返す 
最後に最終ラウンド関数と呼ばれる処理をして暗号化が完了する
ラウンド関数は鍵長に応じて9、11、13回行う。鍵長が大きいほど処理に時間がかかる
AESが理想的なブロック暗号なら全数探索のO(2^128)の計算コストがかかる

1. RoundKeyを作成する
2. 128ビットである1ブロックを8ビットずつの16個のデータX0からX15に分割する
3. 4×4のマス目の正方形に入れる
4. Roudkeyとマス目のデータの排他的論理和を取る

### ラウンド関数
ラウンド関数はSubBytes, ShiftRows, MixColumnsとAddRoundKeyを順番に処理する
L SubBytesはS -Boxという換字表による換字式暗号を行う
ShiftRows: 横の列ごとデータを左にずらす
MixColumns: 縦の列ごとにある決められた行列Aを掛ける演算をする(行列の成分)
最終ラウンド関数: MixColumnsを除いたSubByte, ShiftRows, AddRoundKeyの処理をする
AES-NI: IntelやAMDのCPUに搭載されているAESを高速処理するための専用命令 ARMアーキテクチャでも同様の専用命令を搭載していることがある

// 鍵
$key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
// 初期ベクトル
$iv = 'bbbbbbbbbbbbbbbb';
$str = 'hello world';

// 暗号化
$str = openssl_encrypt($str, 'AES-256-CBC', $key, 0, $iv);
echo "${str}\n";

// 複合する
$str = openssl_decrypt($str, 'AES-256-CBC', $key, 0, $iv);
echo "${str}\n";

$ php index.php
9due8hN1Y3j3t6sx/WnryA==
hello world

共通鍵暗号と公開鍵暗号とは?

インターネット上でデータ伝送するには、データを暗号化して送信することが一般的
データを暗号化して受信した際にデータの復号を行う
暗号化や復号は暗号化アルゴリズムと鍵によって行われる

### 2種類の暗号化方式
暗号化方式には共通鍵暗号と公開鍵暗号がある
共通鍵暗号は、暗号化と復号に同じ鍵を使用する 。第三者に知られないようにする
アルゴリズムにはRC4, DES, 3DES, AESなどがある AESが主流で無線LANやWPA2でも採用されている
通信接続先ごとに共通鍵を生成する必要がある
公開鍵暗号は、公開鍵と秘密鍵を生成する RSAやEIGamalなどのアルゴリズムがある
ハイブリット方式もある

なるほど、cryptの知識も大分必要だな

Install the Truffle framework

We will use the Truffle framework to issue tokens. Truffle is Ethereum’s Smart Contract Development Framework, which has functions such as compiling, linking, deploying, and binary management.

[vagrant@localhost crypto]$ npm -v
1.3.6

First of all, we will install Truffle.

[vagrant@localhost crypto]$ npm install -g truffle
npm http GET https://registry.npmjs.org/truffle
npm http GET https://registry.npmjs.org/truffle
npm http GET https://registry.npmjs.org/truffle
npm ERR! Error: CERT_UNTRUSTED
npm ERR!     at SecurePair. (tls.js:1430:32)
npm ERR!     at SecurePair.emit (events.js:92:17)
npm ERR!     at SecurePair.maybeInitFinished (tls.js:1029:10)
npm ERR!     at CleartextStream.read [as _read] (tls.js:521:13)
npm ERR!     at CleartextStream.Readable.read (_stream_readable.js:341:10)
npm ERR!     at EncryptedStream.write [as _write] (tls.js:418:25)
npm ERR!     at doWrite (_stream_writable.js:226:10)
npm ERR!     at writeOrBuffer (_stream_writable.js:216:5)
npm ERR!     at EncryptedStream.Writable.write (_stream_writable.js:183:11)
npm ERR!     at write (_stream_readable.js:602:24)
npm ERR! If you need help, you may report this log at:
npm ERR!     
npm ERR! or email it to:
npm ERR!     

npm ERR! System Linux 2.6.32-754.3.5.el6.x86_64
npm ERR! command "node" "/usr/bin/npm" "install" "-g" "truffle"
npm ERR! cwd /home/vagrant/local/crypto
npm ERR! node -v v0.10.48
npm ERR! npm -v 1.3.6
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /home/vagrant/local/crypto/npm-debug.log
npm ERR! not ok code 0

what!?

Issue ERC 20 token

ERC 20 token is a standard for issuing tokens with Ethereum, and by issuing a token conforming to ERC20, simplification of exchange between different tokens has been realized. In addition, we can manage tokens collectively by utilizing ERC 20 compatible wallet. ERC stands for Ethereum RFC and ERC 20 stands for the 20th specification. Representative ERC 20 tokens include 0x, Augur, OmiseGo and others.

Requirements for creating ERC 20 tokens are defined, and seems to be able to issue tokens by implementing the following six methods and two events.

fucntion totalSupply() constant returns(unit totalSupply);

function balanceOf(address _owner) constant returns (unit balance);

function transfer(address _to, unit _value) returns (bool success);

function transferFrom(address _from, addess _to, unit _value) returns (bool success);

function approve(address _spender, unit _value) returns(bool success);

function allowance(address _owner, address _spender) constant returns (unit remaining);

event Transfer(address indexed _from, address indexed _to, unit _value);

event Approval(address indexed _owner, address indexed _spender, unit _value);