Ist eine Verschlüsselung in AES ohne Sonderzeichen möglich?Java

Java-Forum
Guest
 Ist eine Verschlüsselung in AES ohne Sonderzeichen möglich?

Post by Guest »

Guten Tag, ich arbeite derzeit mit einer API in JAVA und Quarkus. Darin erhalte ich über die GET-Methode einen Parameter in der URL, der mit AES verschlüsselt ist. Das Problem ist, dass die Verschlüsselung Sonderzeichen wie + enthält / der nun die URL liest, die der Dienst als Pfad verwendet
Dies ist mein Code für die AES-Verschlüsselung, die Verschlüsselungs- und Entschlüsselungsmethoden, die ich für meine Verschlüsselung verwende:

Code: Select all

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);
}
}
Und manchmal auch Zahlen wie folgt:

Code: Select all

WKqxB/qNPQUz6wRbHZrpBQ==
Das Problem liegt darin, dass ich dies in einer URL wie der folgenden übergeben muss:

Code: Select all

https://10.162.128.94:30000/userProfile/v3.6/users/WKqxB/qNPQUz6wRbHZrpBQ==
Das oben Genannte führt zu einem Fehler, wenn ich meinen Dienst beispielsweise durch Kubernet und einen Ingress verfügbar mache. Daher möchte ich wissen, ob es eine andere Option gibt. Ich kenne die Codierung und Decodierung in Base64 ist eine Option, aber ich würde gerne AES

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post