簡體   English   中英

給定密鑰的Java AES加密

[英]AES encryption in Java for given key

我正在嘗試用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,則Java(或更確切地說是以CBC模式實施的提供AES的安全提供程序)可能會默認為隨機IV(然后您必須檢索該隨機IV並包含密文)。密文。

如果要使用零IV,則必須明確指定:

cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]);

這僅比ECB模式稍微安全一些,因為攻擊者可以立即看到初始密文塊中不同消息中的任何重復。

如果您想擁有一個沒有隨機IV的更安全的模式-CBC模式才能獲得CPA安全性,那么您可以簽出合成IV(SIV)模式或GCM-SIV。 對於那些模式,整個消息需要與先前的消息相同,以將信息泄露給攻擊者。 但是它很慢,沒有包含在標准VM中,並且密文可能比AES / CBC大(包括IV / tag與padding要求)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM