单击加密器上的转换按钮时会触发此事件。它会切换并显示结果。
private void jButton21ActionPerformed(java.awt.event.ActionEvent evt) {
text = jTextField8.getText();
key = jTextField7.getText();
result = "";
//loop for all items in text
for (int i=0; i<text.length(); i++) {
c = (int) text.charAt(i);
//loop for all items in key
for (int a=0; a<key.length(); a++) {
//adding ascii of each key value to ascii of text character
c += (int) key.charAt(a);
//adding I to make sure all letters dont appear the same
c += i;
//make sure ascii's stay between target values (excluding null)
while (c > 126) {
c -= 125;
}
}
//converting ascii back to char and adding to result
result += (char) c;
}
//displaying result in text box below
jTextField6.setText(result);
}
这是按下转换时在解密器中触发的内容。它执行加密器向后做的事情(至少我认为......)
private void jButton22ActionPerformed(java.awt.event.ActionEvent evt) {
text = jTextField11.getText();
key = jTextField10.getText();
result = "";
for (int i=0; i<text.length(); i++) {
c = (int) text.charAt(i);
for (int a=0; a<key.length(); a++) {
c -= (int) key.charAt(a);
c -= i;
while (c < 1) {
c += 125;
}
}
result += (char) c;
}
jTextField9.setText(result);
}
然而,当我使用更长的密钥时,解密器不再有效。
按计划和预期工作
加密只返回3个空格。当我添加&#39; i&#39;时,这不应该首先发生。使他们与众不同。它应该有3个不同的字母/符号。
使用aaa作为键的3个空格的解密返回了不同的东西。 我已多次检查代码,但找不到有什么问题。有什么想法吗?
答案 0 :(得分:0)
这是因为您要转换为32以下的ASCII值,这不是您想要的。 GUI前端将它们呈现为空格,这反过来会给出解密的错误输出。
将加密检查程序设置为
while (c > 126) {
c -= 93; // was -125
}
你的解密
while (c < 1) {
c += 93;
}
答案 1 :(得分:0)
当你遇到这样的问题时,你应该:
见下文它的样子。完成后,您将意识到您的代码按预期工作,但第二个加密字符串包含一行返回,您可能无法轻松复制粘贴。您应该将范围限制为可打印字符(32 - 126)。
该计划的输出是:
ok:aaa(key = aa)=&gt; )+ - =&gt; AAA
好的:aaa(key = aaa)=&gt; =&GT; AAA
您可以看到第二次运行中有一个换行符。
public static void main(String[] args) {
test("aaa", "aa");
test("aaa", "aaa");
}
private static void test(String input, String key) {
String encrypted = encrypt(input, key);
String decrypted = decrypt(encrypted, key);
if (decrypted.equals(input)) {
System.out.print("ok: ");
} else {
System.out.print("error: ");
}
System.out.println(input + " (key=" + key + ") => " + encrypted + " => " + decrypted);
}
public static String encrypt(String input, String key) {
String result = "";
for (int i = 0; i < input.length(); i++) {
int c = (int) input.charAt(i);
//loop for all items in key
for (int a = 0; a < key.length(); a++) {
//adding ascii of each key value to ascii of text character
c += (int) key.charAt(a);
//adding I to make sure all letters dont appear the same
c += i;
//make sure ascii's stay between target values (excluding null)
while (c > 126) {
c -= 125;
}
}
//converting ascii back to char and adding to result
result += (char) c;
}
return result;
}
public static String decrypt(String input, String key) {
String result = "";
for (int i = 0; i < input.length(); i++) {
int c = (int) input.charAt(i);
for (int a = 0; a < key.length(); a++) {
c -= (int) key.charAt(a);
c -= i;
while (c < 1) {
c += 125;
}
}
result += (char) c;
}
return result;
}
答案 2 :(得分:0)
好吧,显示非ascii字符是高度依赖输出系统的。您的第二次加密测试不以三个空格结束,但是在相应代码13(CR或'\ r'),14和15的3个不可打印字符中结束。
您的输出系统 - GUI - 不知道如何显示它们并且不输出任何内容,您错误地看作3个空白区域。
结论:您无法保证加密系统输出可打印的字符串,因此无法直接使用。您至少应该在base64中对输出值进行编码,以确保它是可打印的。