当前位置: 首页 > 知识库问答 >
问题:

Vigenere密码在保持空间的同时只加密以辅音字母开头的单词[Java]

洪哲彦
2023-03-14
public class Main {
public static void main(String[] args) {

    Scanner u = new Scanner(System.in);
    final String k = u.next();
    u.nextLine();
    String message = u.nextLine();
    String[] f = message.split(" ");
    System.out.println(encipher(message,k));

    for (String s : f) {
        if (s.charAt(0) == 'a' || s.charAt(0) == 'e' || s.charAt(0) == 'i' ||
                s.charAt(0) == 'o' || s.charAt(0) == 'u') {
            System.out.println(s);
        } else {
            System.out.println(encipher(s, k));
        }

    }
}


public static String encipher(String message, final String key)
{
    String output = "";

    for (int x = 0, y = 0; x < message.length(); x++)
    {
        char c = message.charAt(x);
        if (c < 'a' || c > 'z')
            continue;
        output += (char) ((c + key.charAt(y) - 2 * 'a') % 26 + 'a');
        y = ++y % key.length();
    }

    return output;
}}

共有1个答案

郎建章
2023-03-14

当逐字应用加密时,将为每个字重置密钥,并且“de”“ob”加密:

brasileira
obiobiobio

de
ob

当对整个邮件进行加密时,密钥不会重置(“Olimpiada”有9个字母,可以被“obi”整除。length()==3)并且“de”“bi”加密:

olimpiada brasileira de informatica
obiobiobi obiobiobio bi obiobiobiob

因此,如果可能需要记住y索引,或者应该实现另一个方法,在下一个索引的非空键中提供一个字符:

private static Map<String, Integer> keyIndexes = new HashMap<>();

private static char getNextPosition(String key) {
    return key.charAt(keyIndexes.compute(
        key, (k, v) -> v == null ? 0 : (v + 1) % k.length()
    ));
}

private static void resetKey(String key) {
    keyIndexes.remove(key);
}
public static String encipher(String message, final String key)
{
    StringBuilder output = new StringBuilder();

    for (char c : message.toCharArray())
    {
        if (c < 'a' || c > 'z')
            continue; // skip non-letters

        output.append((char) ((c + getNextPosition(key) - 2 * 'a') % 26 + 'a'));
    }

    return output.toString();
}
String message = "olimpiada brasileira de informatica";
String k = "obi";
System.out.println(encipher(message, k));
// !!!
resetKey(k);

for (String s : message.split(" ")) {
    if (s.matches("[aeiou]\\w*")) { // use regexp to detect a word starting with a vowel
        System.out.println(s);
    } else {
        System.out.println(encipher(s, k));
    }
}
cmqaqqoeipsigjtsjzoemwoncsuouqqb   // full message, spaces skipped
olimpiada
psigjtsjzo
em
informatica
public static String encipherWork(String message, final String key) {
    StringBuilder output = new StringBuilder();
    
    boolean inWord = false;
    boolean firstVowel = false;

    for (char c : message.toCharArray()) {
        if ('a' <= c && c <= 'z') {
            if (!inWord) {
                firstVowel = (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
                inWord = true;
            }
            if (!firstVowel) {
                output.append((char) ((c + getNextPosition(key) - 2 * 'a') % 26 + 'a'));
                continue;
            }
        } else {
            inWord = false;
            firstVowel = false;
        }
        output.append(c); // print non-enciphered characters
    }

    return output.toString();
}
olimpiada psigjtsjzo em informatica // full message
olimpiada
psigjtsjzo
em
informatica
 类似资料:
  • 我有一个文本文件,我已经加密使用移位,但我需要加密加密的文本再次,但这一次使用vigenere密码。然后我需要解密加密的文本(首先是vigenere,然后是Shift),但所有的大小写字母以及黑色空格、引号、逗号和句号都需要保持不变。我已经完成了移位、加密和解密,剩下的就是Vigenere了。下面显示的是我加密Vigenere的类,我还没有写解密,因为我被卡在加密步骤。谢谢你。

  • 我被分配了一个任务,从数组列表中返回以特定字母开头的单词,但是我选择了字母c;我被告知我可以用另一种方式做到这一点,除了专门返回每个以字母开头的元素和许多println之外,我不知道除了使用ArrayList startswith方法之外,还有什么其他方法可以做到这一点,有人愿意启发我吗? }

  • 我只需要反转字符串中的字母,并使用将符号和数字保持在相同的位置,并且我还需要保持反转单词的相同顺序。我的代码反转字符串并将符号和数字保持在适当的位置,但更改单词的顺序,例如: 我的输入字符串: a1bcd efg!H 我的输出字符串: h1gfe dcb!A. 相反,我的输出应该是: d1cba hgf! e

  • 问题内容: 这是Hadoop字数统计Java映射并减少源代码: 在map函数中,我已经到了可以输出所有以字母“ c”开头的单词以及该单词出现的总次数的位置,但是我想做的就是输出总数以字母“ c”开头的单词,但我在获取总数上有些停留。任何帮助将不胜感激,谢谢。 例 我得到的输出: 可以2 罐3 猫5 我想要得到的是: 合计10 问题答案: 克里斯·格肯 的答案是正确的。 如果您要输出单词作为关键字,

  • 我有一根绳子,例如“狗是好宠物” 我只想返回以辅音开头的单词。[“狗”、“好”、“宠物”]作为列表

  • 本文向大家介绍Python中的正则表达式,用于在以大写字母开头的单词之间放置空格,包括了Python中的正则表达式,用于在以大写字母开头的单词之间放置空格的使用技巧和注意事项,需要的朋友参考一下 我们在这里试图解决的问题是将CamelCase转换为单独的单词。我们可以使用正则表达式直接解决此问题,方法是查找给定字符串中所有出现的大写字母,并在其前面放置一个空格。我们可以使用re模块中的sub方法。