Rijndael-128とは

AESは鍵長128, 192, 256bitから選択できる
Rijndaelはブロック長も128, 192, 256bitから選択できる

$key = "秘密の合言葉";
$text = "暗号化するメッセージ";

srand();

$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_RAND);

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
$hex = bin2hex($encrypted);

$bin = pack("H*", $hex);
$decrptyed = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);

echo $text . "=>".rtrim($decrypted);

あれ、なんかおかしい。。

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

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

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

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

/dev/urandomとは

入力元として取ると乱数が返ってくるファイル
適当な値を取るときに使う

$ head -c 200m /dev/urandom > test.txt
$ cat test.txt
?x??y??Q%s}?Gz?¯???$?_?g7T!L??+\?*???f>?$????Q?7?????i%?M??X???? BY?P??”?gO?%Š??O??/??j?n??7??dnZ?…?
r????u??/???,O @ep?????>?;??’y?l?]?\e-).??Ѳ

なんかバグのようなファイルが生成される

PHP checkEmpty, preg_match

private function checkEmpty($key, $message, ErrorCode $errorCode){
	if(self::isEmpty($this->array, $key)){
		throw new InnerException($message, $errorCode);
	}
	return $this->array[$key];
}
if(preg_match("/PHP/", "今PHPを勉強しています。")){
	echo "マッチしました。";
} else {
	echo "マッチしませんでした。";
}

PHP ErrorException

function exceptionErrorHandler($errono, $errstr, $errfile, $errline){
	throw new ErrorException($errstr, $errno, $errfile, $errline);
}
set_error_handler('exceptionErrorHandler');

error_reporting(E_ALL);
try {
	$arr = array();
	print $arr['a'] . "\n";
	strpos();
} catch (Exception $e){
	print $e->getMessage(). "\n";
	print $e->getTraceAsString(). "\n";
}

PHPのインターフェースと抽象クラス、多重継承、トレイト

インターフェースは、そのインスタンスはこのメソッドを持っているという意味

interface hoge {
	public function t1();
}

class foo implements hoge {
	public function t1(){
		echo "foo's t1()\n";
	}
}

$obj = new foo();
$obj->t1();

抽象クラス

abstract class hoge {
	abstract public function t1();
	abstract protected function t2();

	private $i_;
}

class foo extends hoge {
	public function t1(){
		echo "foo's t1()\n";
		$this->t2();
	}
	public function t2(){
		echo "foo's t2()\n";
	}
}

$obj = new foo();
$obj->t1();

PHPのマジックメソッドと無名関数

マジックメソッドはPHP固有に近い
マジックメソッドは、インスタンスがある特定の条件になった時に、明示的にcallしなくても暗黙的にcallされるメソッドの総評
先頭2文字がアンダースコア(__)になっている

### アクセス不能プロパティを読み書きする__get(), __set()

class hoge {
	
	private $i_;
}

$obj = new hoge();
var_dump($obj->i_);
$obj->i_ = 1;
class hoge {

	public function __get($name){
		echo "get: name is ${name}\n";
		return "dummy";
	}
	public function __set($name, $val){
		echo "set: ${name} <= ${val}\n";
	}

	
	private $i_;
}

$obj = new hoge();
var_dump($obj->i_);
$obj->i_ = 1;

### __call()と__callStatic()
アクセス不能メソッド

class hoge {
	public function __call($name, $args){
		echo "call {$name}\n";
		var_dump($args);
	}
	public function __callStatic($name, $args){
		echo "callStatic {$name}\n";
		var_dump($args);
	}
}

$obj = new hoge();
$obj->func();
hoge::func_static();

### 無名関数

$func = function(){
	echo "Anonymous function\n";
};

$func();
var_dump($func);
class hoge {
	public function __invoke(){
		echo "call method\n";
	}
}

$obj = new hoge();
$obj();

PHPにおける継承、オーバーライド、protected、parentの書き方

class hoge {
	
	public function A(){
		echo "call A\n";
	}
	private $i_ = 1;
}

class foo extends hoge {
	public function B(){
		echo "call B\n";
	}
	private $j_ = 999;
}

$hoge_obj = new hoge();
$hoge_obj->A();
var_dump($hoge_obj);

$foo_obj = new foo();
$foo_obj->B();
$foo_obj->A();
var_dump($foo_obj);

### オーバーライド

class hoge {
	
	public function A(){
		echo "call A\n";
	}
	private $i_ = 1;
}

class foo extends hoge {
	public function A(){
		echo "call B\n";
	}
	private $j_ = 999;
}

– protected

class hoge {
	
	private function h_pri_func(){
		echo "call h_pri_func\n";
	}
	protected function h_pro_func(){
		echo "call h_pro_func\n";
	}
}

class foo extends hoge {
	public function f_pri_func(){
		echo "call f_pri_func\n";
	}
	public function test(){
		$this->f_pri_func();
		$this->h_pro_func();
	}
}


$foo_obj = new foo();
$foo_obj->test();

– parent: 継承元のconstructor, destructorを呼ぶ

class foo extends hoge {
	public function __construct(){
		parent::__construct();
		echo "run foo constructor\n";
	}
	public function __destruct(){
		parent::__destruct();
		echo "run foo destructor\n";
	}
}

なるほど、constructorの整理にはなった。

PHPのアクセス修飾子、カプセル化、アクセサー、コンストラクター/デストラクター

### アクセス修飾子 — public, protected, private
public: 外からOK
protected: クラス内、あるいは継承先のクラス内
private: クラス内のみ

class hoge {
	public function pub_func(){
		echo "call pub_func\n";
		$this->pro_func();
		$this->pri_func();
	}

	protected function pro_func(){
		echo "call pro_func\n";
	}

	private function pri_func(){
		echo "call pri_func\n";
	}
}

$obj = new hoge();
$obj->pub_func();
class hoge {
	public $_pub_val;
	protected $_pro_val;
	private $_pri_val;
}

$obj = new hoge();
$obj->_pub_val = 10;
var_dump($obj);
class hoge {
	
	public function f(){
		$this->_pro_val = 20;
		$this->_pri_val = 20;
	}
public $_pub_val;
public $_pro_val;
public $_pri_val;
}

$obj = new hoge();
$obj->_pub_val = 10;
$obj->f();
var_dump($obj);

隠蔽化とは、全てのプログラム詳細を理解できていなくても、必要な箇所のみ修正•加筆等を行えば、全体として動くことをいう。

### アクセサー(セッター)

class hoge {
	
	public function setVal($v) {
		$this->_val = $v;
	}
	public function getVal(){
		return $this->_val;
	}
}

$obj = new hoge();
$obj->setVal('test');
var_dump($obj->getVal());

### コンストラクター

class hoge {
	
	public function __construct(){
		echo "run constructor\n";
	}
}

$obj = new hoge();

run constructor

デストラクター

class hoge {
	
	public function __destruct(){
		echo "run destructor\n";
	}
}

$obj = new hoge();
$obj = null;
sleep(5);

### immutableなオブジェクト

class hoge {
	
	public function __construct($v){
		$this->_val = $v;
	}
	public function getVal(){
		return $this->_val;
	}
}

$obj = new hoge('vall');
var_dump($obj->getVal());

PHPのclassの書き方

関数(メソッド)はpublicで変数(プロパティ)はprivate

class hoge {
	public function hogeMethod(){}

	private $_hogeProperty;
}

$obj = new hoge();

echo "<pre>";
var_dump($obj);
echo "</pre>";

object(hoge)#1 (1) {
[“_hogeProperty”:”hoge”:private]=>
NULL
}

### マルチプルインスタンス

class hoge {
	public function setValue($i){
		$this->_value = $i;
	}

	private $_value;
}

$obj = new hoge();
$obj->setValue(10);

echo "<pre>";
var_dump($obj);
echo "</pre>";
$obj = new hoge();
$obj->setValue(10);
var_dump($obj);

$obj2 = new hoge();
$obj2->setValue(20);
var_dump($obj2);

ここまでは基礎。他の言語でもほぼ同じ。