【问题标题】:Java Decyption logic throwing BadpaddingException But its working in .NETJava解密逻辑抛出BadpaddingException但它在.NET中工作
【发布时间】:2025-11-24 18:50:01
【问题描述】:

.NET 代码 公共字符串解密(字符串加密字符串) {

         byte[]   toEncryptArray = Convert.FromBase64String(encryptedString)
         MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
         byte[]  keyArray = hashmd5.ComputeHash(System.Text.Encoding.Unicode.GetBytes(key));              
            hashmd5.Clear(); 
        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7; 
        ICryptoTransform cTransform = tdes.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(
                             toEncryptArray, 0, toEncryptArray.Length);

    }

Java 代码

public void decryptin(String encryptedText) 抛出异常{

    byte[] message = Base64.decodeBase64(encryptedText.getBytes("UTF-8"));
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] digestOfUsername = md.digest(key.getBytes("UTF-8"));
        byte[] keyBytes = Arrays.copyOf(digestOfUsername, 24);
        SecretKey key = new SecretKeySpec(keyBytes, "DESede");
Cipher decipher = Cipher.getInstance("DESede/ECB/PKCS5Padding",new SunJCE());
        decipher.init(Cipher.DECRYPT_MODE, key);
        byte[] plainText = decipher.doFinal(message);// BadpaddingException 
        String decryptedString = new String(plainText);

}

.NET 代码工作正常,但 java 代码没有给出正确的输出 它给出了 BadpaddingException :在 dofinal() 请纠正我做错的地方。

【问题讨论】:

    标签: java .net


    【解决方案1】:

    好的,所以问题是您正在将加密字节转换为十六进制字符串(使用 asHex 方法),但没有将十六进制字符串正确转换回字节数组以进行解密。你不能使用 getBytes。

    您可以使用以下方法将十六进制字符串转换为字节数组:

    public static byte[] fromHexString(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                                 + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }
    

    然后更改要使用的解密方法:

    original = decipher.doFinal(fromHexString(message));
    

    【讨论】:

    • 谢谢朋友。我改变了你所说的加密字符串的代码,它给出了这个异常:javax.crypto.IllegalBlockSizeException:使用填充密码解密时输入长度必须是 8 的倍数
    【解决方案2】:

    终于知道答案了:

    public void decrypt(String encryptedText) throws Exception {

        byte[] message = new BASE64Decoder().decodeBuffer(encryptedText);
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] digestOfPassword = md.digest(kEY.getBytes("UTF-16LE"));
        byte[] keyBytes = new byte[24];
        System.arraycopy(digestOfPassword, 0, keyBytes, 0, 16);
        System.arraycopy(digestOfPassword, 0, keyBytes, 16, 8);
        SecretKey key = new SecretKeySpec(keyBytes, "DESede");
        Cipher decipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        decipher.init(Cipher.DECRYPT_MODE, key);
        byte[] plainText = decipher.doFinal(message);
        String decryptedString = new String(plainText, UTF);
    
    }
    

    【讨论】: