開発では、暗号化アルゴリズムを使用してデータを処理することがよくあります。 PHPには、非常に強力な関数-Pack ()があります。これは、バイナリデータのフォーマットによく使用されます。従来の意味では暗号化関数ではありませんが、 Pack()の合理的な使用は、カスタム暗号化アルゴリズムの「パッケージングロジック」を構築するために協力することができます。
Pack()関数の関数は、指定された形式でデータをバイナリ文字列にパッケージ化することです。その基本的な構文は次のとおりです。
string pack ( string $format , mixed $values [, mixed $... ] )
ここで、 $フォーマットは、後続の$値パラメーターをパッケージ化する方法を指定するフォーマット文字列です。例えば:
$binary = pack("N", 123456); // によると 32 符号なしの長い(big-endian)梱包番号
データをバイナリフォームにパッケージ化し、Base64エンコードまたはカスタム変換ルールを使用して「暗号化」できます。この方法は、AESやRSAなどのプロフェッショナルな暗号化アルゴリズムと比較することはできませんが、いくつかの非批判的なデータシナリオで軽量保護のアイデアを提供します。
暗号化するデータに次の部分が含まれているとします。
ユーザーID(整数)
タイムスタンプ(整数)
操作タイプ(1バイト識別子)
修正検証コード(文字列)
Pack()を使用して、これらのコンテンツをパッケージ化しましょう。
function custom_encrypt($userId, $actionType) {
$timestamp = time();
$checkCode = 'm66'; // 確認コードを修正しました
// バイナリ文字列にデータをパッケージします
$binaryData = pack("NNCa3", $userId, $timestamp, $actionType, $checkCode);
// 使用 base64 コーディング,最終的に転送可能なものを生成します“暗号化”弦
return base64_encode($binaryData);
}
フォーマット文字列「nnca3」の意味は次のとおりです。
n :32ビットunsigned long Integer(userid)
N :32ビットの署名の長いパターン(タイムスタンプ)
C :8ビットの符号なし文字(ActionType)
A3 :3バイト文字列(チェックコード)
テストできます:
echo custom_encrypt(1024, 5);
出力は、パッケージ化され、エンコードされた文字列です。たとえば、:
AAAAAAgAAZ8ZziUAbTY2AA==
また、暗号化されたデータをuppack()を使用して元のコンテンツに戻すこともできます。
function custom_decrypt($encoded) {
$binaryData = base64_decode($encoded);
$data = unpack("NuserId/Ntimestamp/CactionType/a3checkCode", $binaryData);
return $data;
}
使い方:
$encoded = custom_encrypt(2048, 3);
$decoded = custom_decrypt($encoded);
print_r($decoded);
出力は次のようなものになります:
Array
(
[userId] => 2048
[timestamp] => 1716821234
[actionType] => 3
[checkCode] => m66
)
最終的にはbase64エンコード文字列になるため、URLに安全に追加できます。
$url = "https://m66.net/api/receive.php?token=" . urlencode(custom_encrypt(2048, 1));
レシーバーの復号化についても同じことが言えます。
$token = $_GET['token'];
$data = custom_decrypt($token);
Pack()は、見落とされがちですが、PHPで非常に強力なツールです。基礎となるバイナリデータを正確に制御できます。軽量の暗号化またはデータのカプセル化が必要ないくつかのシナリオでは、 base64_encode()およびunpack()でそれを使用すると、カスタム暗号化伝送ロジックをすばやく構築できます。
もちろん、このアプローチは機密情報の処理には適していません。これは、真に安全な暗号化よりも軽量のエンコーディング/難読化スキームとしてより適しています。ユーザーのパスワード、財務データなどを扱っている場合は、OpenSSLやLibsodiumなどの標準の暗号化アルゴリズムを選択してください。
Pack()のさまざまなフォーマットシンボルを習得することで、ネットワークプロトコルのパッケージプロセスをシミュレートし、カスタムAPIデザインで優れた成果を上げることもできます。