我目前正在使用Cipher使用始终相同的密钥创建解决方案。我知道这不是最安全的解决方案,但这是我被要求做的事情。我应该使用AES256和EBC,但我无法正确加密。问题是我的角色不明。
private static String encrypt(String text) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException
{
String keyString = AESEncryption.convertToUTF8("8DJE7K01U8B51807B3E17D21");
text = AESEncryption.convertToUTF8(text);
byte[]keyValue = Base64.getEncoder().encode(keyString.getBytes(StandardCharsets.UTF_8));
Key key = new SecretKeySpec(keyValue, "AES");
Cipher c1 = Cipher.getInstance("AES/ECB/PKCS5Padding");
c1.init(Cipher.ENCRYPT_MODE, key);
byte[] encodedText =Base64.getEncoder().encode(text.getBytes(StandardCharsets.UTF_8));
System.out.println("Encoded text: "+new String(encodedText,StandardCharsets.UTF_8));
byte[] encVal = c1.doFinal(encodedText);
System.out.println("Encoded val: "+new String(encVal,StandardCharsets.UTF_8));
return new String(encVal);
}
编辑:抱歉第一次询问。我会给你全部范围。之后我尝试使用以下代码解密(我知道我有重复的代码,我会清理它)但是当我解密加密方法获得的输出时,我收到以下错误。我试图加密和解密的消息是“Hola”
public static String desEncrypt(String text) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
String keyString = AESEncryption.convertToUTF8("8DJE7K01U8B51807B3E17D21");
byte[] keyValue = Base64.getEncoder().encode(keyString.getBytes(StandardCharsets.UTF_8));
Key key = new SecretKeySpec(keyValue, "AES");
Cipher c1 = Cipher.getInstance("AES/ECB/PKCS5Padding");
c1.init(Cipher.DECRYPT_MODE, key);
byte[] encodedText = Base64.getDecoder().decode(text.getBytes(StandardCharsets.UTF_8));
byte[] encVal = c1.doFinal(encodedText);
System.out.println(new String(encodedText));
return new String(encVal,StandardCharsets.UTF_8);
}
错误:
Encoded text: aG9sYWNraXNqbWRlaXJncw==
Encoded val: ???D>??|??i9???Fd?\Zz?A?-
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character -3d
at java.util.Base64$Decoder.decode0(Unknown Source)
at java.util.Base64$Decoder.decode(Unknown Source)
at AESEncryption.desEncrypt(AESEncryption.java:63)
at AESEncryption.main(AESEncryption.java:79)
非常感谢,原谅我没有提供所需的所有信息
答案 0 :(得分:1)
您的代码毫无意义:将String转换为UTF8并返回String是没有意义的:String包含字符。不是字节。
将密钥编码到base64也没有多大意义。将纯文本编码到base64也是无用的。
如果您有随机的二进制字节,并且希望将它们转换为可打印的英文字符,则需要base64编码。只有这样。
所以这个过程应该是:
String.getBytes(UTF_8)
)。除非String键实际上是base64编码的字节数组,在这种情况下你需要base64 解码它; String.getBytes(UTF_8)
); new String(bytes)
将它们转换为String是没有任何意义的,并且是一种有损转换。 要解密,请使用相反的过程:
new String(decryptedBytes, UTF_8)
将此字节数组转换为字符串。