我有一个运行良好的加密方法,并向我传递一个加密的字符串。
KeySpec keySpec = new PBEKeySpec(encryptionPassword.toCharArray(), salt, iterations);
SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterations);
//encryption
Cipher encoder = Cipher.getInstance(key.getAlgorithm());
encoder.init(Cipher.ENCRYPT_MODE, key, paramSpec);
String str_to_encrypt = "Hello";
byte[] enc = encoder.doFinal(str_to_encrypt.getBytes("UTF8"));
System.out.println("encrypted = " + DatatypeConverter.printBase64Binary(enc));
output: encrypted = vjXsSX0cBNc=
但是我也希望解密我收到的这个字符串,但是我遇到了麻烦,尤其是 getBytes 和 printBase64Binary 的反向操作。
这是我第一次尝试解密,所以我用了很多谷歌搜索,我发现'parseBase64Binary'可以从字符串中获取字节,用'new String(dec, "US-ASCII")然后将字节转换为字符串......有些东西歪了。
//decryption
Cipher encoder = Cipher.getInstance(key.getAlgorithm());
encoder.init(Cipher.DECRYPT_MODE, key, paramSpec);
String str_to_decrypt = "vjXsSX0cBNc=";
byte[] dec = DatatypeConverter.parseBase64Binary(str_to_decrypt);
System.out.println("decrypted = " + new String(dec, "UTF8"));
output: decrypted = ?5?I}?
我唯一能想到的是,我实际上并没有正确解密字符串,因为我没有在任何地方使用encoder.doFinal...有点难于在哪里使用它。
编辑:为了完整性回答自己的问题,全部排序!
再玩一会儿,我说我没有正确解密字符串,因为我没有使用encoder.doFinal...尝试和错误导致我这样做是正确的:
String str_to_decrypt = "vjXsSX0cBNc=";
byte[] dec = encoder.doFinal(DatatypeConverter.parseBase64Binary(str_to_decrypt));
System.out.println("decrypted = " + new String(dec, "UTF8"));
output: decrypted = Hello
我是一名优秀的程序员,十分优秀!