当前位置: 首页 > 知识库问答 >
问题:

抛出BadpaddingException但在.NET中工作的Java解码逻辑

艾浩广
2023-03-14
         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);

    }
    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:at dofinal(),请纠正我做错的地方。

共有1个答案

吕鸿文
2023-03-14

好的,所以问题是您正在将加密的字节转换为十六进制字符串(使用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));
 类似资料:
  • 我正在使用以下命名查询: 该查询在mysql中运行良好: 但当我试图运行我的代码时,我得到了QuerySyntaxException:

  • 我有一个简单的RestController应用程序- 它在SpringBoot(http://localhost:8080/greeting)上工作得很好,但是当我创建一个WAR并将其部署到Tomcat(9.0.2)上时,它会抛出一个404。

  • 我们正试图在MVC4控制器中的一种操作方法中防止跨站点请求伪造攻击。下面是我们所做的代码更改,它在VS 2013中运行良好,但在VS 2012中抛出错误,与我们在Windows Server 2012-IIS 8中部署时遇到的错误相同。 View.cshtml Controller.cs VS2013-以上代码运行良好 VS2012-引发以下错误 http://schemas.xmlsoap.or

  • 我正在使用gephi-toolkit(0.9.1)生成图,编写一个javaSE应用程序,并对其进行测试,等等。 当将此代码复制粘贴到我的EJB(尝试了所有三种类型)时,代码开始生成: runtimeException:java.lang.NullPointerException 将图形导出到SVG(也可以导出PNG)。 我显式检查我的对象-它们不是空的。因此,gephi-toolkit的一些深层内

  • 这是我在注册服务人员后每次刷新时遇到的错误。我已经确定了服务人员。js文件存在于根目录中。此外,该服务人员已注册,工作正常。但我还是不断地犯这个错误。我还在本地主机上工作。 这是我的service-worker.js文件: 剧本js文件:

  • 我正在尝试创建AES加密/解密方法,但是如果不使用AES / ECB / NoPadding,我似乎无法获得原始输入。现在我正在尝试使用AES / CBC / PKCS7Padding。我已经确认在文件中读取和写入字节工作正常。使用PKCS7填充,我从中得到一个糟糕的填充异常 在解密方法中。没有填充,没有例外 - 但是输出是混乱的。我花了很多时间浏览有关此完全相同问题的其他帖子,但我似乎找不到适合