Код шифрования

Я пытаюсь написать простой кусок кода, чтобы взять документ и зашифровать его, а затем расшифровать. Я получил шифрование для работы, но по какой-то причине он использует другой массив для его расшифровки. Вот мой код

import java.util.ArrayList;

public class EncryptAlpha 
{
    private static int key;
    public static ArrayList<Integer> num = new ArrayList<Integer>();

/**
 * Constructs a EncryptAlpha object and sets
 * it encryption key to k
 * @param k
 */
public static int EncryptAlpha(int k)
{
    ArrayList<Integer> num = new ArrayList<Integer>();
    for(int i=0; i<10;i++)
    {
        k= 1+(int)(Math.random()*(100-1)+1);
        num.add(k);
        System.out.println(num);
    }
    for(int n=0; n<num.size();n++)
    {
        key=num.get(n);
        if(n==num.size())
            n=0;
    }
    return key;
}


/**
 * This method takes a String object and converts it into an
 * ArrayList of integers, where each integer is the sum of 
 * consecutive pairs of characters from str where the sum is 
 * one character's integer number value plus 1000 times the
 * integer value of the next character. If there are an odd
 * number of characters a ' ' is added as the last character
 * @param str theString to be converted
 * @return the ArrayList of integer values
 */
private ArrayList<Integer> convert(String str)
{
    ArrayList<Integer> converted = new ArrayList<Integer>();

    ArrayList<Integer> num = new ArrayList<Integer>();
    for(int i=0; i<10;i++)
    {
        int k= 1+(int)(Math.random()*(100-1)+1);
        num.add(k);
    }
    for(int i=0; i<str.length(); i+=2)
    {
        char t1, t2 = ' ';
        t1 = str.charAt(i);
        if(i<str.length()-1)
            t2 = str.charAt(i+1);
        int x = (int)t1 + 1000*(int)t2;
        converted.add(x);
    }

    return converted;
}

/**
 * This method takes an ArrayList of integers where each integer 
 * is the sum of consecutive pairs of characters from the original
 * String where the sum is one character's integer number value 
 * plus 1000 times the integer value of the next character.
 * @param converted the ArrayList to convert back into a String
 * @return the 'original' String
 */
private String deconvert(ArrayList<Integer> converted)
{
    String str = new String();
    for(int temp : converted)
    {
        char t1, t2;
        t1 = (char)(temp%1000);
        t2 = (char)(temp/1000);
        str = str + t1 + t2;
    }

    return str;
}


/**
 * Converts the String str into an ArrayList of integers
 * @param str a message to be encrypted
 * @return the converted ArrayList<Integer>
 */
public ArrayList<Integer> encrypt(String str)
{
    ArrayList<Integer> converted = convert(str);
    for(int i=0; i<converted.size(); i++)
    {
        int temp = converted.get(i)*EncryptAlpha(key);
        converted.set(i,temp);
    }
    return converted;
}

/**
 * Converts the ArrayList of integers converted back into
 * the original message from which it was created.
 * @param converted the ArrayList to be decrypted
 * @return the original message
 */
public String decrypt(ArrayList<Integer> converted)
{
    String str = new String();
    for(int i=0; i<converted.size(); i++)
    {
        for(int n=0; n<num.size();n++)
        {
            key=num.get(n);
        }
        int temp = converted.get(i)/key;
        converted.set(i, temp);
    }
    return deconvert(converted);
}


public static void main(String[] args)
{
    // Brownie points for anyone who knows why the name of
    // EncryptAlpha object is enigma.
    EncryptAlpha enigma = new EncryptAlpha();
    String message = "I really like robots.";

    // Test the private methods
    ArrayList<Integer> converted = enigma.convert(message);
    System.out.println(converted);
    String original = enigma.deconvert(converted);
    System.out.println(original);
    System.out.println();

    // Test the public methods
    ArrayList<Integer> encrypted = enigma.encrypt(message);
    System.out.println(encrypted);
    original = enigma.decrypt(encrypted);
    System.out.println(original);
}

Проблема в том, что я использую массив для хранения значений сдвигов букв, но по какой-то причине для шифрования и дешифрования используются два разных массива. Как я могу это исправить?

1 ответ

Если я хорошо понял вашу "проблему", у вас неправильное представление о полевой / локальной переменной, вот прокомментированная версия вашего кода:

public class EncryptAlpha 
{
    private static int key;

    // let's call this one "num1"
    public static ArrayList<Integer> num = new ArrayList<Integer>(); 

    // ...

    public static int EncryptAlpha(int k)
    {
        ArrayList<Integer> num = new ArrayList<Integer>(); // this is *not* num1

Это называется изменением теней, см. Этот вопрос, например. Вы, вероятно, хотите удалить объявления локальной переменной (т.е. ArrayList<Integer> num = new ArrayList<Integer>();)

Некоторое чтение:

Другие вопросы по тегам