簡體   English   中英

如何控制加密字符串的長度(密碼學-加密)

[英]How to control length of encrypted String (Cryptography - Encryption)

例如,我想傳遞一個字符串“ abc”,然后輸出的加密字符串應為32字節,當我想傳遞“ abcdef”時,輸出也應為32字節。 換句話說,我想要固定長度的加密輸出。 我知道我的上限。 就像我知道我的字符串永遠不會超過8個字符。 最多8個字符或少於8個字符。絕不超過8個字符。

如果有人在Java Cipher中共享代碼,那就太好了。

您應該應用填充方案。 填充方案旨在完成純文本,以便它們可以適合塊密碼的塊大小。

您要求32個字節,這意味着用於AES的兩個加密塊。 您沒有指定哪種安全類型,因此,我將考慮需要IV傳輸的C TR操作模式

  • 讓XX XX XX XX XX XX XX XX代表您的8字節字符串

例如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 

將是您的純文本。

這些填充被設計為一個塊。 如果該塊已滿,它們將擴展下一個塊。


解決方案;

  1. 重新填充該填充的消息,您將獲得兩個街區。
  2. 隨着計數器的增加,對CTR中的加密郵件進行加密。
  3. 為自己設計一個填充。

它取決於加密算法,模式和塊大小。

例如,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.

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