0

我在这个程序中使用 vigenere 表加密了文本,但是在编译时它给出了这个异常:线程“主”java.lang.RuntimeException 中的异常:无法编译的源代码 - 不是高级网络中的语句。PolyalphabetCipher.main(PolyalphabetCipher.java: 25) Java 结果:1

任何人都可以帮我纠正它,尽快

import java.util.*;

public class PolyalphabetCipher {
public static void main(String... s)
{
    //createVigenereTable();
    Scanner sc=new Scanner(System.in);
    String key, text;

    System.out.println("Enter the keyword");
    key=sc.nextLine();
    key=key.toUpperCase();
    System.out.println("Enter text to be encrypted");
    text=sc.nextLine();
    text=text.toLowerCase();
    text=text.replaceAll("\\s+","");
    System.out.println(text);
    encrypt(key,text);      

}
public static int[][] createVigenereTable()
{
    int table[][]=new int[26][26];
    int rem=0, n=26;
    int value;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            value=j+rem;
            if(value>25)
            {
                value=value-26;
            }
            table[i][j]=value+65;
        }
    rem++;
    }

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)

            {
           char b=(char)(table[i][j]);
            System.out.print(b);
            System.out.print(" ");
            }
            System.out.println();
    }
    return table;

  }


//keyword::row and t=plainText::column
public static void encrypt(String k, String t)
{
    int len=k.length();
    char keyword[]=new char[t.length()];
    for(int i=0, j=0;i<t.length();i++)
    {
        keyword[i]=k.charAt(j);
        j++;
        if(j==len)
            j=0;

    }
    char cipherText[]=new char[t.length()];

    int vigenere[][]=new int[26][26];
    vigenere=createVigenereTable();
    System.out.println(vigenere);
    for(int x=0;x<t.length();x++)
    {
        int i=0;
        int j=0;
     for(int y=0;y<26;y++)
     {
         if(keyword[x]==vigenere[0][y])  
                 i=y;
         if(t.charAt(x)==vigenere[y][0])
                 j=y;
     }
      cipherText[x]=(char)(vigenere[j][i]);   
     }
    System.out.println(cipherText);
    }

}
4

2 回答 2

0

如果您使用不基于 ASCII 表的清晰映射字母-> 整数,该算法将更容易实现。

这可以通过创建两个翻译映射来完成,

toInteger= {a  0, b  1, ...}
toLetter=  {0 a, 1 b, ...}

然后简单地将消息和键转换为整数列表,并进行非常简单的转换并使用java modulo operator,最后将结果序列转换回字母。

于 2014-02-02T17:28:34.607 回答
0

使用 vignere 密码加密 end decript chars 的一种更简单的方法是使用它们的 char 值并计算加密/解密的 char 值:

public class VignereTable {

    private static final int ASCII_UPPERCASE_LETTERS_START = 65;
    private static final int ALPHABET_SIZE = 26;

    private VignereTable() {
         //prevent initialization
    }

    public static char cipherChar(char _key, char _letter) {
        return (char) ((_key + _letter) % ALPHABET_SIZE + ASCII_UPPERCASE_LETTERS_START);
    }

    public static char decipherChar(char _key, char _letter) {
        int index = _key - ASCII_UPPERCASE_LETTERS_START;
        if (_letter >= ASCII_UPPERCASE_LETTERS_START + index && _letter <= ASCII_UPPERCASE_LETTERS_START + (index * 2))
            return (char) (_letter - index);
        else if (_letter <= ASCII_UPPERCASE_LETTERS_START + index)
            return (char) (_letter + ALPHABET_SIZE - index);
        else
            return (char) (_letter - (_key - ASCII_UPPERCASE_LETTERS_START));
    }

    public static char[][] asArray() {
        char table[][] = new char[ALPHABET_SIZE][ALPHABET_SIZE];
        for (int i = 0; i < ALPHABET_SIZE; i++) {
            for (int j = 0; j < ALPHABET_SIZE; j++) {
                table[i][j] = (char) ((ASCII_UPPERCASE_LETTERS_START + ((j + i)) % ALPHABET_SIZE));
            }
        }
        return table;
    }

    public static String asString() {
        char[][] vTable = asArray();
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < vTable.length; i++) {
            for (int j = 0; j < vTable.length; j++) {
                builder.append(vTable[i][j]).append(" ");
            }
            builder.append("\n");
        }
        return builder.toString();
    }
}
于 2017-10-15T23:05:52.740 回答