簡単にいうと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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpでcookieがうまく保存されない
-
フォームで戻った際に入力済み...
-
<span>を<div>に変更すると S...
-
BASIC認証のフォームをデザイン...
-
PHPのエラーの解消法について教...
-
配列について教えて下さい。
-
PHPでCSVを出力するさいに、ル...
-
クエリObjectをforeachで回す時...
-
awsにApacheとPHPを入れて、何...
-
どうして送信されないのでしょ...
-
php エラー
-
PHP MySql 画像を取得
-
htmlのエラーについて(デバッグ)
-
PHPでテキストファイルに保存し...
-
プログラムコードを入力する場...
-
空文字 "" ですが 空文字の意味...
-
10文字以降は非表示にしたいん...
-
isset — 変数が宣言されている...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
php文字列中のシングルクオート...
-
終端識別子 とは?
-
PHPでPが2個あるので分かりず...
-
is_callable()の第二引数の使い方
-
0dで始まる文字列の比較がうま...
-
検索に関する文字コード
-
printが「ダブルスタンダード」...
-
PHPにおいて16進数のアスキー文...
-
blob型のデータの変換について
-
php 言語について
-
文字列比較の演算子
-
【比較演算子】偶数・奇数識別...
-
文字列を%+2桁のヘキサ
-
PHP4から5への移行に伴うFatal ...
-
if ('0.0'=='0'){ の0.0とは何
-
header(Location: next.php) だ...
-
PHPのif文でその処理を途中で抜...
-
フォントの色を変えるには?
-
FTPコマンドでディレクトリごと...
-
onedrive にexcelファイルをア...
おすすめ情報