2011-06-23 4 views
2

ipv4とipv6のアドレスを使用して固有の値を生成する必要があります。つまり、192.37.4.60を入力した場合です。一意のキーを生成し、192.60.4.37と入力すると別のキーを生成する必要があります。どのように私はこれを行うことができます誰も私を助けて、私はまた、入力ごとに一意の値を生成する方法もipv6アドレスを入力することができます。任意のアルゴリズムまたは任意の現在のアルゴリズムを推薦することができます一意のKEY生成のアルゴリズム

+3

なぜ鍵にIPアドレス自体を使用しないのですか? –

+2

キーはどのように使用されますか。アルゴリズムの選択に影響する可能性があるためです。 – ALOToverflow

答えて

0

出力IPアドレスを入力してください:voilà、requirements met!

(私の解決策は、あなたのために動作しない場合、それはあなたがあなたの質問に詳細を追加する必要があることを意味)

+0

もし私がipv6アドレスを入力した場合、私はそれが範囲外になるので、それをやります。そのような大きな数字も欲しくはありません。 –

+0

@hopelessコーダー:可能なIPv6アドレスのユニークなキーが必要な場合は、鍵は128ビットの番号であり、これは単純にいくつの固有のIPv6アドレスがあるかということである。あるいは、新しいIPアドレスが表示されているときにキーを順番に割り当てることで、IPアドレスへのキーのテーブルを作成することもできます。 – caf

+0

@hopelessコーダー:あなたは*あなたの質問に数字*を望んでいないと指定していません。あなたが何をしたいのかを説明しなければ、助けが不可能です。 –

1

IPはかなりユニークです:)特にIPv6のアドレス。 また、ハッシュアルゴリズム(例:MD5、SHA1など)を使用して「キー」を作成することもできます。入力データがユニークである限り、ユニークになります:)

+0

私はMD5 algoを試しましたが、o/pは128ビットです。このようなことをしました[root @ INFBA01415〜]#vi simple.txt [root @ INFBA01415〜]#md5sum simple.txt d41d8cd98f00b204e9800998ecf8427e simple.txtこのデータを印刷すると、エラーが出力されます –

+0

まあ、おそらく*ユニークです:) –

+0

@static_rtti:免責事項を追加してうれしいです。 @BasicWolf:128ビットから160ビット幅の暗号化ハッシュを使用するかどうかは関係ありません(それぞれMD5とSHA1の場合のように)32ビットのIPv4アドレスをハッシュし、それほど賢明な128ビットのIPv6アドレスではありません。 (アドレスを単に使用するのと比較して)かなりの処理ペナルティのために、一意性の度合いに相当な利得がある場合はおそらくほとんどありません。 – Mac

0

問題のニーズに応じていくつかの解決策があります。

  1. あなた身を取り上げますが、IPアドレスを詐称することができることを心に留めておくIPを使用することができます。あなたは、通信チャネルを確保するために複数のピアの中で、このキーを使用する場合
  2. 、その後、あなたはだけいくつかの静的なためにそれらを使用したい場合はsymmetric-keyまたはpublic-keyアルゴリズム
  3. に対するご覧になる場合がありますデータはMD5AESSHA *のいずれかを使用できます。

アルゴリズムに複数のソースを使用したい場合があります。

:MACアドレスとの組み合わせで、使用することを検討してください、あなたは機械/クライアントから入手することができ、他の材料に関連した情報は、どのアプリケーションがその数値(10進数)表現にIP変換

+0

私はMD5 algoを試しましたが、o/pは128ビットです。このようなことをしました[root @ INFBA01415〜]#vi simple.txt [root @ INFBA01415〜]#md5sum simple.txt d41d8cd98f00b204e9800998ecf8427e simple.txtこのデータを印刷するだけでエラーになります –

+0

エラーは何ですか? – ALOToverflow

+0

私は上記のヘキサ値をdecimla相当のantに変換しました。#includeを出力しようとしました int main(){long int x = 15284527576400310788; printf( "%ld \ n"、x); 0を返します。 } test.c:4:14:warning:整数定数が大きすぎるため、unsignedです。test.c:関数 'main ':test.c:4:warning:この小数定数は、 ISO C90 test.c:4:warning:整数定数が "long"型には大きすぎるtest.c:4:警告:暗黙的な定数変換でオーバーフローする –

2

を実行します10.0.0.1 - > 00001010 00000000 00000000 00000001 - > 167772161

これは、内部でたくさんのIPアドレスが格納される方法です。 32ビットの記憶容量しか必要としないのでいいです。これもIPv6でも可能ですが、uint32よりも大きなものが必要になります。

+0

ipv6アドレスを持っている場合の対処方法 –

+0

@hopeless:[この記事を参照](http://msdn.microsoft.com/en-us/library/aa921042.aspx) )。同じロジックが適用されますが、IPv6には数字の欠落があります(先行ゼロを削除できるため)。これを考慮する必要があります。 –

+0

であり、IPv6アドレスをバイナリ(記事ごと)に変換すると、その128ビットの番号は他の番号と同様に使用できます。必要に応じてキーとして使用できます。 –

0

1つの可能な解決法は、左シフト演算子を使用して加算することです。次のコードは、あなたのユニークな値

int a=1; 
int b=2; 
int c=3; 
int d=4; 

int value =(a<<24)+(b<<16)+(c<<8)+d; 
+1

独自の暗号アルゴリズムを発明するのは良い考えではありません。 – ALOToverflow

+0

@フランシス:これはドット付き10進数のIPv4アドレスがどのように表現されているかを示しています。これは、アドレス "1.2.3.4"を32ビットで格納しています。しかし、署名されたintを使用しているため、小さなバグがあります。また、a、b、c、dは潜在的に255よりも大きくなり、問題を引き起こす可能性があります。 –

+0

クリスがバグを指摘してくれたことに感謝します – MARK

0

を与えるだろう、その後、B、C場合やオクテットを表すdは例えば、あなたはキーのいずれかに必要な特性を述べていないあなたは一意である必要があることをexcet、それほど明白解決策は、標準化されたIPアドレスをキーとして使用することです。アドレスを数字に変換する方法は明らかですが、IPv6アドレスが膨大な数になることを警告する必要があります。したがって、使用する言語に関係なくBigIntの実装が必要です。

(あなたはが実際にすべての340個のundecillionアドレスが一意のキーを持っている必要があることを意味しなかった場合は、もちろん、あなたが代わりに通常のハッシュ関数をご覧ください。)

0

別のオプションを直接inet_ptonを使用することができ。

関連する問題