加密没有特殊字符的数据(“=”)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加密没有特殊字符的数据(“=”)相关的知识,希望对你有一定的参考价值。

我在java中编写了简单的加密和解密程序。我正在使用"AES" algorithm进行加密和解密。它工作正常,但在加密数据我得到像"/","="等特殊字符。

但我不希望加密数据中的特殊字符特别是“=”运算符。因为它导致我的进一步处理问题。有没有办法避免加密数据中的特殊字符或单个"="运算符。

我用谷歌搜索它,我得到一些建议,如将数据转换为哈希码,因此哈希码加密将不包含特殊字符。但根据建议,哈希码加密不是基于secret key,我需要使用secret key进行加密

我怎样才能做到这一点?

任何帮助都会得到满足。谢谢

以下是我用java编写的程序:

public class EncDec
{
    private static final String ALGO = "AES";
    private static final byte[] keyValue = "1234567891234567".getBytes();
    public static void main(String[] args) throws Exception 
    {
        String testData = "ABC";
        String enc = encrypt(testData);
        System.out.println("Encrypted data: "+enc);
        String dec = decrypt(enc);
        System.out.println("Decrypted data: "+enc);
    }
    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;
    }
    public static String decrypt(String encryptedData) throws Exception 
    {
        try{
            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;
        }catch(Exception e)
        {
            System.out.println("Something wrong..");
            return "";
        }
    }
    private static Key generateKey() throws Exception
    {
        Key key = new SecretKeySpec(keyValue, ALGO);
        return key;
    }
}

我得到的结果如下:

加密数据:/ia3VXrqaaUls7fon4RBhQ==

解密数据:ABC

答案

可以使用URL安全base64 qazxsw poi。

要使用URL安全基础64,可以使用as defined in RFC 4648 section-5(自Java 8起)。如果必须避免使用the new Base64 class in java.util,则可以指定不使用填充。解码器当然应该以相同的方式配置:

=

结果是:

Encoder urlEncoder = java.util.Base64.getUrlEncoder().withoutPadding();
String encoded = urlEncoder.encodeToString(new byte[] { (byte) 0xFF, (byte) 0xE0});
System.out.println(encoded);

Decoder urlDecoder = java.util.Base64.getUrlDecoder();
byte[] decoded = urlDecoder.decode(encoded);
System.out.printf("(byte) 0x%02X, (byte) 0x%02X%n", decoded[0], decoded[1]);

请注意,使用base 64并简单地删除填充可能不太好。在这种情况下,可能会根据输入返回_-A (byte) 0xFF, (byte) 0xE0 +字符。

由于许多加密原语的输出 - 特别是那些用于加密的原语 - 与随机无法区分,因此可以随时获得这些字符,即使对于相同的明文也是如此。

这也是编码结果的URL不太理想的原因;你不知道需要提前转义多少个字符才能使输出大小无法预测。

另一答案

而不是转换成/使用base64 encoding。这对我来说很好

以上是关于加密没有特殊字符的数据(“=”)的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本中怎样对特殊字符进行处理 一串密码在加密前对密码中的!@#$%等特殊字符进行处理(加上‘’)。

地址栏传参,加密参数中特殊字符处理问题

301重定向没有片段[重复]

如何在python上加密代码,其中字符串被加密为密码?

特殊字符在通过 API 时被加密

非托管 C++ 加密字符串转换为 C# byte[]