Youtubeで擬似ランダムIDを生成します

Hi%username%! ID を連続して生成する必要がある場合があります。そのため、ID が繰り返されないことが保証されます 。 YouTubeでは、これは、ブルートフォースを使用して新しいビデオレコーダーや古いビデオレコーダーを取得できないようにするために使用されます。また、異なるファイルホスティングサイトでは一般的であり、通常、値を直接反復することを防止または少なくとも困難にする必要がある場合はどこでも使用できます。









たとえば、私たちの大学で学生をテストするために使用されたmoodleシステムでは、応答IDはデータベース全体に対して増分され、エンドツーエンドでした。 正解は、質問内の最小のIDを持つものであると仮定するのは論理的です。 一般に、テストに問題はありませんでした。 その後、GUIDに切り替えましたが、その頃にはすでに卒業していました。



このような長さ制限のあるシーケンスを、最も単純なものから暗号的に強力なものまで生成するいくつかの方法を見てみましょう。



控除リング



より正確には、残基環の乗法群。 実際には思ったより簡単です。 写真を説明します。



画像






ご覧のとおり、ここの3つの程度は順番になります。

1、2、3、4、5、6、および除算の剰余の結果は

3、2、6、4、5、1。ただし、結局のところ、1〜6のすべての数字が存在します。



7はモジュールと呼ばれ、3はプリミティブルート(ジェネレーター)と呼ばれます。 これが機能するには、モジュールが次の形式である必要があります。

画像






ここで、pは2より大きい素数です。 私たちのモジュールは、彼らの助けを借りて生成できる最大のID値です。



擬似ランダムIDを生成するためのアプローチとは何ですか? IDを順番に取得し、ジェネレーターをこのIDの累乗にし、剰余をモジュロで取得します。 十分に大きいモジュールの場合、非常にうまく機能します。



ちなみに、これはほとんどDiffie Hellmanであり、規模は小さいです。 ちなみに、ペンを使用してWebサーバーのDHパラメーターを生成した人は、プロセスが迅速でないことを知っています。 多数のプリミティブルートを探すのは簡単ではないからです。



線形合同法



多くのプログラミング言語でデフォルトの乱数ジェネレーターとして人気がありますが、暗号化は絶対にそうではありません。 彼女の式は次のとおりです。



画像






パラメータを正しく選択すると、 mに等しい期間が提供されます。



そして、 mとして素数を選択した場合、特定の条件下でcを捨てることができ、期間は最大またはそれに近いものになります。



欠点は明らかです-特別な数字を探す必要があり、それがバイトのサイズの倍数になるという事実ではありません。 さて、シーケンスの次の用語を予測するために、前の用語を知っていれば、数学者はそれを証明しました。



フィードバック線形シフトレジスタ



ほんの数ビットを強調することで疑似ランダムシーケンスを生成できる、絶対に素晴らしい構造。 XORするビットは、LFSRの基礎となる多項式を決定します。 プリミティブの場合、シーケンスは最大になります。



これらの原始多項式は、簡単に生成することはできません。素数を探す方法についてです。 しかし、与えられた次数の原始多項式を見つけることができる優れたprimpolyプログラムがまだありました。 -aオプション(Primpoly.exe -a 2 64など)を渡すと、すべての可能な原始多項式をリストにリストすることもできます。



Youtubeのような8バイトのIDが必要な場合、最も小さい多項式x ^ 64 + x ^ 4 + x ^ 3 + x + 1です。



使い方:



ゼロ以外の64ビット数があります。 ビット64、4、3、1の間で口論します。多項式の単位は、数値が1ビット右にシフトされ、xorの結果が最上位ビットに配置されることを意味します。



Cでの実装例:



bit = ((lfsr >> 0) ^ (lfsr >> 60) ^ (lfsr >> 61) ^ (lfsr >> 63) ) & 1; lfsr = (lfsr >> 1) | (bit << 63);
      
      





0のシフトはビット64、1のビット63をシフトします。このコードが無限ループで実行された場合、最終的に開始した値に到達します。



また、異なる多項式を使用して複数のレジスタを介して数値を実行すると、数学的に精通した仲間でさえそのようなシーケンスを予測することは非常に困難になります。 ところで、LFSRの組み合わせの原理に基づいて、GSMトラフィックA5 / 1およびA5 / 2の暗号化アルゴリズムが構築されていますが、それらは既に壊れていますが、それでもです。



このアプローチの欠点は、IDを順番に取得することしかできず、どのIDが「1つ経由する」かを事前に知ることができないことです。 したがって、次の方法に進みます。



リバーシブル機能



または、それらを同型と呼びます。 ここでは、一般に、無限の数のオプションがあり、すべてはあなたの想像力とプロセスの複雑さを終わらせたいという欲求によって制限され、その結果はあなたのIDです。



たとえば、SHA-256の関数σ0およびσ1を使用します。これらの関数は、1つの32ビット番号を別の32ビット番号にマップします(f1およびf2は、ストリーム暗号HC-128の説明で呼び出されます)。



画像

画像



>>>これは循環シフトであり、>>右へのシフトです。



以下は、これらの機能を調査した仲間からの引用です。

σ0およびσ1GF(2)-線形マッピングは1対1です(このプロパティを確認するために、σ0およびσ1を表す32x32 GF(2)行列を計算し、この行列のカーネルがnullに制限されていることを確認しましたベクトル)。


それから、それらが同型(1対1)であることは明らかであり、自分で検証することはできません。 逆関数を構築することさえできません。サイクル内のすべての数値を1つまたは2つ、あるいはその両方、または1つまたは2つ、単純に数回実行します。 そして、私たちが知っているだけの擬似ランダムな順序で32ビットの範囲のすべてのIDを取得します。



あなたが知っているように、バジリオンのような機能を考え出し、好きなように組み合わせることができます。 しかし今のところ、これは暗号化方法でもありません。 はい、必要に応じて元のIDが機能しなくなるだけです。



任意のサイズのIDシーケンスの暗号生成



信じられないかもしれませんが、すでにすべてが発明されているので、それについての記事を書きました



ここでのみ、クレジットカード番号はありませんが、必要な大きさの番号が付けられています。 BPSアルゴリズムの1ラウンドで1ビット単位で16〜192ビット。 必要に応じてシステムのベースを取得します。必ずしも8の倍数ではありません。アルゴリズムでは、最大ベースの制限は65536ですが、技術的には、feistelネットワークの半分に96ビットが配置されます。 または、まったく変質せずに、ベース256を作成し、IDにあるバイト数だけを暗号化します。



したがって、AES、IV(Tweak)のキーであるこのベースでBPSを構成し、このBPSを介して1から「システムのベース-1」までのすべての元のIDを実行します。 その後、何が起こったのか、base58でそれをラップします。ここに、美しい既製のIDがあります。



それを保存する必要はありません。解読して元の通常のIDと関連付けることができます。バックエンドは、IDを不正に変更していることすら知らないかもしれません。



真のランダム



暗号強度の面で最も面倒なアプローチ(理論的には何も予測できない)が、経済的には不便。 何らかの鉄片で偶然に各IDを絶対に生成し、まだないことをデータベースでチェックしてから書き込みます。 しかし、時間の経過とともに生成が遅くなるかどうか、およびその他の問題があるかどうかを確認するために、データベースに毎回登る必要があります。



そのようなこと。



All Articles