3

我写了一个休息服务来加密和解密 URL。

加密代码:

@GET
@Produces("application/json")
@Path("/encrypt/")
public Response encryptWithQuery(@QueryParam("plainString") String plainString)
        throws JSONException {
    Response response = new Response();
    AesUtil util = new AesUtil(KEY_SIZE, ITERATION_COUNT);
    response = util.encrypt(SALT, IV, PASSPHRASE, plainString);
    return response;
}

解密代码:

@GET
@Produces("application/json")
@Path("/decryptWP/")
public Response decryptWithQuery(@QueryParam("encryptString") String encryptString)
        throws JSONException {
    Response response = new Response();
    AesUtil util = new AesUtil(KEY_SIZE, ITERATION_COUNT);
    response = util.decrypt(SALT, IV, PASSPHRASE, encryptString);
    return response;
}

当我调用我的加密休息服务时,我得到了加密的字符串

用于加密的 url

http://localhost:9080/kttafm/keybank/encrypt?plainString=http://localhost:9080/kttafm/master.jsp?abc=zyx

但是当我调用解密休息服务时,我得到以下异常

javax.crypto.BadPaddingException: Given final block not properly padded

但是如果我从@Queryparam tp @path 参数移动,解密工作正常,

可以正常工作并解密加密字符串的解密方法是

 @GET
@Produces("application/json")
@Path("/decrypt/{encryptString}")
public Response decrypt(@PathParam("encryptString") String encryptString)
        throws JSONException {
    Response response = new Response();
    AesUtil util = new AesUtil(KEY_SIZE, ITERATION_COUNT);
    response = util.decrypt(SALT, IV, PASSPHRASE, encryptString);
    return response;
} 

我错过了什么?

4

2 回答 2

0

请确保您始终在客户端对参数进行编码,例如使用URLEncoder。

例如,您的加密 URL 必须是

http://localhost:9080/kttafm/keybank/encrypt?plainString=http%3A%2F%2Flocalhost%3A9080%2Fkttafm%2Fmaster.jsp%3Fabc%3Dzyx
于 2015-10-15T12:07:19.700 回答
0

给定加密字符串示例:“fbSjGsyDYfmJM4rAURhgdpX+XKQr8WTfiZC7PaBqK7KzfUEYau1cpXnhECqRT47n”,我可以看到有一个“+”字符是 URL 解码的候选字符。您可以使用此 URL 解码网站http://meyerweb.com/eric/tools/dencoder/来查看当您解码字符串时 + 符号已转换。

这会导致解密错误,因为您的算法不会完全符合预期。

您可以通过在您的解密方法中添加一些调试消息来确保这一点,如下例所示:

@GET
@Produces("application/json")
@Path("/decrypt/{encryptString}")
public Response decrypt(@PathParam("encryptString") String encryptString)
        throws JSONException {
    System.out.println(encryptString);
    Response response = new Response();
    ...
} 

一种解决方案是在调用服务之前在客户端执行 URL 编码。在这种情况下,您的示例将如下所示:“fbSjGsyDYfmJM4rAURhgdpX%2BXKQr8WTfiZC7PaBqK7KzfUEYau1cpXnhECqRT47n”

注意 + 号的转换。

于 2015-10-16T09:52:22.807 回答