2013年9月6日金曜日

PHPとPythonでAES暗号化、復号化

キャバクラに行ったことを女房にバレないように暗号化する


非SSL環境などで他人に見られたくない情報をURLなどで渡したいがそのまま丸見えで渡したくはないという時ってありますよね?

ない?、いやありました。
そんなことがあったので、こんな感じでやってやりました。
AES暗号の詳しい事は専門の方にお願いするとして、簡単に説明しますと、共通鍵ブロック暗号と言うことです。

これはたまんない、秘密にしたいですよね。
 

PHPで暗号化する


ECBモードを利用するのでIV(初期化ベクトル)パラメータは利用しない、そのためキーのみを利用した暗号化になってしまうのでキーがバレればそれまで。
<?php
/* keyは32文字 256bit */
$key = '12345678901234567890123456789012';

/* python側へ0x00の制御文字が入る*/
$text = '私は妻に内緒で昨日キャバクラに行ってしまいました';

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_ECB);
$encstr = base64_encode($encrypted);
print($encstr);
print("\n");
?>
実行してみる
cuomo@karky7 ~/Code/lwl/php/aes $ php aes3.php 
hiPI4JYACRvv16+WVuJf0BcooUjHFJ7kkLFg+ZYxW0wxFBmeGL3CmPpJM++/VKFs/tVeiC2ZDb+2i77Yke6pg4xNgBrD6sKDcRc4JDAWzY4=
cuomo@karky7 ~/Code/lwl/php/aes $

これでキャバクラに行ったことは解らない。

残念ですがPythonで複合化される


秘密の文字を複合化してみる、ブロック暗号なのでブロック境界に満たない場合\x00の(多分NULL)が埋められて復号化されるのでその分を削除する。enc_messageにPHPで出力された文字をコピーしてください。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from Crypto.Cipher import AES
import base64

'''鍵 16、32で指定しなければならない'''
key = '12345678901234567890123456789012'

'''暗号化情報'''
cipher = AES.new(key)

'''秘密の文字'''
enc_message = 'hiPI4JYACRvv16+WVuJf0BcooUjHFJ7kkLFg+ZYxW0wxFBmeGL3CmPpJM++/VKFs/tVeiC2ZDb+2i77Yke6pg4xNgBrD6sKDcRc4JDAWzY4='
data = base64.b64decode(enc_message)

''' 復号化'''
message = cipher.decrypt(data)
message = unicode(message, 'utf-8')

''' \x00の削除 '''
message = message.rstrip(unichr(0))
print("元メッセージ: " + message.encode('utf-8'))
実行してみる
cuomo@karky7 ~/Code/lwl/Python/aes $ python aes2.py 
元メッセージ: 私は妻に内緒で昨日キャバクラに行ってしまいました

これはヤバい、これをやられてしまうと、キャバクラに行ったことがバレますね。

普段の何気ない生活の中でも、少し暗号化すればセキュリティが上がるのでは無いでしょうか?


0 件のコメント:

コメントを投稿