Java中的加密和解密

Java中的加密和解密,java,encryption,Java,Encryption,我的表单中有3个文本框 1.输入文本-输入的文本 2.显示加密文本-加密文本 3.显示解密文本-解密的_txt 当我按下encrypt_btn(按钮)时,从输入的_txt中获取文本并对其进行加密,然后在encrypt_txt中显示结果 当我按下decrypt_btn(按钮)时,从加密的_txt中获取文本并解密,然后在解密的_txt中显示结果 此功能工作正常,但当我使用清除按钮并再次尝试使用表单时,会显示一个异常 代码如下所示 变量声明-- 加密按钮 private void encrypt_bt

我的表单中有3个文本框

1.输入文本-输入的文本

2.显示加密文本-加密文本

3.显示解密文本-解密的_txt

当我按下encrypt_btn(按钮)时,从输入的_txt中获取文本并对其进行加密,然后在encrypt_txt中显示结果

当我按下decrypt_btn(按钮)时,从加密的_txt中获取文本并解密,然后在解密的_txt中显示结果

此功能工作正常,但当我使用清除按钮并再次尝试使用表单时,会显示一个异常

代码如下所示

变量声明--

加密按钮

private void encrypt_btnActionPerformed(java.awt.event.ActionEvent evt) {                                            
  try{
      Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
      input = entered_txt.getText().getBytes();
      SecretKeySpec key = new SecretKeySpec(keyBytes, "DES");
      IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
      cipher = Cipher.getInstance("DES/CTR/NoPadding","BC");

      cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
      cipherText = new byte[cipher.getOutputSize(input.length)];

      ctLength+=cipher.update(input, 0, input.length, cipherText, 0);

      ctLength+= cipher.doFinal(cipherText, ctLength);
      encrypted_txt.setText(new  String(cipherText));

  }catch(NoSuchAlgorithmException | NoSuchProviderException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | ShortBufferException | IllegalBlockSizeException | BadPaddingException e){
      JOptionPane.showMessageDialog(null, e);
      e.printStackTrace();
  }
}
解密按钮

private void decrypt_btnActionPerformed(java.awt.event.ActionEvent evt) {                                            
   try{
       cipher.init(cipher.DECRYPT_MODE, key, ivSpec);

       byte[] plainText = new byte[cipher.getOutputSize(ctLength)];

       int ptLength =cipher.update(cipherText,0,ctLength,plainText);
       ptLength+=cipher.doFinal(plainText, ptLength);

       decypted_txt.setText(new String(plainText));

   }catch(InvalidKeyException | InvalidAlgorithmParameterException | ShortBufferException | IllegalBlockSizeException | BadPaddingException e){

       e.printStackTrace();
   }
清除按钮

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    entered_txt.setText(null);
    encrypted_txt.setText(null);
    decypted_txt.setText(null);
}  
例外情况

javax.crypto.ShortBufferException: output buffer too short for doFinal()
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(Cipher.java:2068)
at com.bit.project.NewJFrame.enActionPerformed(NewJFrame.java:140)
at com.bit.project.NewJFrame.access$100(NewJFrame.java:23)
at com.bit.project.NewJFrame$2.actionPerformed(NewJFrame.java:68)
第140行是
ctLength+=cipher.doFinal(密文,ctLength)


如何使用清除按钮多次更正此代码以使用表单?

是否可以尝试清除而不是设置为null?可能是您的加密方法再次执行,导致清除时出现问题

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    entered_txt.setText("");
    encrypted_txt.setText("");
    decypted_txt.setText("");
}

我假设您正在为三个按钮使用不同的ActionListener?您是否也可以为重写的ActionPerformed方法添加代码?我正在使用3个按钮和3个ActionPerformed方法。以上几乎是我所有的代码,我没有任何单独包含的动作监听器,。。只有以上3种方法。@garry在调用
cipher.doFinal(cipherText,ctLength)
时,看起来
ctLength
应该是
cipherText
的长度。如果是这样,它们就不匹配了。而且
ctLength
不会再次初始化。知道如何修复它吗?这将是一个很大的帮助:)@KDMNo我试过这个,这个也不起作用:(@Garry@hinata…我想看看执行加密操作的代码called@hinata…很抱歉,我应该要求为您添加ActionListener的所有三个按钮提供代码
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    entered_txt.setText("");
    encrypted_txt.setText("");
    decypted_txt.setText("");
}