Java - 使用关键字创建单字母密码

时间:2017-04-27 23:33:58

标签: java encryption

我需要创建一个程序,接受来自.txt的关键字,然后使用该关键字创建一个神秘的字母表。我需要的字母表采用密钥的非冗余字母并将它们放在字母表的前面,然后反转剩余的字母表。因此,如果我的关键字是“KEY”,则新字母表将是KEYZXWVUTSRQPONMLJIHGFDCBA。然后我必须使用密码字母来加密来自另一个.txt的句子。

我猜我需要使用bufferedReader而不是FileReader?此外,我对密码字母进行了硬编码,但无法弄清楚如何接受来自.txt的密钥来确定密码(例如,如果密钥发生变化)。

如果有人可以给我一个或两个指针在哪里开始,我们将不胜感激。

以下是我使用的一些硬代码:

package com.encryption.encryptionstring;


import java.util.*;
import java.io.*;
import java.nio.*;


public class MonoalphabeticEncryption
{

     public static char p[]  = { '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' };

     public static char ch[] = { 'T', 'R', 'O', 'Y', 'N', 'L', 'I', 'E', 'Z',

            'X', 'W', 'V', 'U', 'S', 'Q', 'P', 'M', 'K', 'J', 'H', 'G', 'F',

            'D', 'C', 'B', 'A' };





     public static String doEncryption(String s)

    {

        char c[] = new char[(s.length())];

        for (int i = 0; i < s.length(); i++)

        {

            for (int j = 0; j < 26; j++)

            {

                if (p[j] == s.charAt(i))

                {

                    c[i] = ch[j];

                    break;

                }

            }

        }

        return (new String(c));

    }


      public static String doDecryption(String s)

      {

           char p1[] = new char[(s.length())];

           for (int i = 0; i < s.length(); i++)

           {

               for (int j = 0; j < 26; j++)

               {

                   if (ch[j] == s.charAt(i))

                   {

                       p1[i] = p[j];

                       break;

                   }

               }

           }

           return (new String(p1));

       }

       public static void main(String args[])

       {

           Scanner sc = new Scanner(System.in);

           System.out.println("Enter the message: ");

           String en = doEncryption(sc.next().toLowerCase());

           System.out.println("Encrypted message: " + en);

           System.out.println("Decrypted message: " + doDecryption(en));

           sc.close();

       }


 }
编辑:我根据Z. Bagley的建议开始更新。这是我到目前为止,一个字母数组,接受我的input.txt和keyword.txt到数组:

package com.encryption.encryptionstring;


import java.util.*;
import java.io.*;
import java.nio.*;


public class MonoalphabeticEncryption
{
   char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); //is this a good alphabet array? How do I compare one array to another?

   private String readFileKeyword(String file) throws IOException 
   {
       FileWriter fileOutput= new FileWriter("output.txt");
       BufferedReader readerKeyword = new BufferedReader(new FileReader ("keyword.txt"));
       String         lineKeyword = null;
       StringBuilder  stringBuilderKeyword = new StringBuilder();
       String         lsKeyword = System.getProperty("line.separator");

       try 
       {
           while((lineKeyword = readerKeyword.readLine()) != null) 
           {
               stringBuilderKeyword.append(lineKeyword);
               stringBuilderKeyword.append(lsKeyword);
               System.out.println(fileOutput);//will this print text from keyword.txt to output.txt?
           }

           return stringBuilderKeyword.toString();

       } 
       finally 
       {
           readerKeyword.close();
       }

   }

   private String readFileInput(String file) throws IOException
   {
       BufferedReader readerInput = new BufferedReader(new FileReader ("input.txt"));
       String         lineInput = null;
       StringBuilder  stringBuilderInput = new StringBuilder();
       String         lsInput = System.getProperty("line.separator");

       try 
       {
           while((lineInput = readerInput.readLine()) != null) 
           {
               stringBuilderInput.append(lineInput);
               stringBuilderInput.append(lsInput);
               System.out.println(stringBuilderInput); //will this print text from input.txt?
           }

           return stringBuilderInput.toString();
       } 
       finally 
       {
           readerInput.close();
       }
    }

}

2 个答案:

答案 0 :(得分:1)

首先将txt读取为字符串:How do I create a Java string from the contents of a file?

将其交换为字符串数组: string to string array conversion in java

删除重复项: How to efficiently remove duplicates from an array without using Set

之后,以相反的顺序追加数组中不存在的项目。 (您必须在循环中将字母数组与关键字数组进行比较)。

那将为您提供新的密码代码阵列!下一部分是将其他单词翻译成您的密码语言。这部分采用与前两个相同的步骤。然后,您需要做的就是将新数组的每个字母与字母数组中的索引进行比较,然后使用这些索引转换为您的密码。

希望这能让您了解从哪里开始,并祝您好运。

答案 1 :(得分:0)

要读取文件并生成cripto密钥,请尝试使用

1-将您的关键字读取为字符串。

2-创建一个[a..z]字母串。

3-对于关键字的每个字符串,遍历字母表字符串并将该字符串替换为&#34;&#34;。

4-将关键字字符串与字母表字符串的其余部分连接起来。

5-根据需要应用加密和解密(我会保留此信息供您试用)。

以下代码用于生成加密密钥作为您的要求。

public static void main(String[] args) throws IOException {

String text = new String(Files.readAllBytes(Paths.get("keyword.txt")),UTF_8);
text= generateKey(text);

System.out.println(text);


}

public static  String  generateKey(String k)
{
String alpha = "abcdefghijklmnopqrstuvwxyz"; 
String [] key = k.split("");

for (int i=0; i<key.length;i++)
    {
         alpha = alpha.replaceAll(key[i],"");
    }
  StringBuilder sb = new StringBuilder(alpha);

  return k + sb.reverse()  ;   

}

假设您的关键字是&#34; key&#34;,那么输出将是

 "keyzxwvutsrqponmljihgfdcba"

确保您在

下面导入
import java.io.IOException;
import static java.nio.charset.StandardCharsets.UTF_8;
import java.nio.file.Files;
import java.nio.file.Paths;