簡単にいうとPHPで暗号化ロジック関数を作成しようと考えています。
※この暗号化は復号出来る事を前提に考えています。
簡単なレベルで元の文字列をまず16進数状態に変換して戻す
という事が出来ないか?と考えています。
これが出来ればビットに数字を足したり引いたりした値を暗号化
文字列としてできるのではないかと思っています。
一応現在文字列の16進数表記は以下の手順で出来るという事が
分かったのですが、16進数表記にしたデータを元の文字列に
戻す方法が分かりません。
何か良い方法が在れば宜しくお願いします。
少し調べたら16進数から文字列に戻すにはエンディアンを考慮~
という説明があるのですが、私にはハッキリと分からない状態です。
【16進数化テスト】
<?php
### 元データの設定
$data01 = "テストデータ";
### 16進数表記化
$data02 = bin2hex($data01);
### 暗号化情報の表記
echo "暗号前:" . $data01;
echo "暗号後:" . $data02;
?>
No.1ベストアンサー
- 回答日時:
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"が何の文字なのか分からなかった
のでその辺りの説明もできれば宜しくお願いします。
No.2
- 回答日時:
ごめんなさい、一時離れてたので、質問されていたのを見落としてました。
# もう見てないかな…
> なぜ"Oxff"とXORを取っているのでしょうか?
XORの部分が暗号化・復号っぽい処理ということで、特に他意はないです。
XOR(排他的論理和)は、同じ値で2回演算すると元の値に戻る性質があります。なので、0xFFという値に意味はありません。
1回目のXORで暗号化っぽい処理(文字が化ける)、2回目のXORで復号っぽい処理(文字が戻る)、ということです。
どのくらいの強度が必要かわかりませんが、世間で公開されている有名な暗号処理ルーチンを正しく使えば、普通は大丈夫でしょう。
自前の暗号処理を作ったとすると、暗号に関する数学的知識をちゃんと持って無いと、普通あっさりと破られます。
この辺りは、暗号に関する書籍などを当たって見てください。
ご回答ありがとうございます。
解かりやすくて納得しました。
排他的論理和を2回演算すると確かに戻りますね。
ちなみに暗号を自作しなければならない理由はレンタル
サーバーでPHPの暗号化関数Mcrypt等が入ってない環境
での使用に対して、素人さんが解からない程度には
データをカモフラージュできれば、という考えです。
なので暗号化強度は軽めでいいです。
ただ、satohさんの言う通り、このままではまだ暗号化
の強度が低いと思うので、この変換した暗号に更にもう
少し小細工はしてみたいと思っています。
解かりやすい意見ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- フリーソフト フォルダ、ファイル名の一括変換について 3 2023/03/16 09:23
- その他(形式科学) RSA暗号について 1 2022/06/01 00:16
- PDF 「PDF文書を簡単にWordで編集する方法」と 罫線が 図形で出力されるのは? 6 2022/06/14 06:51
- フリーソフト BIOS.binをバイナリエディタで開くと ascii 変換しても、暗号化されていて何か分からない文 6 2022/07/11 03:34
- Windows 10 EFS(内容を暗号化してデータをセキュリティで保護する)はHomeエディションでは使えませんか??? 1 2023/05/20 18:16
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Java Java 南京錠 2 2023/02/04 11:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
php文字列中のシングルクオート...
-
php→JavaScript間の変数受け渡し
-
フォントの色を変えるには?
-
PHPのWARNINGをcatchするには
-
onedrive にexcelファイルをア...
-
PHP8を使うと、大量のWarningが...
-
バッチを用いたフォルダの自動移動
-
CSV出力にHTMLが入ってしまう
-
「クラス関数」「メンバ関数」...
-
index.phpって何ですか? 具体...
-
現在位置より2つ上のディレク...
-
透過PNGが透過されない!!
-
PHP 文字列を代入した配列を変...
-
PHPのif文でその処理を途中で抜...
-
$_SESSION 有効期限をブラウザ...
-
別ファイルの変数を呼び出した...
-
PHPで、エラーがない場合のみ画...
-
index.phpに入るには、どうすれ...
-
前後の全角スペースを削除する...
-
phpとaspの違いについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
php文字列中のシングルクオート...
-
PHPにおいて16進数のアスキー文...
-
リダイレクトできません。クエ...
-
if ('0.0'=='0'){ の0.0とは何
-
文字列を大文字の2桁ごとのコン...
-
php→JavaScript間の変数受け渡し
-
PHPのGETとPOSTの処理を学習中...
-
is_callable()の第二引数の使い方
-
phpで、数字+文字列(ex.13才、5...
-
パラメーター付きのURLをリダイ...
-
【比較演算子】偶数・奇数識別...
-
終端識別子 とは?
-
PHPで4桁の文字コード(SHIFTJI...
-
printが「ダブルスタンダード」...
-
PHPのif文でその処理を途中で抜...
-
onedrive にexcelファイルをア...
-
FTPコマンドでディレクトリごと...
-
VBSの「MsgBox」について
-
バッチを用いたフォルダの自動移動
-
【file_exists】ファイルが存在...
おすすめ情報