我需要创建一个程序,接受来自.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();
}
}
}
答案 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;