0

私はJavaに比較的慣れていないので、タスクを完了するためにここ数日頭を悩ませていましたが、この最後の「クエスト」まではすべてうまくいきました。

より具体的に:

3 つの文字列フィールドから暗号化/エンコードされた 4 桁の数字を作成したいと考えています。クレジット カードの場合のように、カード番号 (exp. 日付とサービスコード。これを達成するために、最初にランダムキーでDESを使用してカード番号を暗号化し、次に暗号化されたカード番号をキーとして使用して有効期限を暗号化(DES)し、最後のステップとして、暗号化された有効期限を使用してサービスコードを暗号化(DES)しました。キーとして。これまでのところ、必要な情報をすべてのステップで取得できます。問題は、最終的な出力となる暗号化されたサービス コードの長さが 4 で、数字のみが含まれていることです。ネットで2日間調査した後、次のようないくつかの試みを試みた後:

  • ハッシュ: 問題は、ハッシュ値から暗号化されたサービス コードへのデコード バックがないことでした
  • Base64 変換: 長さを達成できず、数字のみです
  • padding : 重要な情報が失われます
  • さらに暗号化: このような短い (長さの点で) キーを生成するアルゴリズムが見つかりませんでした。

他の解決策はありますか?

アルゴリズムの最後の 2 つのステップを次に示します。これは、アルゴリズムがどのように実行されているかを理解するためのものです。

desCipher.init(Cipher.ENCRYPT_MODE, myDesKey_2);

        // Sensitive information - message to be encrypted
        byte[] date_of_exp = "032019".getBytes(); // Date of Expiration in form MMYYYY

        //System.out.println("Card Number : " + card_number); // Print original message

        // Encrypt the text
       byte[] date_of_expEncrypted = desCipher.doFinal(date_of_exp);

        System.out.println("");
        System.out.println("Date of Expiration Encrypted : " + date_of_expEncrypted); // Print the encrypted message
        System.out.println("");

        // Initialize the same cipher for decryption
        desCipher.init(Cipher.DECRYPT_MODE, myDesKey_2);

        String date_of_expEncrypted_;
        date_of_expEncrypted_ = DatatypeConverter.printBase64Binary(date_of_expEncrypted); 
        // SecretKey card_numberEncrypted_key;
        // card_numberEncrypted_key = stringToSecretKey (card_numberEncrypted_, "DES");
        SecretKey date_of_expEncrypted_key;
        date_of_expEncrypted_key = new SecretKeySpec(date_of_expEncrypted, 0, 8, "DES");
        System.out.println("");
        System.out.println("Date of expiration as secret key :" + date_of_expEncrypted_key);
        System.out.println("");

        // Decrypt the text
        byte[] date_of_expDecrypted = desCipher.doFinal(date_of_expEncrypted);

        System.out.println("Original Date of Expiration (decrypted) : " + new String(date_of_expDecrypted)); // Print the decrypted Text
        System.out.println("");
        System.out.println("");
        System.out.println("-----------------------------------------------------------------------------------");
        System.out.println("Further to Step 3"); // Print the decrypted Text
        System.out.println("-----------------------------------------------------------------------------------"); // Print the decrypted Text
        System.out.println("");
        System.out.println("");




    SecretKey myDesKey_3 = date_of_expEncrypted_key;

    //Cipher desCipher_2; // New Cipher for iteration 2

        // Create the cipher 
        //desCipher_2 = Cipher.getInstance("DES/ECB/PKCS5Padding");

        // Initialize the cipher for encryption
        desCipher.init(Cipher.ENCRYPT_MODE, myDesKey_3);

        // Sensitive information - message to be encrypted
        byte[] service_code = "318".getBytes(); 

       // Encrypt the text
       byte[] service_codeEncrypted = desCipher.doFinal(service_code);
        System.out.println("");
        System.out.println("Service Code Encrypted : " + service_codeEncrypted); // Print the encrypted message
        System.out.println("");
        // Initialize the same cipher for decryption
        desCipher.init(Cipher.DECRYPT_MODE, myDesKey_3);

        // Decrypt the text
        byte[] service_codeDecrypted = desCipher.doFinal(service_codeEncrypted);

        System.out.println("Service Code decrypted : " + new String(service_codeDecrypted)); // Print the decrypted Text
        System.out.println("");
        System.out.println("");
        System.out.println("-----------------------------------------------------------------------------------");
        System.out.println("Finish!!!"); // Print the decrypted Text
        System.out.println("-----------------------------------------------------------------------------------"); // Print the decrypted Text
        System.out.println("");
        System.out.println("");


        //Integer bigInt = new Integer("Bwwhw34".getBytes());
        // int service_codeEncrypted_hashed = service_codeEncrypted.hashCode();
        // System.out.println("hash code for Service Code Encrypted : " + service_codeEncrypted_hashed);
        // int service_codeEncrypted_hashed_2 = service_codeEncrypted_hashed.hashCode();

        // byte[] service_code__ = service_codeEncrypted.getBytes(); 
        //  System.out.println("hash code for Service Code Encrypted and baseD  : " + service_code__);



    }catch(NoSuchAlgorithmException e){
        e.printStackTrace();
    }catch(NoSuchPaddingException e){
        e.printStackTrace();
    }catch(InvalidKeyException e){
        e.printStackTrace();
    }catch(IllegalBlockSizeException e){
        e.printStackTrace();
    }catch(BadPaddingException e){
        e.printStackTrace();
    } 

}

出力「暗号化されたサービスコード」は [B@84abc9 の形式になりますが、これは私の目的には役に立ちません。

事前に感謝し、私の下手な英語で申し訳ありません!

4

1 に答える 1

1

「3 つの文字列フィールドから暗号化/エンコードされた 4 桁の数字を作成したい。」

あなたの唯一の選択肢はハッシュです。それ以外の場合は、ハリー・ポッターに助けてもらう必要があります. それとも、4 桁を任意の 3 つの文字列に変換できると思っていましたか? 残念ながら、そのような圧縮は存在しません。

あなたの「[B@84abc9」について。これがバイト配列のデフォルトの toString() です。表示する前に、16 進数または Base64 に変換する必要があります。

于 2013-09-24T11:17:19.230 に答える