Java将加密的String返回给客户端

Its*_*has 1 java encryption jsp

javax.crypto.Cipher用来加密我想发送回客户端的字符串:

public byte[] encrypt(String message)
        throws Exception {
    Cipher cipher = Cipher.getInstance(m_ALGORITHM);
    PrivateKey privateKey = m_kp.getPrivate();
    cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    return cipher.doFinal(message.getBytes());
}
Run Code Online (Sandbox Code Playgroud)

我的加密和解密功能在服务器端运行良好,但是当加密的String返回到客户端时:

?zXi?Xq?????.??PiO??dM-?d??a??\`?"????uJ??yu
Run Code Online (Sandbox Code Playgroud)

客户端控制台显示:

Uncaught SyntaxError: Invalid or unexpected token
Run Code Online (Sandbox Code Playgroud)

我试过UTF-8格式的字符串:

String utfEnc = new String(encrypetBytes, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

但它没有用,我没有想法.

加密是我的jsp页面使用的Java函数(在我的jsp中):

Encryptor enc  = new Encryptor(request);
byte[] encData = enc.encrypt(data);
Run Code Online (Sandbox Code Playgroud)

目标是通过http发送此数据:

$.ajax({
  type: "POST",
  url: serverUrl,
  data: <%=encData%>, //Uncaught SyntaxError: Invalid or unexpected token
  success: function(){
     console.log('done');
  }
});
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Jon*_*nne 5

当你调用doFinal时,你给它一个字节数组而不是字符串.输出是一个字节数组,不一定对应于字符串.这就是你看到所有这些问号的原因.由于您希望通过网络将其作为字符串发送,因此常见的解决方案是使用Base64编码或十六进制将字节数组转换为字符串.Java 8包含Base64.Encoder类,其中有您可以使用的encodeToString方法.Base64.Decoder类包含将编码的字符串转换回原始字节数组的相应方法,然后您可以对其进行解密.