字母替换密码,单字母密码,不使用HashMap

时间:2016-02-23 07:25:05

标签: java regex encryption

首先,用户提供替换密钥。
第二,用户根据给定的密钥提供加密文件名。

替换应该是这样的:

abcdefghijklmnopqrstuvwxyz
变成了 的 kngcadsxbvfhjtiumylzqropwe

大写字母保留资本,例如,如果字符是' A' - >' K'
如果它不是字母,那么它保持不变(保留文件文本的空格)

这就是我提出的:

public static void encrypt(){
        //System.out.println(inText);
        for(int j=0;j<inText.length()-1; j++){
            for(int i=0;i<26;i++){
                if(letters[i]-inText.charAt(j) ==0){
                    outText = inText.replace(inText.charAt(j), userKey.charAt(i));
                }
            }
        }

    }

只有&#39; ---&gt;&#39; r&#39;而不是文本文件的其余部分。需要帮助!

sampleinput.txt:

  

CS 3欢迎你!

     

在本课程中,我们将介绍不同的材料。

     

每种材料对于下一篇要了解的材料都非常重要。

键:

  

qwertyuioplkjhgfdsazxcvbnm

1 个答案:

答案 0 :(得分:1)

encode()方法存在的问题是outText始终被下一次替换覆盖。

outText = inText.replace(inText.charAt(j), userKey.charAt(i));

由于d是输入文本中的最后一个字符,因此最后一个字节存储在outText中。哪个是d替换r

// plain   abcdefghijklmnopqrstuvwxyz
// userKey qwertyuioplkjhgfdsazxcvbnm
//            *
outText = inText.replace('d', 'r');

这里可能有一个附加评论。

if(ls.charAt(i)==inText.charAt(j)){
    outText = inText.replace(inText.charAt(j), userKey.charAt(i));

解释输入文本中的最后一个字符&#34; ...下面 d 。&#34;

  • 使用if语句检查输入文本中索引j处的字符(d)是否等于索引i处的字符(at索引3)在普通字母表中
  • 如果匹配,则从用户密钥(i)获取索引r处的字符替换
  • 然后您在输入文本d中将r替换为inText,其中不包含任何先前的替换

编辑问题是您不能保留以前的替代品。

第一个小写字符是e

  

CS 3 W e 得到你的支持!
  在本课程中,我们将介绍不同的材料   每种材料对于下一种材料都非常重要。

应替换为字符t

  

CS 3 W t lcom t 你!   在本课程中,w t 将通过diff t r t nt mat t rials。
  每个垫子 t 对于 t n t xt mat t rial to und t rstand。

作为此替换的基础,您使用inText(纯文本),结果存储在outText中。

下一个小写字符是l

  

CS 3我们 l 来找你!
  在本课程中,我们将介绍不同的材料   每种材料对于下一种材料都非常重要。

应由字符k代替。当您再次使用替换inText的基础时,先前的替换e -> t将丢失。 outText中的结果是

  

CS 3我们 k 来找你!
  在这个c k 的屁股中,我们wi kk 经历不同的材料 k s。
  每个材料 k 对于下一个 k 材料非常重要。

等等。

解决这个问题的一个天真想法可能是在每次替换后将文本分配给inText

outText = inText.replace(inText.charAt(j), userKey.charAt(i));
inText = outText;

但是你也可以替换已经被替换的字符,结果将是

  

CS 3 Wckcccca ccc!
  Ic ccca ckaaa,cc cckk cc ccacccc accccaccc caccacaka   Eacc caccacak ca ccac ccccacacc cca ccc cccc caccacak cc ccacaacaca。

你最初的想法已经朝着正确的方向发展了。为了避免以下多个子站将更加健壮。

  • 一个接一个地从纯文本中取出一个字符
  • 如果此角色具有替代字符
    - &GT;将替换字符添加到输出文本中 否则
    - &GT;将纯文本中的字符添加到输出文本

以此代码段为例

String alphabet = "abcdefghijklmnopqrstuvwxyz";
String userKey = "qwertyuioplkjhgfdsazxcvbnm";
String plainText = "CS 3 Welcomes you!\n"
        + "In this class, we will go through different materials.\n"
        + "Each material is very important for the next material to understand.";
StringBuilder substitutedText = new StringBuilder(plainText.length());
for (int i = 0; i < plainText.length(); i++) {
    char plainCharacter = plainText.charAt(i);
    int indexAlphabet = alphabet.indexOf(plainCharacter);
    if (indexAlphabet >= 0) {
        char substitutedCharacter = userKey.charAt(indexAlphabet);
        substitutedText.append(substitutedCharacter);
    } else {
        substitutedText.append(plainCharacter);
    }
}
System.out.println(substitutedText.toString());

<强>输出

  

CS 3 Wtkegjta ngx!
  Ih zioa ekqaa,vt vokk ug zisgxui royytsthz jqztsoqka。
  Eqei jqztsoqk oa ctsn ojfgszqhz ygs zit htbz jqztsoqk zg xhrtsazqhr。