Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自制的加密机/解密机未按预期工作,密钥超过3个字符_Java_Encryption - Fatal编程技术网

Java 自制的加密机/解密机未按预期工作,密钥超过3个字符

Java 自制的加密机/解密机未按预期工作,密钥超过3个字符,java,encryption,Java,Encryption,单击加密机上的convert(转换)按钮时触发此事件。它切换并显示结果 private void jButton21ActionPerformed(java.awt.event.ActionEvent evt) { text = jTextField8.getText(); key = jTextField7.getText(); result = ""; //loop for a

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

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 jButton21ActionPerformed(java.awt.event.ActionEvent evt){
text=jTextField8.getText();
key=jTextField7.getText();
结果=”;
//文本中所有项目的循环

对于(int i=0;i,这是因为您正在转换为32以下的ASCII值,而这不是您想要的。GUI前端将它们呈现为空格,这反过来会导致解密的错误输出

将加密检查器设置为

while (c > 126) {
    c -= 93; // was -125
}
和你的解密到

while (c < 1) {
    c += 93;
}
while(c<1){
c+=93;
}

遇到此类问题时,您应该:

  • 提取与您的问题相关的代码并删除不必要的内容
  • 以编程方式测试输入/输出
请参见下面的内容。一旦完成此操作,您将意识到您的代码按预期工作,但第二个加密字符串包含一个行返回,您可能无法轻松复制粘贴。您应该将范围限制为可打印字符(32-126)

程序的输出为:

ok:aaa(key=aa)=>)+-=>aaa
确定:aaa(密钥=aaa)=> =>aaa

您可以看到第二次运行中有一个换行符


publicstaticvoidmain(字符串[]args){
测试(“aaa”、“aa”);
测试(“aaa”、“aaa”);
}
私有静态无效测试(字符串输入,字符串键){
字符串加密=加密(输入,密钥);
字符串解密=解密(加密,密钥);
if(解密的.equals(输入)){
系统输出打印(“确定:”;
}否则{
系统输出打印(“错误:”);
}
System.out.println(输入+“(key=“+key+”)=>“+加密+”=>“+解密);
}
公共静态字符串加密(字符串输入、字符串密钥){
字符串结果=”;
对于(int i=0;i126){
c-=125;
}
}
//将ascii转换回字符并添加到结果
结果+=(字符)c;
}
返回结果;
}
公共静态字符串解密(字符串输入,字符串密钥){
字符串结果=”;
对于(int i=0;i
嗯,显示非ascii字符高度依赖于输出系统。您的第二次加密测试不会在三个空格中结束,而是在相应代码13(CR或'\r')、14和15的三个不可打印字符中结束

您的输出系统(GUI)不知道如何显示它们,也不输出任何内容,您错误地将其视为3个空格


结论:您的加密系统不能保证输出可打印的字符串,并且不能直接使用。您至少应该在base64中对输出值进行编码,以确保其可打印。

您应该将加密/解密内容提取到单独的类中-这将使您能够单独测试算法,而无需同时处理GUI位…屏幕截图与此问题无关,因为它与GUI无关,请删除图像,只添加相关文本(输入、输出、预期输出)
while (c < 1) {
    c += 93;
}
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;
}