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