PKH*_*PKH 3 java security encryption cryptography aes
我用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的结果如下:
加密数据: /ia3VXrqaaUls7fon4RBhQ==
解密数据:ABC
.
可以使用RFC 4648 第 5 节中定义的URL 安全 base 64 。
要使用 URL 安全的 base 64,可以在(自 Java 8 起)中使用新Base64
类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]);
Run Code Online (Sandbox Code Playgroud)
结果是:
_-A
(byte) 0xFF, (byte) 0xE0
Run Code Online (Sandbox Code Playgroud)
请注意,使用 base 64 并简单地删除填充可能是不行的。在这种情况下+
,/
可能会根据输入返回字符。
由于许多加密原语的输出——尤其是那些用于加密的原语——与随机无法区分,因此可以随时获取这些字符,即使是相同的明文。
这也是为什么 URL 编码结果不是最佳解决方案的原因;您不知道需要提前转义多少个字符,从而使输出大小不可预测。
归档时间: |
|
查看次数: |
8150 次 |
最近记录: |