自制的加密器/解密器不能按预期工作,密钥超过3个字符

时间:2016-01-26 10:33:25

标签: java encryption

单击加密器上的转换按钮时会触发此事件。它会切换并显示结果。

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);
}

然而,当我使用更长的密钥时,解密器不再有效。

加密1

  • 输入:aaa
  • key:aa
  • 输出:) + -

解密1

  • 输入:) + -
  • key:aa
  • 输出:aaa

按计划和预期工作

加密2

  • 输入:aaa
  • key:aaa
  • 输出:&#34; &#34;(3个空格)

加密只返回3个空格。当我添加&#39; i&#39;时,这不应该首先发生。使他们与众不同。它应该有3个不同的字母/符号。

解密2

  • 输入:&#34; &#34;(3个空格
  • key:aaa
  • 输出:TQN

使用aaa作为键的3个空格的解密返回了不同的东西。 我已多次检查代码,但找不到有什么问题。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

这是因为您要转换为32以下的ASCII值,这不是您想要的。 GUI前端将它们呈现为空格,这反过来会给出解密的错误输出。

ASCII table

将加密检查程序设置为

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中对输出值进行编码,以确保它是可打印的。