私は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 の形式になりますが、これは私の目的には役に立ちません。
事前に感謝し、私の下手な英語で申し訳ありません!