有关Java编程语言中的AES / CBC / PKCS5Padding解密的问题

问题描述

我正在用Java开发一个代码,其中当用户输入密钥,初始化矢量和密文时,程序将根据AES / CBC / PKCS5Padding Mode返回解密后的文本。 该代码无效,我希望有人可以帮助我更正它,或者提出一个更好的代码。 此密钥,此初始化向量和此密文可从以下网站获得: https://www.di-mgt.com.au/properpassword.html 即,纯文本必须返回简单的“ Hello World”消息。 如果您知道执行此操作的任何Java代码,可以发表吗?

我的代码遇到NullPointerException错误

package encryptdecryptvideo;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.ShortBufferException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
//import javax.crypto.*;

public class EncryptDecryptVideo {

    byte[] input;
    String inputString;
    byte[] keyBytes = "9008873522F55634679EF64CC25E73354".getBytes();
    byte[] ivBytes = "B8A112A270D9634EFF3818F6CCBDF5EC".getBytes();
    
    SecretKeySpec key = new SecretKeySpec(keyBytes,"DES");
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
    Cipher cipher;
    byte[] cipherText = "625F094A1FB1677521B6014321A807EC".getBytes();
    int ctLength;
   
    public static void main(String args[]) throws InvalidKeyException,InvalidAlgorithmParameterException,ShortBufferException,IllegalBlockSizeException,BadPaddingException {
    EncryptDecryptVideo decryptionobject = new EncryptDecryptVideo();
    decryptionobject.decrypt();
    }
    public void decrypt() throws InvalidKeyException,BadPaddingException {
       
            cipher.init(Cipher.DECRYPT_MODE,key,ivSpec);
            
            byte[] plainText = new byte[cipher.getoutputSize(ctLength)];
      
            int ptLength = cipher.update(cipherText,ctLength,plainText);
            
            ptLength+= cipher.doFinal(plainText,ptLength);
            
            System.out.println("Plain: "+new String(plainText));
    }
}```

解决方法

一些显而易见的要点:

首先:没有像(“ AES / CBC / PKCS5Padding”)这样的密码实例。

第二:您的“ SecretKeySpec”会将输入转换为DES键(而不是标题中要求的“ AES”)。

第三:“ cipher.doFinal”调用通常返回字节数组,而不返回任何整数值。

第四:您的所有输入数据似乎都是一个十六进制字符串,应该通过“ hexStringToByteArray”之类的东西而不是直接通过“ .getBytes”将其转换为字节数组。

第五:您链接到的网页没有使用“密码”作为密码的直接输入,而是执行了密码派生(例如PBKDF2),也需要将其复制为Java代码。

第六:请不要再使用已损坏和不安全的“ DES”。

我的建议是使用除https://www.di-mgt.com.au/properpassword.html以外的其他来源进行加密/解密。