简体   繁体   中英

How to Encrypt data to a Plain text without Special character in java

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.

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

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

Hope it helps,

Jose Luis

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

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

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("");

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM