繁体   English   中英

加密不带特殊字符(“ =”)的数据

[英]Encrypt data without special character (“=”)

我用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

可以使用RFC 4648第5节中定义的 URL安全基础64。

要使用URL安全的base 64,可以java.util使用新的Base64 (从Java 8开始)。 如果必须避免= ,则可以指定不使用填充。 解码器当然应该以相同的方式配置:

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

结果是:

_-A
(byte) 0xFF, (byte) 0xE0

请注意,使用base 64并仅删除填充物可能不适合。 在这种情况下,根据输入,可能会返回+/字符。

由于许多密码原语(尤其是用于加密的原语)的输出与随机是无法区分的,因此即使对于相同的明文,也可以随时获取这些字符。

这也是为什么对结果进行URL编码不是最佳解决方案的原因。 您不知道需要预先转义多少个字符以使输出大小不可预测。

使用HEX encoding而不是转换为base64 encoding HEX encoding 对我来说很好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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