0

私はこれに関する情報を検索しようとしましたが、使用する正しい用語を知らないはずです...

ランダムに推測されたコードが有効である可能性が低くなるように十分なパディングを使用して、人間が読み取りおよび書き込み可能なパスコードに情報を格納する最も簡単な方法は何でしょうか。8ビットコンソールゲームのパスワード保存システムとは異なります。

私の特定のケースでは、3つの符号なし整数(最大長はそれぞれ約20ビット)をJava 1.4.2でパスコードにエンコードし、Webサーバーで復号化できるようにしたいと考えています。パスコードを一意にするために、ランダムまたは日付ベースの値を追加することも考えていました。

コードでは、数字、大文字と小文字、および場合によってはいくつかの単純な記号を使用できますが、1lIやO0などの混乱しやすい文字はおそらく除外する必要があります。ユーザーが入力する必要があるので、明らかに短い方が良いです。

ありがとう!

4

2 に答える 2

1
  1. 使用するアルファベットを選択してください。必要な数のシンボルを任意の順序で含めることができます。アルファベットの例ABCDEFGHJKLMNPQRSTUVWXYZ0123456789は、34個の記号を含むものです。
  2. 保存するデータを、ビットシフトとビット単位のor、または乗算と加算を使用して、単一の整数としてエンコードします。あなたが言うように約20ビットのデータがある場合、これは問題にはならないはずです。
  3. 手順1の整数を基数Nにエンコードします。ここで、Nはアルファベットの記号の数であり、アルファベットの記号を使用して印刷します。
  4. 最後に「チェックディジット」を追加します。すべての出力桁modNを追加することは、シンプルで便利なシステムです。チェックディジットは実際の暗号ではなく、保存コードの偽造にを入れている人を止めることはできませんが、ランダムに選択されたコードが機能する可能性を制限します。アルファベットに34個の記号がある場合、ランダムコードでチェックディジットが一致する可能性は34分の1にすぎません。
  5. デコードするには、最初に受信したコードのチェックディジットを検証し、次に基数N表現をデコードし(逆の手順3)、次に整数値から個々の値を抽出します(逆の手順2)。

kベースのデータのビットnと1つのチェックディジットを表すために必要なシンボルの数はです。これは、 =20ビットと=34の場合ceil(k * log(2) / log(n)) + 1はわずか5です。kn

于 2012-07-01T05:27:43.053 に答える
-1

プロパティをBase64としてエンコードできます。唯一の制限は、プロパティのサイズを固定する必要があることです。MD5アルゴリズムまたは同様のエンコードされた文字列を適用することをお勧めします。

Java1.4用のApacheCommonsコーデックを使用してこのスニペットを見てください

public class Base64Encoder {

/**
 * Base64 game properties encoded
 * @param properties list of properties as Strings
 * @return base64 encoded properties
 */
public String encodeProperties(List properties){
    StringBuffer buffer = new StringBuffer();
    Iterator iter = properties.iterator();
    while(iter.hasNext()){
        buffer.append(iter.next().toString());
    }
    return Base64.encodeBase64String(buffer.toString().getBytes());
}

/**
 * Decodes a based64 properties
 * @param propertiesSize list of Integer with each property size
 * @param encodedProperties base64 encoded properties
 * @return List of properties as String
 */
public List decodeProperties(List propertiesSize, String encodedProperties){
    List decodedProperties = new ArrayList();
    Iterator iter = propertiesSize.iterator();
    String decoded = new String(Base64.decodeBase64(encodedProperties.getBytes()));
    int current = 0;
    while(iter.hasNext()){
        Integer propertySize = new Integer(iter.next().toString());
        String property = decoded.substring(current, current + propertySize.intValue());
        decodedProperties.add(property);
        current += propertySize.intValue();
    }
    return decodedProperties;
}

public static void main(String[] args){
    String points = "1450";
    String level = "12";
    String lifes = "2";
    Base64Encoder encoder = new Base64Encoder();
    List properties = new ArrayList();
    properties.add(points);
    properties.add(level);
    properties.add(lifes);
    String encodedProperties = encoder.encodeProperties(properties); //MTQ1MDEyMg==
    System.out.println(encodedProperties);
    List propertiesSize =  new ArrayList();
    propertiesSize.add(Integer.valueOf(points.length()));
    propertiesSize.add(Integer.valueOf(level.length()));
    propertiesSize.add(Integer.valueOf(lifes.length()));
    System.out.println(encoder.decodeProperties(propertiesSize, encodedProperties)); //[1450, 12, 2]
}

}

于 2012-07-01T06:14:34.770 に答える