2013-04-08 297 views
1

我試圖用一個AESKey,在Java應用程序 上的Java卡2.2.1如何做我做AESKEY:AES密鑰,加密

RandomData randomData = RandomData.getInstance(RandomData.ALG_PSEUDO_RANDOM); 
byte[] rnd = JCSystem.makeTransientByteArray((short)16, JCSystem.CLEAR_ON_RESET); 
randomData.generateData(rnd, (short)0, (short)rnd.length); 
AESKey symKey = (AESKey) KeyBuilder.buildKey (KeyBuilder.TYPE_AES, KeyBuilder.LENGTH_AES_128, false); 
symKey.setKey(rnd, (short)0); 

我如何對數據進行加密:

Cipher symCipher = Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false); 
symCipher.init(symKey, Cipher.MODE_ENCRYPT); 
byte[] encryptedC= new byte[48]; 
symCipher.doFinal(c, (short)0, (short)c.length, encryptedC, (short)0); 

之後,我發送rnd到我的Java應用程序,並嘗試使用它的關鍵。

SecretKeySpec secretKeySpec = new SecretKeySpec(symKeyData, "AES"); 

我知道SymKeyData == rnd。我可以用這個SecretKey的加密的東西,但是當我解密我得到一個錯誤:「鑑於最終塊未正確填充」

Cipher cipherAes = Cipher.getInstance("AES"); 
cipherAes.init(Cipher.DECRYPT_MODE, secretKeySpec); 
byte[] decryptedBytes = cipherAes.doFinal(challengeEncrypted); 

我檢查,challengeEncrypted是很好的長度(48)試了一下:

Cipher cipherAes = Cipher.getInstance("AES/CBC/NoPadding"); 

但是,沒有更迭,例外: 「錯了鍵」

發現其解決

byte[] ivdata = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
IvParameterSpec spec = new IvParameterSpec(ivdata); 
symetricKeyFromCard = new SecretKeySpec(symKeyData, "AES"); 

Cipher cipherAes = Cipher.getInstance("AES/CBC/NoPadding"); 
cipherAes.init(Cipher.DECRYPT_MODE, symetricKeyFromCard, spec); 
byte[] decryptedBytes = cipherAes.doFinal(challengeEncrypted); 
+0

注:加密密鑰應該總是使用'RandomData.ALG_SECURE_RANDOM',從不使用ALG_PSEUDO_RANDOM爲創造! – Robert 2013-04-09 08:33:25

+0

thx的評論,出於某種原因.ALG_SECURE_RANDOM總是崩潰。不知道爲什麼,我有一些想法。稍後再看。這適用於測試目的。 找到解決方案,請參閱文章。 – denBelg 2013-04-10 19:27:11

+0

請注意,您可以在此論壇中回答自己的問題。這比編輯問題的答案要好... – 2013-04-21 10:42:34

回答

0

發現其解決

byte[] ivdata = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
IvParameterSpec spec = new IvParameterSpec(ivdata); 
symetricKeyFromCard = new SecretKeySpec(symKeyData, "AES"); 

Cipher cipherAes = Cipher.getInstance("AES/CBC/NoPadding"); 
cipherAes.init(Cipher.DECRYPT_MODE, symetricKeyFromCard, spec); 
byte[] decryptedBytes = cipherAes.doFinal(challengeEncrypted); 
1

我認爲這是因爲你啓動加密沒有墊:

Cipher symCipher = Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false); 

數據被分割和加密塊。這些塊的大小與密鑰大小相同,因爲您需要加密的數據不一定是密鑰的倍數,您必須指定填充方法,以便最後一個塊將「完整」以適應密鑰大小。

更改填充方法:

Cipher symCipher = Cipher.getInstance(Cipher.ALG_AES_CBC_ISO9797_M2 , false); 

,讓我們知道會發生什麼。

+0

AES的塊長度總是128位,與密鑰長度無關。對於128位AES密鑰,您是對的,但僅限於此特定情況! – Robert 2013-04-09 08:31:18

+0

Thx查看我的問題。找到解決方案,請參閱後。 – denBelg 2013-04-10 19:27:37