【问题标题】:Java Homework - File EncryptionJava 作业 - 文件加密
【发布时间】:2015-07-27 22:34:11
【问题描述】:

字符串字母 = "abcdefghijklmnopqrstuvwxyz"; 字符串 enc = "kngcadsxbvfhjtiumylzqropwe";

您好,对于我的家庭作业,我必须编写一个对文件进行编码或解码的程序,然后使用上面的映射对文件进行编码或解码。例如,在对文本进行编码时,每个“a”都变成了“k”,而在解码时,每个“k”都变成了“a”。如果是大写,则相同的概念,并且数字和其他字符未编码并保持不变。

现在我遇到的问题是如何从文件中获取每个字符的索引,然后将其与加密数组的索引相对应。如您所见,我使用的是 switch 语句,但这将永远持续下去,而且我知道 api 中必须有一些东西可以帮助我解决这个问题,我只是找不到任何东西。提前致谢!

这是我的代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Encode {
    public static void main(String[] args) throws FileNotFoundException
    {
         char[] alphabet = {'a', 'b', 'c', 'd', 'e', 'f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
         char[] decryption = {'k','n','g','c','a','d','s','x','b','v','f','h','j','t','i','u','m','y','l','z','q','r','o','p','w','e'};
         char[] alphabetLower = new char [26];
         char[] alphabetUpper = new char[26];
         char[] decryptedPassword = new char[26];
    /*   for(int i=0; i<decryptedPassword.length; i++)
         {
             decryptedPassword[i] = '';
         }*/



            //add the letters of the alphabet to alphabet lower
            for(int i=0; i<alphabet.length; i++)
            {
                alphabetLower[i] = alphabet[i];
            }
            //add the letters of the alphabet to alphabetdecryptedPassword
            for(int i=0; i<alphabet.length; i++)
            {
                alphabetUpper[i] = Character.toUpperCase(alphabet[i]);
            }


        Scanner input = new Scanner(System.in); //scanner for input file name



        String filePath = "C:/Users/omid/Desktop/";
        System.out.println("Please enter the file name for which you want to decode");
        String fileName = "password"; //input.nextLine();
        String file = filePath + fileName + ".txt";
        System.out.println("File name entered: " + file);

        //import file

        File fileEncrypted = new File(file);

        Scanner in = new Scanner(fileEncrypted);
        String document = "";

        //store entire password in document

        while(in.hasNextLine())
        {
            document = in.nextLine();
        }
        in.close();

            System.out.println("password normal: " + document);
            char[] letters = new char[document.length()];

        for(int i = 0; i<document.length(); i++)
        {
                letters[i] = document.charAt(i);
        }

        for(int i=0; i<letters.length; i++)
        {
            System.out.println(letters[i]);
        }


/*

    for(int i=0; i<letters.length; i++)
        {
            switch(letters[i])
            {
             case 'a':
                decryptedPassword[0] = decryption[0];
                     break;
                 case 'A':
                decryptedPassword[0] = decryption[0];
                     break;
                 case 'b':
                decryptedPassword[1] = decryption[1];
                     break;
                case 'B':
                    decryptedPassword[1] = decryption[1];
                     break;
                 case 'c':
                    decryptedPassword[2] = decryption[2];
                     break;
                case 'C':
                     decryptedPassword[2] = decryption[2];
                     break;
                 case 'd':
                    decryptedPassword[3] = decryption[3];
                     break;
                 case 'D':
                     decryptedPassword[3] = decryption[4];
                     break;
                 case 'e':
                    decryptedPassword[4] += 1;
                     break;
                 case 'E':
                     decryptedPassword[4] +=1;
                     break;
                 case 'f':
                    decryptedPassword[5] += 1;
                     break;
                 case 'F':
                     decryptedPassword[5] +=1;
                     break;
                 case 'g':
                     decryptedPassword[6] +=1;
                     break;
                 case 'G':
                     decryptedPassword[6] +=1;
                     break;
                 case 'h':
                     decryptedPassword[7] +=1;
                     break;
                 case 'H':
                     decryptedPassword[7] +=1;
                     break;
                 case 'i': 
                     decryptedPassword[8] +=1;
                     break;
                 case 'I':
                     decryptedPassword[8] +=1;
                     break;
                 case 'j':
                     decryptedPassword[9] +=1;
                     break;
                 case 'J':
                     decryptedPassword[9] +=1;
                     break;
                 case 'k':
                     decryptedPassword[10] +=1;
                     break;
                 case 'K':
                     decryptedPassword[10] +=1;
                     break;
                 case 'l':
                     decryptedPassword[11] +=1;
                     break;
                 case 'L':
                     decryptedPassword[11] +=1;
                     break;
                 case'm': 
                     decryptedPassword[12] +=1;
                     break;
                 case 'M':
                     decryptedPassword[12] +=1;
                     break;
                 case'n':
                     decryptedPassword[13] += 1;
                     break;
                 case 'N':
                     decryptedPassword[13] +=1;
                     break;
                 case'o':
                     decryptedPassword[14] +=1;
                    break;
                 case 'O':
                     decryptedPassword[14] +=1;
                     break;
                 case'p':
                     decryptedPassword[15] +=1;
                     break;
                 case 'P':
                     decryptedPassword[15] +=1;
                     break;
                 case'q':
                     decryptedPassword[16] +=1;
                     break;
                 case 'Q':
                     decryptedPassword[16] +=1;
                     break;
                 case'r':
                     decryptedPassword[17] +=1;
                     break;
                 case 'R':
                     decryptedPassword[17] +=1;
                     break;
                 case's':
                     decryptedPassword[18] +=1;
                     break;
                 case 'S':
                     decryptedPassword[18] +=1;
                     break;
                 case't':
                     decryptedPassword[19] +=1;
                     break;
                 case 'T':
                     decryptedPassword[19] +=1;
                     break;
                 case'u':
                     decryptedPassword[20] +=1;
                     break;
                 case 'U':
                     decryptedPassword[20] +=1;
                     break;
                 case'v':
                     decryptedPassword[21] +=1;
                     break;
                 case 'V':
                     decryptedPassword[21] +=1;
                     break;
                 case'w':
                     decryptedPassword[22] +=1;
                     break;
                 case 'W':
                     decryptedPassword[22] +=1;
                     break;
                 case'x':
                     decryptedPassword[23] +=1;
                     break;
                 case 'X':
                     decryptedPassword[23] +=1;
                     break;
                 case'y':
                     decryptedPassword[24] +=1;
                     break;
                 case 'Y':
                     decryptedPassword[24] +=1;
                     break;
                 case'z':
                     decryptedPassword[26] +=1;
                     break;
                 case 'Z':
                     decryptedPassword[26] +=1;
                     break;
            }

        }

    */

/*for(int i=0; i<decryptedPassword.length; i++)
{
    System.out.println("password decrypted: " + decryptedPassword);
}*/








    }

    private static String split(String string) {
        // TODO Auto-generated method stub
        return null;
    }


}

【问题讨论】:

  • 您可以为此使用HashMap。将所有字母添加为Keys,并将它们的映射添加为Values。加密时,您必须在HashMap 中搜索字母表Key 以获取其映射Value。解密时,您必须在 HashMap 中搜索映射 Value 以获取其字母表 Key

标签: java arrays for-loop encryption mapping


【解决方案1】:

您可以尝试使用哈希结构。本质上,每个字符都以 1 对 1 的方式映射到每个其他字符,因此非常适合散列表或散列图结构。无需使用 switch 语句,只需在地图中查找字符即可。

HashMap<Character, Character> encryptionMap = new HashMap<Character,Character>();

for (char c : alphabet) {
    for (char d: decryption) {
        encryptionMap.put(c,d);
    }
}
....
char nextChar = "a";
char encryptedChar = encryptionMap.get(nextChar);

你需要一个 encryptionMap 和一个反方向的 decryptionMap(解密 > 字母表)。

【讨论】:

    【解决方案2】:

    您应该考虑使用 BufferedReader 读取文件,但这是另一个问题。至于不使用 switch 对字符进行编码,请考虑将字符在内部编码为整数。您可以谷歌“Ascii Table”查看每个字符的编码方式。例如,“A”被编码为 65,“a”被编码为 97。您可以利用它来索引您的字母表和解密数组。如果你的字符是大写的,我们从它减去 65 来得到该字符在数组中的索引。所以 'A' 变成 0,'B' 变成 1,等等。类似地,如果字母是小写,我们减去 97。

    例如,假设 ch 包含您要解码的字母:

    int index = -1;
    //ch is between A and Z
    if (ch >= 65 && ch <= 90){
        index = ch - 65;
    } else if (ch >= 97 &7 ch <= 122){//ch is between a and z
        index = ch - 97;
    }
    
    if (index > -1){
        char encodedChar = decryption[index];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2021-03-25
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多