6
votes

I need a encryption algorithm by whick I can encrypt the data to a simple plain text.

Currently i am using AES encrypting algorithm which converts to encrypt string contains Special character.

Here if i send this string through a query string in url I am missing some character like- "+".

So i need a encrypt logic which is secure and contains only alphabet.

Here is my encryption logic :

      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;
    }

Here I am getting an encrypted String "TEj+TWBQExpz8/p5SAjIhA=="

while I am sending through query string as

localhost:8080/myproject/home?code=TEj+TWBQExpz8/p5SAjIhA==

i am getting the String in controller as-
"TEj TWBQExpz8/p5SAjIhA=="

"+" symbol is missing thats why i am getting issue while decryption.

Please suggest any new Algorithm or any solution to avoid the Special character.

Thank you.

6
...send this string through a query string... What does it mean? - PM 77-1
IMO, special characters make encryption stronger. Any special reason why you want t avoid them? Why don't you write a simple encryption algorithm which will work for you? - akhil_mittal
you just need to URL-encode the result - Thilo
Hi @akhil_mittal . I know that it is secure. Can you please suggest me how i can pass it from web url so that i will get all the character and it wont generate the exception. - Sachi-17
@Thilo can you suggest me an example. - Sachi-17

6 Answers

6
votes

You can encode your crypted part with URLEncoder

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

to make it valid for the URL.

http://docs.oracle.com/javase/8/docs/api/java/net/URLEncoder.html

3
votes

You should try Apache Commons Base64 URL safe encoder, which will generate what you need.

Hope it helps,

Jose Luis

2
votes

You have to use URLEncoder to encode the encrypted value, before sending it through URL.

and at decryption side, you have to use URLDecoder first to decode received data.

You can do following in your code to achieve this :

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;
    }
1
votes

I had same issue in Spring based application and I solved the problem with Base64 Encoding/Decoding process.

Encoding:

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

Decoding:

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

Than you can successfully decrypt "encryptedString" value on your decrypt method.

String decryptedString = decrypt(encryptedString);

I hope it helps.

0
votes

Use only URLEncode no need to change code.

String encodedStr = URLEncoder.encode(encrypt("XYZ"), "UTF-8");

And there is no need to use URLDecode for decoding url as you can use normal decrypt(encodedStr);

0
votes

You have to use this in C# Application to encode the encrypted value, before sending it through URL. Decryption side, you have to use UrlDecode first to decode QueryString data.

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