• ベストアンサー

文字列からの一意なIDの生成、ただし、文字列長に合わせた長さ

ある文字列から一意な別の文字列を生成したいです。(なるべく短く) 現在は、可逆な暗号化によって実現できると考えて、DESによって実装してみました、しかし、文字列をBase64でひょうげんした際にずいぶんと長くなってしまうことがありました。 (10文字→30文字 くらい) このようなケースには、どのような方法を用いるのが適切なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • komi1341
  • ベストアンサー率65% (25/38)
回答No.2

> 暗号の法則は解読できない類のものが良いです。 もともと「可逆な暗号化によって実現できると考え」ただけで、暗号化の話ではないですよね。一意性と長さが重要なのではなかったのですか? 条件についてなら他にも、IDを管理者だけが使うのかユーザも使うのかとか、あとでIDを変更する必要が出てくるか、なども重要だと思います。ユーザが使うのなら制御文字が含まれるようなIDはダメだろうとか、注意点が増えますから。あまりいい回答がつかないようなら、一度条件を整理された方がよいでしょう。 また暗号化アルゴリズムを使うにしても、解読できないアルゴリズムは存在しません。解読にどれだけ時間がかかるか、がアルゴリズムの優劣の指標になっています。「金銭に関わる」「IDから元の文字列を類推しようとする人が現れる可能性が高い」といった、セキュリティに重点を置かなければならないシステムを構築するのでなければ、あまり神経質になることはないかと。それにシーザー暗号(シーザリオン、よりこの呼び方が多いようで)そのものを使ったら確かに容易に解読されるでしょうが、工夫すれば解読を難しくすることはできますし、単一換字式暗号を使うのが、文字数としては一番短くできると思います。 参考: http://contest2007.thinkquest.jp/tqj2007/90242/kanzi.html あとは発想を変えて、よくある桁固定の数値ID(バーコードみたいな)にするのはどうでしょう。ある桁に意味を持たせたりできますし、登録順に数字を割り当ててしまえば一意性は保たれます。元の文字列の長さにも依存しません(IDより短いものからすれば長くなってしまいますが)。 もしくは文字列をzip等で圧縮して、バレないようにヘッダを削るとか。必ずしも元の文字列より短くなるわけではないし、「読める文字列」にはならないですが。 さらには文字列が登録されるたびに、ランダムにID文字列を作って返すという手もあります。もちろん紐付け情報を保存しなければなりませんが。 このあたりは前述の「条件」が出揃っていないので使えるか分かりませんが、一応参考ということで挙げておきます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • komi1341
  • ベストアンサー率65% (25/38)
回答No.1

シーザリオン暗号とかどうでしょう。アルファベットを3文字進める、みたいなやつです。 一意性は自明、文字数は元の文と同じ。実装も、文字コードをnプラスする、みたいなノリなので簡単です。

otootooto
質問者

補足

申し訳ありません。補足が必要でした。 暗号の法則は解読できない類のものが良いです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 一意の文字列を取得したい

    同時に同じファイル名のファイルをアップロードしたときに、一意の文字列を付けて保存をして重複しないように保存をしたいです。 数値でも文字でもいいのですが、Javaで一意の文字列を取得する方法ってありますか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • ユニークな文字列を順次, 生成する関数

    C++において, 適当な文字列を元に, ユニークな文字列を順次, 生成する関数を作りたいと思っています. (LISPで云う, 関数gensym()と似た役割を持つ関数です.) 例えば, "hoge"というstringを元に, "hoge0", "hoge1", "hoge4", "hoge8", "hoge100", ...., といったように, stringが互いに重複しないように, 適当な数字を連結した文字列を順次生成したいのです. 以下のように, 私なりの方法を考えてみたのですが, これだと, 今まで生成したstringを保存するhoge_setが必要になります. 何かより良い(シンプル, 効率的な)方法がありましたら, 教えていただけますでしょうか? よろしくお願い致します. (乱数を用いた方法) 1. 元となるstring型の変数nameを, "hoge" で初期化. 既に作成したstring文字列を保存する, set < string > hoge_setを宣言. 2. 乱数を生成し, それをnameにappendしたものを, string型の変数name2に代入. 3. 同じ文字列が存在したら, 2. に戻る. 同じ文字列が存在しなかったら, hoge_setに追加する.

  • 一意(ユニーク)かつ、ソートに対してランダムなIDの発行方法

    随時増加するあるデータに対して、一意なIDを割り当ててゆきます。 通常は、1, 2, 3, … と連番を割り当てて行けば一意なIDになると思います。 その上で、IDでソートした時に発行順に並ぶのではなく、順番がランダムになるようにしたいのです。 (アルゴリズムを知らない人から、発行順を推測されないようにしたい。) そこで考えたのが、"1", "2", "3", …という文字列に対するハッシュ(SHA1やMD5)ですが、sha1("1"), sha1("2"), sha1("3"), …とIDを発行していった場合、IDが重複してしまう可能性を心配しています。(とても低い確率ではあることは分かっていますが、皆無ではありません。) ハッシュ関数を利用する他に、「一意」で「ランダム」で「衝突の可能性がゼロ」である文字列の生成方法はありませんでしょうか?(可能性がゼロというのは物理的に不可能だと思うので、例えばSHA-1であれば、160bitのハッシュが生成されますが、2^160個のIDを発行しても重複しない、ということを考えます。) 一応、規模は1000万ID程度を考えていますが、もっと大きなオーダーでも衝突しないに越したことはありません。

  • パラメータをランダム文字列で表わしたい

    某サイトでリンクをクリックすると、下記のようにランダム文字列がパラメータとして渡されるものがあります。 http://www.foobar.jp/cgi-bin/abcd.cgi?a=10004414&b=PMird395j ランダム関数で生成?もしくは暗号化?しているのではないかと思うのですが、例えば商品番号などをそのままの数値でなく暗号化することができれば、セキュリティの向上にもつながるのではないかと思います。 このような文字列をPHPで簡単に生成する方法には、どのようなものがあるでしょうか。もちろん、文字列から元のIDや番号を復元できなければなりません。暗号化を使うのが良いのでしょうか。

    • ベストアンサー
    • PHP
  • VBで暗号化した文字列をJavaで複合化することは可能でしょうか。

    VBで暗号化した文字列をJavaで複合化することは可能でしょうか。 (異なる言語間での暗号化/複合化は不可能でしょうか。) 現在考えているのは、BlowFishで暗号化し、BASE64でエンコードしたリクエストを送信し、 Java側でBASE64でデコードし、BlowFishで複合化することを考えています。 VBとJavaで同じ文字列を暗号化して比較してみたところ、一致しませんでした。

  • 暗号化文字列を英数字のみにしたい

    文字列をJavaで暗号化してURLのクエリストリングに付加したいのですが、「=」「+」等の記号が含まれるとURLエンコーディングしないといけません。 こちらの都合上それを防ぎたいので、暗号化後の文字列を半角英数字のみで構成されるようにしたいのです。 いい案があればご教授ください。 尚、現在はアルゴリズムBlowfishで暗号化したバイト配列をBase64方式にてエンコードしています。 それですと記号が含まれてしまいます。

    • ベストアンサー
    • Java
  • ランダム文字列の生成の仕方

    こんばんは。 はじめまして。 JAVAでランダムの文字列を生成する時に何か便利な機能はあるのでしょうか? CGIでは確かあったはずなんですが、 自分なりに探してみたのですがわかりませんでした。 今の自分の考えでは、ランダムで数字は生成できるので それをChar型を使って文字コードで一文字取得して、それを連結するのかな? なんて考えています。 もっといい方法があればできればご教授ください。 よろしくお願いします。

  • Visual C++でDESを使って文字列を暗号化したい

    Visual C++初心者です。 文字列をDESを使って暗号化したいのですが、 C#のサンプルしか見つけられませんでした。 C++のサンプルがありましたら教えてください。 以上、よろしくお願いします。

  • 文字列の暗号化と復号化

    .NETで文字列を固定長に暗号化したい。(ユニコード対応できる) また、暗号化したものを復号化します。 .NETに付いている暗号化のモジュールはいくつがありますが、その以外のやり方がありましょうか? 例:何桁の平文を暗号化しでも8桁の十六進数又はBASE64の秘文になる。

  • phpのコードで暗号化された文字列を得る方法

    WordPressの無料で配布されているテンプレートの footer.phpにはこのようなコードが書かれています。 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ <? eval(gzinflate(base64_decode('暗号化された文字列'))); ?> _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 文字列には英数字が沢山並んでいますが、これを暗号化される前の状態にしたいです。 どうすれば良いでしょうかご教示お願いします。

    • 締切済み
    • PHP