Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中给定密钥的AES加密_Java_Encryption_Aes - Fatal编程技术网

Java中给定密钥的AES加密

Java中给定密钥的AES加密,java,encryption,aes,Java,Encryption,Aes,我正在尝试用Java进行AES加密。我有以下功能: public static String encrypt(String plainText, String key) throws Exception { if (plainText == null || plainText.length() == 0) { return plainText; } // get aes key SecretKeySpec secretKeySpec = new

我正在尝试用Java进行AES加密。我有以下功能:

public static String encrypt(String plainText, String key) throws Exception {
    if (plainText == null || plainText.length() == 0) {
        return plainText;
    }

    // get aes key
    SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

    // encrypt
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
    byte[] bytes = cipher.doFinal(plainText.getBytes("UTF-8"));

    //encode
    String encoded = Base64.encodeToString(bytes, Base64.NO_PADDING | Base64.NO_WRAP);

    return encoded;
}
我的目标是能够用给定的密钥每次以相同的方式加密某些文本。也就是说,如果我多次使用相同的两个参数调用此函数,我希望每次调用都返回相同的字符串。我会提前说,我知道这不是加密应该怎么做的,但我的项目需要这个功能

不幸的是,情况并非如此。第7行生成的密钥似乎每次对我的字符串进行不同的加密。我假设在这个库的较低级别上发生了某种额外的随机自动加盐,阻止我实现我的目标

有人知道Java中的一种方法吗?我可以用一个给定的密钥每次加密一个给定的字符串到相同的值?谢谢

更新/澄清:这不是为了安全。这是为了对数据进行加密,以便对可能接触应用程序本身的某些人进行模糊处理。该信息不是高度敏感的,但我希望它加密,然后用相同的密钥解密。我有其他人与我一起使用他们各自语言的库(例如Ruby)进行这方面的工作,他们的库允许他们每次都以相同的方式使用给定的密钥加密值。我们都希望使用相同加密算法的相同参数:密钥长度:128位 运作模式:CBC 初始化向量:无(全零)


如果不设置初始化向量,它可能是随机分配的吗?我必须检查一下。

是的,Java——或者更确切地说是在CBC模式实现中提供AES的安全提供商——可能会默认为随机IV(之后您必须检索并包含在密文中),如果您没有显式指定它,您将获得安全的随机密文

如果要使用zero IV,必须明确指定:

cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]);
这只比ECB模式稍微安全一些,因为攻击者可以立即看到初始密文块中不同消息中的任何重复

如果你想有一个没有随机IV的更安全的模式-这是CBC模式获得CPA安全所必需的-那么你可以检查合成IV(SIV)模式或GCM-SIV。对于这些模式,整个消息需要与前一个消息相同,才能向攻击者泄漏信息。然而,它是slowe,不包括在标准VM中,密文可能比AES/CBC(包括IV/tag和填充要求)更大