[英]How to control length of encrypted String (Cryptography - Encryption)
例如,我想傳遞一個字符串“ abc”,然后輸出的加密字符串應為32字節,當我想傳遞“ abcdef”時,輸出也應為32字節。 換句話說,我想要固定長度的加密輸出。 我知道我的上限。 就像我知道我的字符串永遠不會超過8個字符。 最多8個字符或少於8個字符。絕不超過8個字符。
如果有人在Java Cipher中共享代碼,那就太好了。
您應該應用填充方案。 填充方案旨在完成純文本,以便它們可以適合塊密碼的塊大小。
您要求32個字節,這意味着用於AES的兩個加密塊。 您沒有指定哪種安全類型,因此,我將考慮需要IV傳輸的C TR操作模式 。
例如ANSI X.923填充方案,請在郵件末尾附加0和末尾的長度。 然后
XX XX XX XX XX XX XX XX 00 00 00 00 00 00 00 08
將是您的純文本。 08是您的純文本字節長度。
例如PKCS#5和PKCS#7填充方案,請在消息的長度后面加上重復的字符,然后
XX XX XX XX XX XX XX XX 08 08 08 08 08 08 08 08
將是您的純文本。
這些填充被設計為一個塊。 如果該塊已滿,它們將擴展下一個塊。
解決方案;
它取決於加密算法,模式和塊大小。
例如,AES使用128位(16字節)的固定塊大小,CBC和ECB模式將返回固定長度,該長度將是128的倍數。
如果您使用ECB模式並且您輸入的字節數組長度為10,則必須添加6個字節的填充以完成該塊。
填充塊的方法有很多,可以使用PKCS5或PKCS7。
在Java中,您可以使用Bouncy Castle的庫https://www.bouncycastle.org/確保使用安全的IV和派生的加密密鑰
在以下示例中,填充由庫處理
public byte[] genIV() {
byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
return iv;
}
public byte[] encrypt(byte[] plaintext, byte[] secretKey, byte[] iv) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, InvalidKeyException {
Cipher in = Cipher.getInstance("AES/ECB/PKCS5Padding", "BC");
Key key = new SecretKeySpec(secretKey, "AES");
in.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
return in.doFinal(plaintext);
}
public byte[] decrypt(byte[] ciphertext, byte[] secretKey, byte[] iv) throws InvalidAlgorithmParameterException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, BadPaddingException, IllegalBlockSizeException {
Key key = new SecretKeySpec(secretKey, "AES");
Cipher out = Cipher.getInstance("AES/ECB/PKCS5Padding", "BC");
out.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
return out.doFinal(ciphertext);
}
請記住,字符串中的每個字符(取決於字符集)的長度至少為 8位,在您的示例中,“ abcdef”的長度至少為6個字節
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.