我正在开发一个小型Java应用程序,向一些学生展示使用RSA算法实现的公钥加密的概念。值得一提的是,我没有使用Java的库,因为这会抽象出大多数关键概念。
我用于加密的算法只是将字符串分解为一个字符数组,加密每个字符,然后在其自己的行上显示每个加密字符(为了便于阅读)。我知道这对于实际目的来说并不安全;填充算法是后续课程的主题。
我遇到的问题是,当加密输出不是从GUI中的输入框中获取时,加密/解密工作正常。例如,此代码可以工作:
String sample = “Hello World”;
BigInteger[] encrypted = RsaExample.encrypt(sample);
For (BigInteger b : encrypted) {
System.out.print(b.toString() + “\n”);
String decrypted = RsaExample.decrypt(encrypted); //Returns “Hello World”
但是,当我使用GUI完成相同的任务时,结果会被破坏:
//When “Encrypt” button is pressed
String sample = InputBox.getText();
BigInteger[] encrypted = RsaExample.encrypt(sample);
String output;
For (BigInteger b : encrypted) {
output += (b.toString() + “\n”);
OutputBox.setText(output);
//When “Decrypt” button is pressed
String encrypted = OutputBox.getText();
BigInteger[] encrypted_arr = encrypted.split(“\n”);
String decrypted = RsaExample.decrypt(encrypted_arr);
OutputBox.setText(decrypted);
我已经确认(通过将输出复制/粘贴到文档中)输出正在使用换行符进行格式化。我怀疑问题是来自GUI添加某种间距或以某种方式破坏确切的输出。
编辑:以下是每个ActionPerformed方法的确切代码:
private void buttonEncryptActionPerformed(java.awt.event.ActionEvent evt) {
String input = fieldInput.getText();
BigInteger[] encrypted = encrypt.encrypt(input);
String output = "";
for (int i = 0; i < encrypted.length; i++) {
//String concatenation seems to fail here
output += encrypted[i].toString() + "\n";
}
System.out.println(output);
fieldOutput.setText(output);
}
private void buttonDecryptActionPerformed(java.awt.event.ActionEvent evt) {
String input = fieldOutput.getText();
input = input.trim();
fieldInput.setText(input);
fieldOutput.setText(""); //Clear the output
String[] chars = input.split("\n");
System.out.print(chars.length);
BigInteger[] encrypted = new BigInteger[chars.length];
for (int i = 0; i < chars.length; i++) {
//Remove Whitespace that caused NumberFormatException
String trimmed = chars[i].replaceAll("\\s","");
encrypted[i] = new BigInteger(trimmed);
}
String decrypted = encrypt.decrypt(encrypted);
fieldOutput.setText(decrypted);
}