Я пишу программу для шифрования и расшифровки текста с помощью RSA. Значения P, Q и E предоставляются пользователем и проверяются, являются ли они первичными. Программа находит N и D. Сбой в работе шифрования и дешифрования. Я рассмотрел несколько вопросов здесь, и большинство из них используют библиотеки, которые для этого задания я не собираюсь использовать. Фрагмент кода шифрования:Расшифровка RSA в Java, библиотеки RSA не используются
JMenuItem mntmEncrypt = new JMenuItem("Encrypt");
mntmEncrypt.addActionListener(new ActionListener() {
@SuppressWarnings("null")
public void actionPerformed(ActionEvent ev) {
textArea_1.setText("");
String blah = textArea.getText();
int something;
for(int i=0; i<blah.length();i++){
something =(int)(blah.charAt(i));
enc = BigInteger.valueOf((long) (Math.pow(something, e)%n));
textArea_1.append(blah.valueOf(enc) + " ");
}
И неисправно дешифрования:
JMenuItem mntmDecrypt = new JMenuItem("Decrypt");
mntmDecrypt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent em) {
textArea_1.setText("");
String blah2 = textArea.getText();
String[] somethingElse = blah2.split(" ");
char character;
for(int i=0;i<somethingElse.length;i++){
int cipher = Integer.parseInt(somethingElse[i]);
dec = BigInteger.valueOf((long)Math.pow(cipher, d)%n);
System.out.println("Cipher: "+cipher); //print check
System.out.println("d: "+d); //print check
System.out.println("n: "+n); //print check
System.out.println("dec: "+dec); //print check
BigInteger x = BigInteger.valueOf(dec);
int x2 = x.intValue();
char c = (char) x2;
System.out.println(cipher + " " + dec);
String textBack = new String(dec.toByteArray());
textArea_1.append(String.valueOf(dec));
}
}
});
Я проверил значение дес с помощью this calculator и это совершенно неправильно, но я не могу понять, почему. Любая помощь будет оценена по достоинству. Я НЕ МОГУ сделать ничего BigInteger, кроме enc и dec.
Ладно, но переключение на BigInteger.modPow() требует, чтобы его аргументы все BigIntegers для начала, не так ли? Не имея возможности бросить = они должны быть BigIntegers для начала. Это вызывает проблемы с большим количеством вещей, включая n = (p-1) (q-1). Вычитание одного из BigIntegers - это боль. Как мне это сделать? Я бы предпочел использовать расширение криптографии, но для этого нужно решить его вручную. – Goblinette
Вы получили это, вы должны все с BigInteger - каждый расчет, если ваш номер не вписывается в 'long'. Вы можете легко вычесть: 'value = value.subtract (BigInteger.ONE)' – Robert
Я пытаюсь заставить его работать, но поскольку я использую для циклов, чтобы проверить, являются ли номера у меня главными или нет, есть еще больше проблем для Решите сейчас = (BigInteger имеет метод probablePrime, но не метод CheckIfPrime. – Goblinette