ブロック暗号方式の場合、平文の文字数をブロック長の倍数に合わせるように、末尾に文字を足すなどの処理を行う必要がある。
ブロック暗号方式において文字を足すことをパディングと呼ぶ。
PKCS#7 パディングはRFC5652で定義されたパディング方式
pkcs#5 パディングは8バイトを倍数とした場合のパディング
なるほど、ちょっとモヤモヤしますな..
随机应变 ABCD: Always Be Coding and … : хороший
ブロック暗号方式の場合、平文の文字数をブロック長の倍数に合わせるように、末尾に文字を足すなどの処理を行う必要がある。
ブロック暗号方式において文字を足すことをパディングと呼ぶ。
PKCS#7 パディングはRFC5652で定義されたパディング方式
pkcs#5 パディングは8バイトを倍数とした場合のパディング
なるほど、ちょっとモヤモヤしますな..
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の知識も大分必要だな
入力元として取ると乱数が返ってくるファイル
適当な値を取るときに使う
$ 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-).??Ѳ
なんかバグのようなファイルが生成される
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 "マッチしませんでした。";
}
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";
}
インターフェースは、そのインスタンスはこのメソッドを持っているという意味
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固有に近い
マジックメソッドは、インスタンスがある特定の条件になった時に、明示的に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();
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の整理にはなった。
### アクセス修飾子 — 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());