2016-07-21 61 views
0

我能够使用生成的密钥成功地加密消息。现在我正试图通过用户输入密钥(十六进制)和加密消息(十六进制)进行解密。解密加密邮件(十六进制)时遇到问题。我收到多个NullPointerExceptions。你能帮我找出解决这个问题的方法吗?解密AES时出现NullPointer异常

//编辑:例如键(十六进制):CFDD0F5311764F9EA56CF4126E304BC2 |加密的消息:C2A80A2B7A84A5A785E059F19322E5BA

private void executeDecryption() { 
    encryptMessageStr = messageEncryptTA.getText(); 
    algorithmType = decryptAlgorithmTypeCB.getSelectionModel().getSelectedItem(); 
    keyDecrypt = keyTF.getText(); 

    if (!messageEncryptedTA.getText().isEmpty()) { 

     try { 
      //Using decryptText() 
      String textDecipher = decryptText(encryptedMessageStr, keyDecrypt); 
      messageEncryptedTA.setText(textDecipher); 

     } catch (Exception ex) { 
      MessageBox.display("Error!", "Could not decrypt message! Please try again later"); 
      //System.out.println(ex.getMessage()); 
     } 

    } else { 
     MessageBox.display("Warning!", "Please make sure message field is not empty!"); 
    } 
} 

public static String decryptText(String encryptedMessageStr, String secretKey) { 
    try { 
     Key k = new SecretKeySpec(Base64.getDecoder().decode(secretKey), "AES"); 
     Cipher cipherAES = Cipher.getInstance("AES"); 
     cipherAES.init(Cipher.DECRYPT_MODE, k); 

     byte[] decodedValue = Base64.getDecoder().decode(encryptedMessageStr); 
     byte[] cipherTextBytes = cipherAES.doFinal(decodedValue); 
     String decryptedValue = new String(cipherTextBytes); 
     return decryptedValue; 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    return "Error"; 

} 

被修改:

例外: javax.crypto.IllegalBlockSizeException:带衬垫的密

回答

0

解密没有任何上下文或行号时输入长度必须为16的倍数很难找出确切的问题。您应该检查代码中抛出异常的位置以及您尝试访问的变量为空的原因。同时检查this问题,通过Simze

的建议按照 Base64.Decoder documentation

除非另有说明,将null参数传递给这个类的方法将导致抛出NullPointerException。

所以你在某种程度上传递一个空字符串引用的解码方法。

+0

你好,我已经添加了一些编辑到空指针异常。 – Milan

+0

你很可能正确。问题在于,当我接受纯文本时,我正在接受一个十六进制值。关于如何将十六进制转换为字节的任何想法? – Milan

+0

如何将字符串(十六进制)转换为seceret键? – Milan