この人頭いいなと思ったエピソード

簡単にいうとPHPで暗号化ロジック関数を作成しようと考えています。
※この暗号化は復号出来る事を前提に考えています。

簡単なレベルで元の文字列をまず16進数状態に変換して戻す
という事が出来ないか?と考えています。

これが出来ればビットに数字を足したり引いたりした値を暗号化
文字列としてできるのではないかと思っています。

一応現在文字列の16進数表記は以下の手順で出来るという事が
分かったのですが、16進数表記にしたデータを元の文字列に
戻す方法が分かりません。
何か良い方法が在れば宜しくお願いします。

少し調べたら16進数から文字列に戻すにはエンディアンを考慮~
という説明があるのですが、私にはハッキリと分からない状態です。

【16進数化テスト】

<?php

### 元データの設定
$data01 = "テストデータ";

### 16進数表記化
$data02 = bin2hex($data01);

### 暗号化情報の表記
echo "暗号前:" . $data01;
echo "暗号後:" . $data02;

?>

A 回答 (2件)

bin2hex()は、文字列→数値ではなく、文字列→その1つずつの文字を16進数で書き直した「文字列」への変換ですので、ちょっと違うかと思います。


PHPでは、文字列中の各文字は $str{$idx} の形でアクセスできます。また、文字コードは ord( $char ) で取得でき、また数値から文字への変換は chr( $code ) で変換できます。
ということで、文字列はそのままに、各文字を取得し、ord()/chr()にて適時変換しながら書き換えでいかがでしょうか。
簡単な例を書くとこんな感じでしょうか。

// $buf :変換対象文字列
$length = strlen( $buf );
echo "変換前:" . $buf;

for( $i = 0; $i < $length; ++$i ){
$buf{$i} = chr(0xff ^ ord( $buf{$i})); // 0xffとXOR
}

echo "変換後:" . $buf;

for( $i = 0; $i < $length; ++$i ){
$buf{$i} = chr(0xff ^ ord( $buf{$i})); // 再度0xffとXOR
}

echo "復元後:" . $buf;

この回答への補足

とても参考になる解答有難うございます。
satohさんのサンプルでのソースでテスト
してみたら良い感じに動きました。

ところでそのサンプルで質問なのですが、
ord関数で1文字づつのアスキーコードを取得
しchr関数で置換してるという事はなんとか
分かりましたが、なぜ"Oxff"とXORを取って
いるのでしょうか?

その辺が良く分からないので出来れば
教えてもらえないでしょうか?

というかアスキーコード表の16進数を調べて
みたのですが"0x7f"(DEL)とかは書いてあった
のですが"Oxff"が何の文字なのか分からなかった
のでその辺りの説明もできれば宜しくお願いします。

補足日時:2005/10/05 15:10
    • good
    • 0

ごめんなさい、一時離れてたので、質問されていたのを見落としてました。


# もう見てないかな…

> なぜ"Oxff"とXORを取っているのでしょうか?

XORの部分が暗号化・復号っぽい処理ということで、特に他意はないです。
XOR(排他的論理和)は、同じ値で2回演算すると元の値に戻る性質があります。なので、0xFFという値に意味はありません。
1回目のXORで暗号化っぽい処理(文字が化ける)、2回目のXORで復号っぽい処理(文字が戻る)、ということです。

どのくらいの強度が必要かわかりませんが、世間で公開されている有名な暗号処理ルーチンを正しく使えば、普通は大丈夫でしょう。
自前の暗号処理を作ったとすると、暗号に関する数学的知識をちゃんと持って無いと、普通あっさりと破られます。
この辺りは、暗号に関する書籍などを当たって見てください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

解かりやすくて納得しました。
排他的論理和を2回演算すると確かに戻りますね。

ちなみに暗号を自作しなければならない理由はレンタル
サーバーでPHPの暗号化関数Mcrypt等が入ってない環境
での使用に対して、素人さんが解からない程度には
データをカモフラージュできれば、という考えです。
なので暗号化強度は軽めでいいです。

ただ、satohさんの言う通り、このままではまだ暗号化
の強度が低いと思うので、この変換した暗号に更にもう
少し小細工はしてみたいと思っています。

解かりやすい意見ありがとうございました。

お礼日時:2005/10/18 16:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報