[英]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.