カスタム暗号化アルゴリズムの実装
ID を秘密にしておく必要があるため、対称暗号化が使用されますが、mcrypt_encrypt アルゴリズムで暗号化された文字列が長すぎるため、カスタム暗号化アルゴリズムを実装したいと考えています。 アイデアは次のとおりです
まず、 の sha1 を計算します。キーを取得し、結果のプレフィックスを取得し、暗号化された整数と XOR を実行して、暗号化された 32 ビットの結果を取得します。
各グループの名前は次のとおりです。 a0, a1, a2, a3, a4, a5
長さ 64 の辞書配列も定義します
$dict=array('1','2','3','4','5','6 ','7', '8','9',
'a','b','c','d','e','f','g','h','i' 、'j'、' k'、'l'、'm'、'n'、'o'、'p'、'q'、'r'、's'、't'、'u'、' v','w' ,'x','y','z',
'A','B','C','D','E','F','G','H '、'I'、'J'、'K'、'L'、'M'、'N'、'O'、'P'、'Q'、'R'、'S'、'T'、 'U','V ','W','X','Y','Z',
'01','02','03');
前の各グループの値を添字として使用します。暗号化する辞書配列の結果は次のようになります: $dict[a0].$dict[a1].$dict[a2].$dict[a3].$dict[a4].$dict[a5]
暗号化された結果は 6 ~ 12 文字列の長さで、辞書配列の最後の 3 要素が他の単一文字で表されている場合、結果は 6 文字の文字列に固定されます。
私は PHP の学習を始めたばかりで、PHP 関数ライブラリに詳しくないので、暗号化および復号化アルゴリズムの実装を手伝ってください:
string encrypt(int id,string key)
int decrypt(string text,string key) )
ディスカッションに返信 (解決策)
echo encrypt(1234, 'abc'), PHP_EOL;echo decrypt( '1TgGSY', 'abc');function encrypt($id, $key) { $dict = array('1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', '-','=','*' ); $key = current(unpack('L', sha1($key, 1))); $id ^= $key; $t = str_split(sprintf('%036b', $id), 6); foreach($t as &$v) $v = $dict[bindec($v)]; return join($t);}function decrypt($s, $key) { $dict = array('1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', '-','=','*' ); $dict = array_flip($dict); foreach(str_split($s) as $c) $r[] = sprintf('%06b', $dict[$c]); $id = bindec(join($r)); $key = current(unpack('L', sha1($key, 1))); return $id ^ $key;}
1234
暗号化処理も自分で実装しましたが、見た目があまり美しくなく、実行効率も悪かったです。低くしてください、投稿してください マスターのスタイルを設定してください
$key_string = 'abc';function keyToInt($key) { $key_sha1 = sha1 ( $key ); $first_char = $key_sha1 [0]; if (ord ( $first_char ) > 55) { return hexdec ( (hexdec ( $first_char ) & 7) . substr ( $key_sha1, 1, 7 ) ) | (- 2147483648); } else { return hexdec ( $key_sha1 ); }}function Encrypt($num){ $dict = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','*','!'); $r1 = $num ^ keyToInt ( $key_string ); $r2 = decbin ( $r1 ); $r3 = array ( bindec ( substr ( $r2, 0, 2 ) ), bindec ( substr ( $r2, 2, 6 ) ), bindec ( substr ( $r2, 8, 6 ) ), bindec ( substr ( $r2, 14, 6 ) ), bindec ( substr ( $r2, 20, 6 ) ), bindec ( substr ( $r2, 26, 6 ) ) ); return $dict [$r3 [0]] . $dict [$r3 [1]] . $dict [$r3 [2]] . $dict [$r3 [3]] . $dict [$r3 [4]] . $dict [$r3 [5]];}
アルゴリズムを実装した後、アルゴリズムを設計するときに考慮されていなかった欠陥があることがわかりました
単なる XOR であるため。 ID とキーの暗号化結果には一定の規則性があります。
たとえば、
1234->1TgGSY
1235->1TgGSX
結果を分割する良い方法はありますか
これは十分に厄介です。 、
$id = 1234;$key = 'aaa';for($i=1; $i<100; $i++) { printf("%-10d %s %s\n", $id, $s = encrypt($id++, $key), decrypt( $s, $key));}function encrypt($id, $key) { $dict = array('1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', '-','=','*' ); $n = rand(0, 15); srand($n); $key = current(unpack('L', substr(sha1($key, 1), $n))); $id ^= $key; $t = str_split(sprintf('%04b%032b', $n, $id), 6); foreach($t as $i=>&$v) { $v = $dict[bindec($v)]; if($i == 0) shuffle($dict); } return join($t);}function decrypt($s, $key) { $dict = array('1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', '-','=','*' ); $m = array_search($s{0}, $dict); $n = $m >> 2; srand($n); shuffle($dict); $dict = array_flip($dict); foreach(str_split($s) as $i=>$c) { $r[] = sprintf('%06b', $i==0 ? $m&0x03 : $dict[$c]); } $id = bindec(join($r)); $key = current(unpack('L', substr(sha1($key, 1), $n))); return $id ^ $key;}
1234 4rHK4B 12341235 oD2LN* 12351236 wqkf8u 12361237 6k=GVU 12371238 bxeCr* 12381239 =W-AOi 12391240 IiQ3e1 12401241 z6uMMA 12411242 WLcnd8 12421243 Rizj*M 12431244 4rHK47 12441245 oD2LNT 12451246 wqkf8Z 12461247 6k=GVJ 12471248 bxeCrE 12481249 =W-AOP 12491250 IiQ3et 12501251 z6uMMP 12511252 WLcndU 12521253 Rizj*p 12531254 4rHK4s 12541255 oD2LNs 12551256 wqkf84 12561257 6k=GVn 12571258 bxeCrL 12581259 =W-AOT 12591260 IiQ3ex 12601261 z6uMM1 12611262 WLcndD 12621263 Rizj*s 12631264 4rHK4h 12641265 oD2LNq 12651266 wqkf83 12661267 6k=GVg 12671268 bxeCr5 12681269 =W-AOH 12691270 IiQ3eP 12701271 z6uMMc 12711272 WLcndE 12721273 Rizj*6 12731274 4rHK4I 12741275 oD2LN= 12751276 wqkf8U 12761277 6k=GVI 12771278 bxeCr9 12781279 =W-AOl 12791280 IiQ3bI 12801281 z6uMhG 12811282 WLcnaY 12821283 Rizj6d 12831284 4rHK3Z 12841285 oD2L*n 12851286 wqkfbP 12861287 6k=Gzj 12871288 bxeC=o 12881289 =W-AEd 12891290 IiQ3bY 12901291 z6uMh* 12911292 WLcnag 12921293 Rizj6v 12931294 4rHK3F 12941295 oD2L*e 12951296 wqkfbJ 12961297 6k=Gzm 12971298 bxeC=N 12981299 =W-AEw 12991300 IiQ3bs 13001301 z6uMhl 13011302 WLcna4 13021303 Rizj6V 13031304 4rHK3u 13041305 oD2L*V 13051306 wqkfbm 13061307 6k=Gz* 13071308 bxeC=- 13081309 =W-AEa 13091310 IiQ3bm 13101311 z6uMhe 13111312 WLcnaS 13121313 Rizj6= 13131314 4rHK38 13141315 oD2L*l 13151316 wqkfbS 13161317 6k=Gz6 13171318 bxeC=q 13181319 =W-AEn 13191320 IiQ3bO 13201321 z6uMhV 13211322 WLcnau 13221323 Rizj61 13231324 4rHK3K 13241325 oD2L*p 13251326 wqkfbv 13261327 6k=Gzw 13271328 bxeC=h 13281329 =W-AE- 13291330 IiQ3bS 13301331 z6uMhj 13311332 WLcna9 1332
あなたのデザインでは、最初のセクションには有効なビットが 2 つしかないので、それに 4 ビットの情報を追加できます そして、0 から 15 までの乱数は正確に 4 ビットです
アルゴリズムでは、このランダムは数値は2つの役割を果たします
1. キーを調整します
2. 辞書を混乱させます
必要ない場合は、機密性が強すぎるため、ビット演算とシフトで十分であり、CPU を節約します
著者の答えは素晴らしいです
著者の答えは素晴らしいですが、それはタイプミスです
もうだめです

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Netflix のアバターは、ストリーミング ID を視覚的に表現したものです。ユーザーはデフォルトのアバターを超えて自分の個性を表現できます。 Netflix アプリでカスタム プロフィール写真を設定する方法については、この記事を読み続けてください。 Netflix でカスタム アバターをすばやく設定する方法 Netflix には、プロフィール写真を設定する機能が組み込まれていません。ただし、ブラウザに Netflix 拡張機能をインストールすることでこれを行うことができます。まず、Netflix 拡張機能のカスタム プロフィール画像をブラウザにインストールします。 Chrome ストアで購入できます。拡張機能をインストールした後、ブラウザで Netflix を開き、アカウントにログインします。右上隅にあるプロフィールに移動し、をクリックします

Win11で背景画像をカスタマイズするにはどうすればよいですか?新しくリリースされた win11 システムには多くのカスタム機能がありますが、多くの友人はこれらの機能の使い方を知りません。一部の友人は、背景画像が比較的単調だと考えており、背景画像をカスタマイズしたいと考えていますが、背景画像をカスタマイズする方法がわかりません。背景画像を定義する方法がわからない場合、エディターは次の手順をまとめています。 Win11 で背景画像をカスタマイズするには、以下をご覧ください。 Win11 で背景画像をカスタマイズする手順: 1. 図に示すように、デスクトップの [勝利] ボタンをクリックし、ポップアップ メニューの [設定] をクリックします。 2. 図に示すように、設定メニューに入り、「個人用設定」をクリックします。 3. 図に示すように、[Personalization] に入り、[Background] をクリックします。 4. 背景設定を入力し、クリックして写真を参照します

ベン図は、セット間の関係を表すために使用される図です。ベン図を作成するには、matplotlib を使用します。 Matplotlib は、対話型のチャートやグラフを作成するために Python で一般的に使用されるデータ視覚化ライブラリです。インタラクティブな画像やグラフの作成にも使用されます。 Matplotlib は、チャートやグラフをカスタマイズするための多くの関数を提供します。このチュートリアルでは、ベン図をカスタマイズするための 3 つの例を説明します。 Example の中国語訳は次のとおりです: Example これは 2 つのベン図の交差を作成する簡単な例です。最初に、必要なライブラリをインポートし、ベンをインポートしました。次に、データセットを Python セットとして作成し、その後「venn2()」関数を使用して

CakePHP は、開発者に多くの便利なツールと機能を提供する強力な PHP フレームワークです。その 1 つはページネーションです。これは、大量のデータを複数のページに分割し、閲覧と操作を容易にするのに役立ちます。デフォルトでは、CakePHP はいくつかの基本的なページネーション メソッドを提供しますが、場合によってはカスタムのページネーション メソッドを作成する必要がある場合があります。この記事では、CakePHP でカスタム ページネーションを作成する方法を説明します。ステップ 1: カスタム ページネーション クラスを作成する まず、カスタム ページネーション クラスを作成する必要があります。これ

Eclipse でショートカット キーの設定をカスタマイズするにはどうすればよいですか?開発者にとって、ショートカット キーをマスターすることは、Eclipse でコーディングする際の効率を向上させるための鍵の 1 つです。強力な統合開発環境として、Eclipse は多くのデフォルトのショートカット キーを提供するだけでなく、ユーザーが独自の好みに応じてショートカット キーをカスタマイズすることもできます。この記事では、Eclipseでショートカットキーの設定をカスタマイズする方法と具体的なコード例を紹介します。 Eclipseを開く まず、Eclipseを開いて次のように入力します。

iPhone の iOS 17 アップデートは、Apple Music にいくつかの大きな変更をもたらします。これには、プレイリストで他のユーザーとコラボレーションしたり、CarPlay を使用してさまざまなデバイスから音楽再生を開始したりすることが含まれます。これらの新機能の 1 つは、Apple Music でクロスフェードを使用できる機能です。これにより、トラック間をシームレスに移行できるようになり、複数のトラックを聴く場合に優れた機能になります。クロスフェードは全体的なリスニング体験を向上させるのに役立ち、トラックが変わったときに驚いたり、体験から脱落したりすることがなくなります。この新機能を最大限に活用したい場合は、iPhone での使用方法を次に示します。最新の情報が必要な Apple Music のクロスフェードを有効にしてカスタマイズする方法

Vue は、開発者がインタラクティブなフロントエンド アプリケーションを構築するのに役立つ多くの便利な関数と API を提供する人気の JavaScript フレームワークです。 Vue3 のリリースに伴い、レンダリング機能が重要なアップデートになりました。この記事では、Vue3 のレンダリング関数の概念と目的、およびそれを使用してレンダリング関数をカスタマイズする方法を紹介します。レンダリング関数とは何ですか? Vue ではテンプレートが最も一般的に使用されるレンダリング方法ですが、Vue3 では別の方法を使用できます。

CodeIgniter でカスタム ミドルウェアを実装する方法 はじめに: 最新の Web 開発では、ミドルウェアがアプリケーションで重要な役割を果たします。これらは、リクエストがコントローラーに到達する前または後に、共有処理ロジックを実行するために使用できます。 CodeIgniter は、人気のある PHP フレームワークとして、ミドルウェアの使用もサポートしています。この記事では、CodeIgniter でカスタム ミドルウェアを実装する方法を紹介し、簡単なコード例を示します。ミドルウェアの概要: ミドルウェアは一種のリクエストです
