Можно ли зашифровать AES без специальных символов?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Можно ли зашифровать AES без специальных символов?

Сообщение Anonymous »

Добрый день, сейчас я работаю с API в JAVA и Quarkus, в нем я получаю с помощью метода GET параметр в URL-адресе, который зашифрован с помощью AES, проблема в том, что шифрование включает в себя специальные символы, такие как + / который теперь читает URL-адрес, который служба принимает в качестве пути.
Это мой код для шифрования AES, методы шифрования и дешифрования, которые я использую для шифрования:

Код: Выделить всё

package com.tmve.util;
import lombok.NoArgsConstructor;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Arrays;
import java.util.Base64;

@NoArgsConstructor
public class EncryptUtil {
private static byte[]   initializationVector = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
private static byte[] key;
private static SecretKeySpec secretKey;

public String encrypt(String input, String key)
throws NoSuchPaddingException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException, InvalidKeyException,
BadPaddingException, IllegalBlockSizeException {

byte[] desKeyData = key.getBytes();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(desKeyData, "AES");
IvParameterSpec specie = new IvParameterSpec(initializationVector);

cipher.init(Cipher.ENCRYPT_MODE, myKey, specie);
byte[] cipherText = cipher.doFinal(input.getBytes());
return Base64.getEncoder().encodeToString(cipherText);
}

public String decrypt(String cipherText, String key) throws NoSuchPaddingException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException, InvalidKeyException,
BadPaddingException, IllegalBlockSizeException {

byte[] desKeyData =  key.getBytes();

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(Arrays.copyOf(desKeyData,16), "AES");
IvParameterSpec ivspec = new IvParameterSpec(initializationVector);
cipher.init(Cipher.DECRYPT_MODE, myKey, ivspec);

byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText));
return new String(plainText);
}

public String decryptAESText2(String cipherText, String key) throws Exception {
setKey(key);
Cipher decipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
IvParameterSpec ivspec = new IvParameterSpec(initializationVector);
decipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] plainText = decipher.doFinal(Base64.getDecoder().decode(cipherText));

return new String(plainText);
}

public String encryptAESText2(String plainText, String key) throws Exception {
setKey(key);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
IvParameterSpec specie = new IvParameterSpec(initializationVector);

cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] cipherText = cipher.doFinal(plainText.getBytes("UTF-8"));

return Base64.getEncoder().encodeToString(cipherText);
}

public SecretKey getKeyFromPassword(String password, String salt)
throws NoSuchAlgorithmException, InvalidKeySpecException {

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256);
SecretKey secret = new SecretKeySpec(factory.generateSecret(spec)
.getEncoded(), "AES");
return secret;
}
public String decryptSSOText(String cipherText) throws Exception {
String DEFAULT_KEY = "k2/3kwpEMHKrLgNkYDzs+YVfzXSp9Xyx";
String DEFAULT_IV = "G1oPqIGmVOk=";
byte[] encData = Base64.getDecoder().decode(cipherText.replaceAll("[\n\r]", ""));
byte[] tdesKeyData = Base64.getDecoder().decode(DEFAULT_KEY);

Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(tdesKeyData,  "DESede");
IvParameterSpec ivspec = new IvParameterSpec(Base64.getDecoder().decode(DEFAULT_IV));
decipher.init(Cipher.DECRYPT_MODE, myKey, ivspec);
byte[] plainText = decipher.doFinal(Base64.getDecoder().decode(cipherText));

return new String(plainText);
}

public String EncryptSSOText(String cipherText) throws Exception {
String DEFAULT_KEY = "k2/3kwpEMHKrLgNkYDzs+YVfzXSp9Xyx";
String DEFAULT_IV = "G1oPqIGmVOk=";
byte[] desKeyData = Base64.getDecoder().decode(DEFAULT_KEY);

Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(desKeyData, "DESede");
IvParameterSpec ivspec = new IvParameterSpec(Base64.getDecoder().decode(DEFAULT_IV));
decipher.init(Cipher.ENCRYPT_MODE, myKey, ivspec);
byte[] plainText = decipher.doFinal(cipherText.getBytes());
return Base64.getEncoder().encodeToString(plainText);
}
private void setKey(String myKey) {
MessageDigest sha = null;
try {
key = myKey.getBytes("UTF-8");
sha = MessageDigest.getInstance("SHA-256");
key = sha.digest(key);
key = Arrays.copyOf(key, 16);
secretKey = new SecretKeySpec(key, "AES");
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public IvParameterSpec generateIv() {
byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
return new IvParameterSpec(iv);
}
}
А иногда и цифры такие:

Код: Выделить всё

WKqxB/qNPQUz6wRbHZrpBQ==
Проблема заключается в том, что мне нужно передать это в URL-адрес, как показано ниже:

Код: Выделить всё

https://10.162.128.94:30000/userProfile/v3.6/users/WKqxB/qNPQUz6wRbHZrpBQ==
Вышеупомянутое вызывает у меня ошибку при раскрытии моего сервиса, например, через kubernete и вход, поэтому я хочу знать, есть ли другой вариант, я знаю, что кодирование и декодирование в base64 вариант, но я бы хотел использовать AES

Подробнее здесь: https://stackoverflow.com/questions/770 ... characters
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»