2012-05-17 39 views
1

我想使用DES使用給定的密鑰來加密幀。使用提供的密鑰使用帶填充的DES進行加密

我使用的填充樣式是PKCS5Padding。如果要添加2個字節,則使用02 02填充字符串,如果要添加3個字節以使8的倍數增加,則使用03 03 03填充字符串。 但我的要求是填充字符串和我的特定字節。例如,如果要添加2個字節,則要添加30 30和3個字節,然後30 30 30(以十六進制0的值爲30)。另外,我必須知道添加了多少填充字節。 我應該遵循哪種填充技術,我該如何使用它?

下面是我的加密代碼:

byte[] keyValue = new byte[]{(byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x16,(byte) 0x05, (byte) 0x12}; 
myKeySpec = new DESKeySpec(keyValue); 
mySecretKeyFactory = SecretKeyFactory.getInstance("DES"); 
key = mySecretKeyFactory.generateSecret(myKeySpec); 


Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
IvParameterSpec iv2 = new IvParameterSpec(new byte[8]); 
cipher.init(Cipher.ENCRYPT_MODE, key, iv2); 
byte[] plainText = function.HexStringToByteArray(payloadRecv); 
byte[] encryptedText = cipher.doFinal(plainText); 

回答

3

不要選擇在密碼規範PKCS5Padding。選擇NoPadding。在加密之前,您必須自己將填充添加到數據中。在解密之後(也不使用填充),您必須檢查最後一個字節,以知道有多少個填充字節可以自行刪除和刪除。

基本上,只是代碼正是你所描述的。

+2

這是正確的,但我希望您的數據不會以30h結束,因爲無法區分數據和填充。我從來沒有聽說過提交者描述的填充機制,所以它不會被包含在任何加密API中。 –

+0

好的謝謝你的答案。我會嘗試相同的。 – java2485

+1

@Robert:是的,如果你總是添加填充,那麼會有填充。這與我的評論有什麼關係? –