【问题标题】:how to decrypt in java (snippet of my code included)如何在java中解密(包括我的代码片段)
【发布时间】:2015-08-10 07:32:58
【问题描述】:

我想创建一个功能性的 Java 聊天应用程序。 所以我有一个小应用程序,它允许用户通过服务器类连接并通过客户端类相互交谈,我已经开始添加加密。我在我的 Java 聊天应用程序中解密来自其他客户端的输出时遇到问题。

有人可以帮帮我吗?

我的代码的sn-p包含在下面:

CLIENTGUI.JAVA 类(加密是一个被点击的按钮)

if(o == encrypt) {

        String change = null;
        try{
            change = tf.getText();
            change = FileEncryption.encryptString(change);
            tf.setText("" + change);

            return;
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        finally{
        }

文件加密.JAVA

public class FileEncryption {

    //Initial Vector
    public static final byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };      

    //EncryptAndDecrypt String -> Input : PlainText + Return : CipherText+DecipherText
    public static String encryptString(String src) throws Exception
    {
        String dst="";
        //Not Input!
        if(src == null || src.length()==0)
            return "";

        //Encryption Setting
        byte[] k="Multimediaproces".getBytes();
        SecretKeySpec Key = new SecretKeySpec(k,"AES");
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        encryptCipher.init(Cipher.ENCRYPT_MODE,Key,ivspec);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        CipherOutputStream cout = new CipherOutputStream(baos,encryptCipher);
        cout.write(src.getBytes());
        cout.flush();               //ByteOutputStream -> Write Encryption Text
        cout.close();           
     // in encrypt method
        dst = DatatypeConverter.printHexBinary(baos.toByteArray());
        return dst;
    }   

    //String src -> EncryptedData
    public static String decryptString(String src) throws Exception 
    {
        //src value is Encrypted Value!
        //So, src value -> Not Byte!
        String dst="";
        byte[] encryptedBytes = DatatypeConverter.parseHexBinary(src);;         
        //Not Input!
        if(src == null || src.length()==0)
            return "";          
        //Decryption Setting
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        byte[] k="Multimediaproces".getBytes();
        SecretKeySpec Key = new SecretKeySpec(k,"AES");
        Cipher decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        decryptCipher.init(Cipher.DECRYPT_MODE,Key,ivspec); 

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ByteArrayInputStream bais = new ByteArrayInputStream(encryptedBytes);
        CipherInputStream cin = new CipherInputStream(bais,decryptCipher);
        byte[] buf = new byte[1024];
        int read;
        while((read=cin.read(buf))>=0)  //reading encrypted data!
        {
            baos.write(buf,0,read);     //writing decrypted data!
        }

        // closing streams
        cin.close();
        dst = new String(baos.toByteArray());
        return dst;
    }
}

问题是当我尝试解密输入以下代码的代码时: if(o == 解密) {

            try{
                msg = tf.getText();
                msg = FileEncryption.decryptString(msg);
                fop.
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }finally{

            }

目前,它允许我加密我在文本字段中输入的内容。

它不允许我解密用户在聊天中所说的输出。我为解密包含的当前代码不起作用。

谁能帮帮我?或者对我的程序有什么建议可以帮助它解密?

谢谢

编辑:

【问题讨论】:

  • fop. 不是有效的 Java 语句。你的实际代码是什么?
  • 测试你的加密和解密方法对我来说似乎工作得很好......我想知道是否对当前机器有某种依赖?
  • 啊抱歉,fop。不是其中的一部分。解密位是我写的,似乎对我不起作用。
  • @MadProgrammer 对你有用吗?它似乎对我不起作用......你设法解密了吗?
  • 我将String 传递给了 encrypt 方法,然后将结果传递给了 decrypt 方法并得到了正确的结果。我将“加密”值转储到标准输出,可以看到它确实被加密了

标签: java encryption aes


【解决方案1】:

我怀疑问题出在两个客户端之间没有传递加密状态。

如果“加密”对象是一个按钮,那么它只是客户端-客户端连接一侧的一个按钮。您需要将加密状态传递给其他客户端,以便它知道解密消息。

确认这一点的捷径是在接收端自动显示明文和解密消息。其中一个总是乱码,但它应该根据加密按钮的使用而改变。

祝你好运:)

【讨论】:

  • 嗨 gregory,因为我是一个编程爱好者,我不太明白你的意思。根据我目前的理解,您说过我需要从一侧发送加密消息并在接收端接收加密消息。问题是,在接收端,解密仍然不起作用。按钮只是不起作用。我已经确保它可以通过使其在代码之上更真实来使用......基本上,如果可能的话,我想在文本字段中解密它,或者以任何方式......
  • 鉴于其他人似乎已经确认您的加密/解密方法有效,我的建议是“o==decrypt”是问题所在。我建议删除测试并输出所有消息的纯文本和解密消息,以确保方法被调用和工作。
【解决方案2】:

您最好的选择可能是简单地使用 SSL 套接字进行网络通信,而不是自己编写加密代码。虽然您的问题与此问题不完全相同,但您可能会从这里的答案中受益:

Secret Key SSL Socket connections in Java

【讨论】:

  • 假设 OP 的目的是制造一些东西以供使用,而不是学习一些基本的密码学。
  • TLS/SSL 也有一些要求(证书...),如果您不了解密码学的工作原理,这些要求将毫无意义。
  • 确实如此。如果他想学习一些密码学知识,学习 TLS/SSL 将是一个很好的起点。
  • 您好,感谢您的回复。但是我认为 SSL 套接字对我来说太领先了一步,因为现在我只想专注于使用 AES 加密......还有其他建议吗?
猜你喜欢
  • 2017-02-22
  • 2017-10-10
  • 2016-02-04
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
相关资源
最近更新 更多