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。
    不知道这是不是你知道的,说出来,希望对你有所帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • yayg2008 2009-12-01 20:12
    关注

    我运行了,加密后能显示啊

    评论
  • yayg2008 2009-12-01 21:00
    关注

    加密后好像没丢失么,只是有了一个空格,解密我解出来是乱码,我再看看

    评论
  • wocsok 2009-12-01 23:45
    关注

    大体看了一下 个人感觉你的解密逻辑好像有点问题 加密的过程是 先每个字符加密 然后再把顺序反过来 解密过程应该是把目标字符串顺序先反过来 再给每个字符解密啊 而你写的解密过程仿佛是先按顺序解下密 然后才反过来的。

    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 win11安卓子系统打开谷歌登录不了切使用浏览器显示处于离线状态
  • ¥15 三维直角坐标系下,给定一个平面内四个点坐标,如何将四个点逆时针排序
  • ¥15 UnityWebRequest访问内网地址502
  • ¥20 Python语言来实现牛顿法(Newton's Method)解决非线性(系统)方程的问题。
  • ¥15 matlab控制工业相机采集图像
  • ¥25 R里做折线图和柱状图
  • ¥20 使用kokkos移植项目,遇到问题
  • ¥15 求该问题的Matlab代码
  • ¥15 python下使用pdpbox为何提示has no attribute 'pdp_isolate'?
  • ¥15 求java web病房管理系统项目,用netbeans做的