解密后加密的字符串(AES)打印相同的值,但在equals()上为false

时间:2014-02-09 20:58:31

标签: java encryption cryptography aes

我的程序将带有接收到的会话密钥的字符串加密(AES)发送给客户,以证明密钥是正确的。 客户端应对其进行解密,获取字符串并使用原始字符串进行验证。

程序运行正常。它加密和解密字符串。它打印我需要的字符串,但是当我做String.equals(字符串)时给我错误。 我可以弄明白为什么。 我的代码有加密部分:

// ----create a challenge for Client (to check if the session key is correct)--------

public void sessionKeyVer(String challenge, File out) throws Exception{

    aesCipher.init(Cipher.ENCRYPT_MODE, aeskeySpec); // switching mode for encryption

    CipherOutputStream os = new CipherOutputStream(new FileOutputStream(out), aesCipher); //output stream to another file 

    os.write(challenge.getBytes("UTF-8"));// function to copy String to outputstream
    os.close();     //close the stream

}

有解密部分:

public boolean sessionKeyVer(File file) throws Exception{
    aesCipher.init(Cipher.DECRYPT_MODE, aeskeySpec); // switching mode for decryption

    CipherInputStream is = new CipherInputStream(new FileInputStream(file), aesCipher); //output stream to another file 
    ByteArrayOutputStream os = new ByteArrayOutputStream();

    int i;
    byte[] b = new byte[1024];
    while((i=is.read(b))!=-1) {
          os.write(b, 0, i);
      }

    is.close();
    os.close();
    String file_string = new String(b,"UTF-8");
    System.out.print(file_string);
    return file_string.equals(challenge); //return false

}

谢谢。

1 个答案:

答案 0 :(得分:2)

第一部分是加密部分。 second 部分是解密部分。

第二部分是错误的。您正在解密仍然加密的缓冲区的最后一部分,而不是整个解密的ByteArrayOutputStream,,并在此过程中提交大小错误。

String file_string = new String(b,"UTF-8");

应该是

String file_string = new String(os.toByteArray(), "UTF-8");