密码Java没有正确加密

时间:2017-11-20 10:41:18

标签: java encryption

我目前正在使用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)

非常感谢,原谅我没有提供所需的所有信息

1 个答案:

答案 0 :(得分:1)

您的代码毫无意义:将String转换为UTF8并返回String是没有意义的:String包含字符。不是字节。

将密钥编码到base64也没有多大意义。将纯文本编码到base64也是无用的。

如果您有随机的二进制字节,并且希望将它们转换为可打印的英文字符,则需要base64编码。只有这样。

所以这个过程应该是:

  1. 将您的密钥转换为字节(使用String.getBytes(UTF_8))。除非String键实际上是base64编码的字节数组,在这种情况下你需要base64 解码它;
  2. 将纯文本转换为字节(使用String.getBytes(UTF_8));
  3. 使用从步骤1获得的密钥加密从步骤2获得的字节。您将获得完全“随机”的字节。这些字节不表示在平台默认字符集中编码的字符。因此,使用new String(bytes)将它们转换为String是没有任何意义的,并且是一种有损转换。
  4. 只需将结果作为字节数组返回,或者如果您确实需要可打印字符,则对字节进行base64编码,并返回从此base64编码中获得的字符串。
  5. 要解密,请使用相反的过程:

    1. 使用与上面步骤1相同的方法获取密钥
    2. 取从上面步骤4获得的字节(如果你选择返回一个字节数组),或者对字符串进行base64解码,以获得原始的随机二进制字节
    3. 使用从步骤1获得的密钥解密从步骤2获得的字节。您将获得一个字节数组,表示原始纯文本的UTF8编码字符。
    4. 使用new String(decryptedBytes, UTF_8)将此字节数组转换为字符串。