2009-04-03 7 views
40

シリアルナンバージェネレーターとバリデーターがどのように機能するのか不思議です。私の目的は、数字と文字のみからなる5つの部分でシリアル番号を生成することです。好奇心を要しない:シリアル番号はどのように生成されますか?ヒント、アルゴリズム?

私は趣味としてコーディングを楽しみ、自分自身をプロのプログラマーと呼んでいません。しかし、私は非常に興味深い機能が、私の心を広げるために技術的にどのように機能するかに非常に興味があります。

ヒント、経験、または書かれたアルゴリズムが評価されます。私のGoogleの-はFooを使用して

+0

シリアル番号はどのようなコンテキストで使用されますか?それは単なる識別子か、安全なタイプのもの(Windows登録キーのようなもの)であることを意味していますか? – TofuBeer

+2

何をしても、一番左の桁はゼロでないようにして、 "コード"は数字として解釈されず、Excelや他のフォーマットにインポートすると消えます。私はそれが私たちがたくさん使っている私の業界の最大の問題の1つだと分かっています。すべてのシリアル番号を1で始めることを学びました。最近、悪いシリアル番号をリリースしたビデオゲームがあり、このような問題に遭遇した可能性があります。 –

答えて

16

、伝統的にシリアル番号シリアルナンバーです。だから、生産ラインからの最初の例はsn 0001であり、次のものは0002であり、次のものは0003です。私はほとんどの人がそのアルゴリズムを解くことができると思います。

私はあなたが実際に公開鍵メッセージ署名に似た仕組みを使用するプロダクトキーを求めていると思います - プロダクトキーは暗号化された値です。プログラムは公開鍵を持っており、ソフトウェアベンダーだけがプロダクトキーに「署名する」秘密鍵を持っています。 digital signaturesに関するウィキペディアの記事には一般的な仕組みがあります。唯一の条件は、ユーザによって入力されるキーがPGPよりもかなり短くなければならないということです。

非常に短いシリアル番号に制限されている場合は、通常の署名メカニズムの結果を格納するのに十分な大きさではないでしょう。この場合、チェックサムの変形を使用するのが一般的です。これは、リバースエンジニアリングが容易であるという欠点があります。その理由は、アルゴリズムが暗号特性のためではなく「秘密」であるためです。各製品には独自のアルゴリズムがあり、通常はかなり早く割れてしまいます。

5文字のブロックが5個ある場合、36^25の組み合わせが2^128より大きいため、標準デジタル署名アルゴリズムの1つを使用して128ビットを生成し、その値をベース36.

15

自分自身をpublic/private key pairにしてください。何らかの識別特性(例えば、10000で割り切れる)を有するsequence numbers(10000,20000,30000,40000、...)を生成する。プライベートキーを使用してその番号を暗号化します。人間が読めるシステム(base 32または64)を使用してその値をエンコードし、値をグループに分けて、人々が解析しやすくします。あなたのアプリの売却ごとに、コード化されたシリアル番号を配布してください。

アプリ内のどこかに公開鍵が隠されています。ユーザがコード化されたシリアル番号を入力すると、まずそのコードをデコードしてバイナリに戻します。公開鍵を使用して解読します。それが10000で割り切れることを確認してください。

難しい部分は実装にあります。簡単に置き換えることができないように公開鍵を隠しています。簡単に識別できるシーケンスを選択しますが、値が不足することはありません。 Obfuscatingアプリでは、誰かが簡単に全体の小切手をスキップすることはできません。 ...

+0

あなたが解読できるのであれば、すでに秘密鍵でデジタル署名されていることが保証されているので、解読アルゴリズムが正しい解読法を見つけ出すことができれば、内容は重要ではありません。 –

+1

ほとんどの復号化技術では、復号化アルゴリズムによって任意の値を実行できます。ほとんどのランダム入力では、ランダム出力が得られます。多くのアルゴリズムでは、ランダムなデータの塊があると、その文字列を他の文字列に復号化するキーがあります。 – Eclipse

3

乱数ジェネレータを使用して、出力をデータベースに格納できます。 アクティベーションリクエストの場合は、シリアルがデータベースにあるかどうかをチェックし、シリアルを「使用済み」とマークします。

もちろん、これにはインターネット接続が必要ですが、「一度購入、多数回、何回」の方法には適していますし、サポートコールの場合は、そのシリアルを再起動して再インストールすることもできます。

後で編集:HTTPSのような暗号化され認証された接続もインターネット検証に使用する必要があります。

3

A GUID(「グローバル一意識別子」)がこの問題を解決する簡単な方法かもしれません:

3F2504E0-4F89-11D3-9A0C-0305E82C3301 

ほとんどのプログラミング言語では、使用可能なライブラリの1つを使用してGUIDを生成できる必要があります。

+0

GUIDが「ランダムに」生成されないため、Downvoted。ユニークであることが保証されており、ランダムではないため、シリアル番号としての使用には適していません。 – ine

+8

「random」という単語は仕様には表示されません。しかし、「シリアル」はそうであり、これはランダムの反対でさえあります。だからあなたは下降投票の理由は何ですか? – mjn

+0

3番目のグループの最初の数字は、 '1'の例では、使用されるアルゴリズムを示します。バージョン1は生成エンティティのMACアドレスを含み、バージョン4は疑似乱数に基づく。 – sisve

関連する問題