簡體   English   中英

AES256加密

[英]AES256 encryption

我在正確加密AES256中的字符串時遇到困難。 我的要求是它必須是AES256和CBC,並且長度24的IV必須放在加密的字符串之前。 我已經有提供的密鑰,它保持不變。

我的密碼

   public String encrypt(String value) {


    try {
        SecureRandom secureRandom = new SecureRandom();
        byte[] ivBytes = new byte[16];
        secureRandom.nextBytes(ivBytes);

        SecretKeySpec skeySpec = new SecretKeySpec(byteArray, "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(ivBytes));

        byte[] encrypted = cipher.doFinal(value.getBytes());

        Log.d("encrypted", String.format("%s", encrypted.length));

        return Base64.encodeToString(ivBytes, Base64.DEFAULT) + Base64.encodeToString(encrypted, Base64.DEFAULT);


    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return null;
}

這里有幾個問題。 如果將ivBytes從16更改為24,則會收到一條錯誤消息,提示預期的iv長度為16而不是24。我也不確定此代碼是否在AES256或AES中進行加密。 任何幫助表示贊賞。 順便說一句,值是一個十六進制,例如,它可能類似於831684e1。 不知道這是否影響加密。

這里有幾個問題。 如果將ivBytes從16更改為24,則會收到一條錯誤消息,提示期望的iv長度為16而不是24。

沒錯 AES僅以128位/ 16字節的塊大小定義。 CBC 需要單個塊大小的隨機IV。

我也不確定此代碼是否在AES256或AES中加密。

我們也不確定,因為未指定byteArray並且Java / Android中的AES實現使用密鑰大小在AES-128,-192或-256之間進行選擇。 請注意,密鑰還應包含隨機字節(而不是編碼為字節的密碼)。 Android很好,但是對於Java,對於較早版本的Java Runtime Environment(JRE),您可能需要Unlimited Crypto文件。

不用說,對於AES-256, byteArray應該為32個字節。

順便說一句,值是一個十六進制,例如,它可能類似於831684e1。 不知道這是否影響加密。

通常,十六進制表示二進制值。 您最好先解碼十六進制值,然后再加密二進制文件。 這將是密文量的一半(並且還將遵守其他開發人員不會感到驚訝的原則)。

當前,您正在使用value.getBytes() ,這意味着您將獲得平台特定的十六進制字符編碼(對於Android,為UTF-8,但您基本上會獲得US-ASCII,因為十六進制始終被編碼為每個字符一個字節) 。 換句話說,您將對二進制值進行兩次編碼,而根本不需要編碼。

解決了。 我當時做的是正確的加密,只是我沒有意識到Base64在我的字符串后添加了換行符。 這導致網址不正確。 因此,為了解決此問題,我不得不使用Base64.NOWRAP而不是Base64.DEFAULT

暫無
暫無

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

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