如何在java中将数据加密为无特殊字符的纯文本

k4aesqcs  于 2023-02-07  发布在  Java
关注(0)|答案(7)|浏览(170)

我需要一个加密算法,通过它我可以将数据加密成一个简单的纯文本。
目前我正在使用AES****加密算法转换为加密字符串包含特殊字符。
在这里,如果我通过URL中的查询字符串发送此字符串,我会丢失一些字符,如-"+"。
所以我需要一个加密逻辑,这是安全的,只包含字母表。
下面是我的加密逻辑:

public static String encrypt(String Data) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(Data.getBytes());
        String encryptedValue = new BASE64Encoder().encode(encVal);
        return encryptedValue;
    }

    @SuppressWarnings("restriction")
    public static String decrypt(String encryptedData) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key);
        byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
        byte[] decValue = c.doFinal(decordedValue);
        String decryptedValue = new String(decValue);
        return decryptedValue;
    }

这里我得到了一个加密字符串"TEj + TWBQExpz8/p5SAjIhA =="
当我将查询字符串作为

    • 本地主机:8080/我的项目/主页?代码= TEj + TWBQExpz8/p5SAjIhA ==**

我正在控制器中获取字符串-
"TEj TWBQExpz8/p5SAjIhA =="
"+"符号丢失,这就是为什么我得到的问题,而解密。
请建议任何新的算法或任何解决方案,以避免特殊字符。
谢谢你。

bfrts1fy

bfrts1fy1#

您可以使用URLEncoder对加密部分进行编码

URLEncoder.encode("TEj+TWBQExpz8/p5SAjIhA==", "UTF-8")

以使其对URL有效。
http://docs.oracle.com/javase/8/docs/api/java/net/URLEncoder.html

2ic8powd

2ic8powd2#

您应该尝试Apache Commons Base64 URL安全编码器,它将生成您需要的内容。
希望能有所帮助,
若泽·路易斯

42fyovps

42fyovps3#

您必须使用URLEncoder对加密值进行编码,然后才能通过URL发送。
在解密端,必须首先使用URLDecoder来解码接收到的数据。
您可以在代码中执行以下操作来实现此目的:

public static String encrypt(String Data) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(Data.getBytes());
        String encryptedValue = new BASE64Encoder().encode(encVal);

        String urlEncodeddata=URLEncoder.encode(encryptedValue,"UTF-8");
        return urlEncodeddata;
    }

    @SuppressWarnings("restriction")
    public static String decrypt(String encryptedData) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key);
        String urlDecodedData=URLDecoder.decode(encryptedData, "UTF-8");
        byte[] decordedValue = new BASE64Decoder().decodeBuffer(urlDecodedData);
        byte[] decValue = c.doFinal(decordedValue);
        String decryptedValue = new String(decValue);
        return decryptedValue;
    }
rdrgkggo

rdrgkggo4#

我在基于Spring的应用程序中遇到了同样的问题,我用Base64编码/解码过程解决了这个问题。
编码:

String encryptedString = encrypt(stringData);
byte[] encoded = Base64.getEncoder().encode(encryptedString.getBytes(StandardCharsets.UTF_8));
String base64Encoded = new String(encoded);

解码:

byte[] decoded = Base64.getDecoder().decode(base64Encoded.getBytes(StandardCharsets.UTF_8));
String encryptedString = new String(decoded);

那么您就可以在您的解密方法上成功地解密"encryptedString"值。

String decryptedString = decrypt(encryptedString);

希望能有所帮助。

yhived7q

yhived7q5#

仅使用URLEncode,无需更改代码。
String encodedStr = URLEncoder.encode(encrypt("XYZ"), "UTF-8");
并且不需要使用URLDecode来解码url,因为您可以使用普通的decrypt(encodedStr);

vqlkdk9b

vqlkdk9b6#

你必须在C#应用程序中使用这个来编码加密的值,在通过URL.Decryption端发送之前,你必须先使用UrlDecode来解码QueryString数据。

Server.UrlEncode("");
 Server.UrlDecode("");
lbsnaicq

lbsnaicq7#

您可以使用Base64.encodeBase64URLSafeString。
示例:

private static final String ALGORITHM = "AES";
  private static final String TRANSFORMATION = "AES/CBC/PKCS5PADDING";
  private static final String ENCODING = StandardCharsets.UTF_8.toString();

  @Value("${vector}")
  private String vector;

  @Value("${key}")
  private String key;

  public String encrypt(String value) {
    try {
      Cipher cipher = initCipher(ENCRYPT_MODE);
      byte[] encrypted = cipher.doFinal(value.getBytes());
      return Base64.encodeBase64URLSafeString(encrypted);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  public String decrypt(String encrypted) {
    try {
      Cipher cipher = initCipher(DECRYPT_MODE);
      byte[] originalText = cipher.doFinal(Base64.decodeBase64(encrypted));
      return new String(originalText);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  private Cipher initCipher(int mode) throws Exception {
    IvParameterSpec iv = new IvParameterSpec(vector.getBytes(ENCODING));
    SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM);
    Cipher cipher = Cipher.getInstance(TRANSFORMATION);
    cipher.init(mode, skeySpec, iv);
    return cipher;
  }

相关问题