Код шифрования
Я пытаюсь написать простой кусок кода, чтобы взять документ и зашифровать его, а затем расшифровать. Я получил шифрование для работы, но по какой-то причине он использует другой массив для его расшифровки. Вот мой код
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>();
)
Некоторое чтение: