これは私がまったく頭に入らない宿題の質問です
非常に単純な暗号化アルゴリズムです。アルファベットとして文字列から始めます。
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!, .
次に、次のように機能する独自の文字列を入力するようにユーザーに依頼しますmap
。
0987654321! .,POIUYTREWQASDFGHJKLMNBVCXZ
次に、プログラムはこれを使用して を作成し、map
暗号化されるテキストを入力できるようにします。
たとえば、次のMY NAME IS JOSEPH
ように暗号化されます.AX,0.6X2YX1PY6O3
.AX,0.6X2YX1PY6O3
これはすべて非常に簡単ですが、彼はそれが 1 対 1 のマッピングであり、プログラムに戻ると抜け出すことを暗示していると述べました。MY NAME IS JOSEPH
.AX,0.6X2YX1PY6O3
になるので、これは起こりませんZ0QCDZQGAQFOALDH
マッピングは、逆方向に行ったときに復号化するためにのみ機能しますが、問題は、プログラムがループして毎回 1 つのアルゴリズムを実行することを意味します。
可能性があると言う人がいたとしても、私は幸せになるだろう、可能性のある仕組みでいっぱいの紙のページがありますが、何も思いつきませんでした。アルゴリズムを逆方向に実行する唯一の解決策はありません。それをすることを許可しました。
何か案は?
編集:
残念ながら、これを機能させることはできません (軌道計算のアイデアを使用) 何が間違っていますか?
//import scanner class
import java.util.Scanner;
public class Encryption {
static Scanner inputString = new Scanner(System.in);
//define alphabet
private static String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!, .";
private static String map;
private static int[] encryptionMap = new int[40];//mapping int array
private static boolean exit = false;
private static boolean valid = true;
public static void main(String[] args) {
String encrypt, userInput;
userInput = new String();
System.out.println("This program takes a large reordered string");
System.out.println("and uses it to encrypt your data");
System.out.println("Please enter a mapping string of 40 length and the same characters as below but in different order:");
System.out.println(alpha);
//getMap();//don't get user input for map, for testing!
map=".ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!, ";//forced input for testing only!
do{
if (valid == true){
System.out.println("Enter Q to quit, otherwise enter a string:");
userInput = getInput();
if (userInput.charAt(0) != 'Q' ){//&& userInput.length()<2){
encrypt = encrypt(userInput);
for (int x=0; x<39; x++){//here I am trying to get the orbit computation going
encrypt = encrypt(encrypt);
}
System.out.println("You entered: "+userInput);
System.out.println("Encrypted Version: "+encrypt);
}else if (userInput.charAt(0) == 'Q'){//&& userInput.length()<2){
exit = true;
}
}
else if (valid == false){
System.out.println("Error, your string for mapping is incorrect");
valid = true;//reset condition to repeat
}
}while(exit == false);
System.out.println("Good bye");
}
static String encrypt(String userInput){
//use mapping array to encypt data
String encrypt;
StringBuffer tmp = new StringBuffer();
char current;
int alphaPosition;
int temp;
//run through the user string
for (int x=0; x<userInput.length(); x++){
//get character
current = userInput.charAt(x);
//get location of current character in alphabet
alphaPosition = alpha.indexOf(current);
//encryptionMap.charAt(alphaPosition)
tmp.append(map.charAt(alphaPosition));
}
encrypt = tmp.toString();
return(encrypt);
}
static void getMap(){
//get a mapping string and validate from the user
map = getInput();
//validate code
if (map.length() != 40){
valid = false;
}
else{
for (int x=0; x<40; x++){
if (map.indexOf(alpha.charAt(x)) == -1){
valid = false;
}
}
}
if (valid == true){
for (int x=0; x<40; x++){
int a = (int)(alpha.charAt(x));
int y = (int)( map.charAt(x));
//create encryption map
encryptionMap[x]=(a-y);
}
}
}
static String getInput(){
//get input(this repeats)
String input = inputString.nextLine();
input = input.toUpperCase();
if ("QUIT".equals(input) || "END".equals(input) || "NO".equals(input) || "N".equals(input)){
StringBuffer tmp = new StringBuffer();
tmp.append('Q');
input = tmp.toString();
}
return(input);
}
}