wgf42422 2009-12-01 19:05
浏览 202
已采纳

字符串加密后显示不出来.麻烦给找找错误.

直接上代码了.
[code="java"]import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Main extends JFrame {
JTextField text1, text2, text3;
JButton btn1, btn2;
String key = "fantistic";

Main() {
    //Initialize
    super("Encrypt");
    this.setSize(450, 490);
    this.setLayout(new GridLayout());

    text1 = new JTextField(16);
    text2 = new JTextField();
    text3 = new JTextField();
    text3.setEditable(false);
    btn1 = new JButton("Encrypt");
    btn2 = new JButton("Decrypt");

    //Layout
    Box baseBox, boxV1, boxV2;
    boxV1 = Box.createVerticalBox();
    boxV1.add(btn1);
    boxV1.add(Box.createVerticalStrut(8));
    boxV1.add(btn2);
    boxV1.add(Box.createVerticalStrut(16));
    boxV2 = Box.createVerticalBox();
    boxV2.add(Box.createVerticalStrut(4));
    boxV2.add(text1);
    boxV2.add(Box.createVerticalStrut(8));
    boxV2.add(text2);
    boxV2.add(Box.createVerticalStrut(8));
    boxV2.add(text3);
    baseBox = Box.createHorizontalBox();
    baseBox.add(boxV1);
    baseBox.add(Box.createHorizontalStrut(10));
    baseBox.add(boxV2);
    setLayout(new FlowLayout());
    add(baseBox);
    validate();
    setBounds(120, 125, 300, 150);
    setVisible(true);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    //Event
    btn1.addActionListener(new encrypt());
    btn2.addActionListener(new decrypt());

}

private class encrypt implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        String str = text1.getText();
        char[] chr = new char[str.length()];
        int len = chr.length;
        StringBuffer bstr = new StringBuffer(str);
        for (int i = 0; i < str.length(); i++) {
            int q = (key.charAt(i % key.length()) >> (i % 32)) | (key.charAt(i % key.length()) << (32 - (i % 32)));
            bstr.setCharAt(i, (char) (str.charAt(i) ^ q));
        }
        for (int i = 0; i < len; i++) {

            chr[i] = bstr.charAt(len - 1 - i);
        }
        text3.setText(String.valueOf(chr));
    }
}

private class decrypt implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        String str = text2.getText();
        char[] chr = new char[str.length()];
        int len = chr.length;
         StringBuffer bstr = new StringBuffer(str);
        for (int i = 0; i < str.length(); i++) {
            //左
            int q = (key.charAt(i % key.length()) << (i % 32)) | (key.charAt(i % key.length()) >> (32 - (i % 32)));
            bstr.setCharAt(i, (char) (str.charAt(i) ^ q));
        }
        for (int i = 0; i < len; i++) {
            chr[i] = bstr.charAt(len - 1 - i);
        }
        text3.setText(String.valueOf(chr));
    }
}

public static void main(String[] args) {
    new Main();
}

}[/code]
[b]问题补充:[/b]
To 1 yayg,
请多输入几个字符.
.解密不回来...而且貌似加密时丢失字符...
[b]问题补充:[/b]
To wocsok,
那个顺序确实是有问题...
还有key.charAt移位也有问题.char 2byte.16位...都改成16还是无法解密..
[b]问题补充:[/b]
已经解决了。。不能用int q
用char就对 了。。

  • 写回答

4条回答 默认 最新

  • yayg2008 2009-12-02 11:46
    关注

    经过调试,发现这样一个问题,
    将要解密的字符串反序后运行解密方法,第一个 数字 可以正常解密。
    解密时的q值分别为102,194,440.但加密时的q好像有点怪:102,-2147483600,-2147483621。
    不知道这是不是你知道的,说出来,希望对你有所帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵