私は、RSA アルゴリズムの実装を使用した公開鍵暗号化の概念を一部の学生に示すために、小さな Java アプリに取り組んでいます。私は 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);
}