短いシリアル番号を生成するための非対称アルゴリズム

はじめに



最悪なのは、プログラム用にシリアル番号ジェネレーターが作成されるときです。 ハッキングされた(修正された)バージョンのプログラムはあまり使用されません-ウイルスをキャッチしたりデータを失ったりするリスクがあります。 しかし、公式サイトから本物のプログラムをダウンロードし、独自に番号を生成することが可能になると、これは開発者にとって大惨事になります。





SNG(シリアル番号ジェネレーター)から身を守る唯一の方法は、非対称デジタル署名アルゴリズムを使用することです。 この場合、公開鍵と秘密鍵の2つのキーが生成されます。 このプログラムには公開鍵が含まれており、シリアル番号の確認に役立ちます。 開発者のみが秘密鍵を持っています。シリアル番号の生成に使用できます(実際、シリアル番号はユーザー名とライセンス情報の署名です)。



この場合、秘密鍵を取得してSNGを作成することはほとんど不可能です。 この保護は、公開キーの代わりにプログラムの修正バージョンを作成することによってのみクラックされます。 しかし、これは必ずしも簡単な作業ではありません。



多くの場合、開発者はSN生成のデジタル署名アルゴリズムとしてRSAを使用します。 明らかな欠点:SNは非常に長い。 512ビットキー(実際には、最小キー長)を使用した署名は次のとおりです。



7095C60FC9ABE8968A1DDB8A9E36FCF0DBDDAC6ACE0B648E9ED72B6DC7E06880

ACF7DCC058A7433340B01E2409579210B8ACE2B3F663D2368ACEE815E3FF6E1B









明らかに、製品の箱入りバージョンのラベルからそのようなSNを入力するか、電話で口述することは非常に問題になります:)



解決策は何ですか?



よく知られている短署名デジタル署名アルゴリズムの1つはHFEです。 残念ながら、特許を取得しており、その使用には費用がかかります。



今、主なものについて



短いシリアル番号を生成するのに理想的な、公開/秘密キーを使用した代替アルゴリズムをご紹介します。 非常にシンプルで信頼性が高く、完全に無料です。 C#言語でアルゴリズムを実装したファイルが記事に添付されています。



アルゴリズムは非常に単純ですが、SNGに対して非常に安定しています。



著者の問題について。 私はこのアルゴリズムの説明を見たことがないので、今のところ(たとえそれが非常に単純であっても)自分自身をその発見者と考えています。 誰かが反対を証明した場合、私は感謝します。



したがって、このアルゴリズムに関するいくつかの事実:



データは次の形式で提供されます。署名の長さ。 ハッキング時間:



4バイト〜100年

5バイト〜35,000年

6バイト800万年



ご覧のとおり、非常に短い署名でも非常に信頼できます。 ただし、ハッキング時間は妥当な範囲内で設定できます。ハッキング時間を長く設定するほど、デジタル署名のチェックが長くなり、公開/秘密キーが長く生成されます。 上の表は、デジタル署名が1秒間チェックされるハッキング時間を示しています。 (プログラムを登録する際にSNをチェックするためにかなり受け入れられます)。 署名中、KuSignerクラスで宣言されたINTRICACY定数が責任を負います。



2番目の重要なパラメーターはキーの長さです。 キーが長いほど衝突は少なくなりますが、生成される時間が長くなります。 この長さは、プログラムの上級の悪徳ユーザー(競合を見つけるために団結する脳と大胆さを持っている)の数と等しくなければなりません。



アルゴリズムの安定性は、ハッシュ関数の不可逆性に基づいています。 私の実装ではMD4アルゴリズムを使用しています(C#での独自の実装)。 衝突はこのアルゴリズム(MD4)で検出され、多くのタスクには適していませんが、このタスクには非常に信頼性があります。 妄想は、もちろん、彼をSHA1に置き換えることができます。



私のアルゴリズムがどのように機能するかを詳細に理解するには、ソースコードを調べることが最善です。 私見、それが最も簡単な方法になります。



今、私のコードを使用するいくつかの簡単な例:



1.キー生成:



KuSigner kuSigner = new KuSigner(1000, 5); // ( :)), <br><br>kuSigner.GenerateKeys(); // : <br><br> * This source code was highlighted with Source Code Highlighter .







2. xmlでキーをエクスポートします。



string publicKey = kuSigner.ToXmlString( false ); // <br><br> string privateKey = kuSigner.ToXmlString( true ); // , <br><br> * This source code was highlighted with Source Code Highlighter .







3. xmlからのキー回復:



KuSigner publicSigner = new KuSigner(publicKey);<br>KuSigner privateSigner = new KuSigner(privateKey); <br><br> * This source code was highlighted with Source Code Highlighter .







4.ライン署名:



byte [] signatureBytes = privateSigner.Sign( Encoding .UTF8.GetBytes( " " ));<br><br> // , ( ) <br> string signatureString = BitConverter.ToString(signatureBytes).Replace( "-" , string .Empty); <br><br> * This source code was highlighted with Source Code Highlighter .







5.回線の署名の検証:



bool isValid = privateSigner.VerifySignature( Encoding .UTF8.GetBytes( " " ), signatureBytes); <br><br> * This source code was highlighted with Source Code Highlighter .







さて、初心者のために、このアルゴリズムをハックすることをお勧めします(無料ではありません!)



公開キーを投稿しています(上記の例と同じパラメーター:長さ5バイト、強度1000)。 署名時間は非常に短く、数ミリ秒(INTRICACY = 256)です。実際のプロジェクトでは、増加する必要があります。 私は秘密鍵を私に残します。



次に、数行を入力し、秘密鍵で署名します。



1.行(以下、引用符なし):「Hello world」、署名:945D50CCFD

2.行:「テスト」、署名:4C4CA4C336

3.行:「test2」、署名:EF20C68781



これらの署名は、記事に添付されたアーカイブにある公開キーを使用して確認できます。



今注目! 「Vasya Pupkin」という行の署名を取得できる人は、25 WMZを与えます。 かなり真剣に。 もちろん、金額は大きくありませんが、この問題の主なものはお金ではありません...



誰でも「Vasya Pupkin」という行の署名を検証できることに注意してください(公開鍵があります)。 しかし、私は署名することしかできません(反対のことを証明した場合、賞と一般からの承認を得ます:))。



あなたのコメントを待っています!



PS

最も重要なこと: アルゴリズムの実装と公開鍵を使用したアーカイブへのリンク




All Articles