我試圖用一個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);
注:加密密鑰應該總是使用'RandomData.ALG_SECURE_RANDOM',從不使用ALG_PSEUDO_RANDOM爲創造! – Robert 2013-04-09 08:33:25
thx的評論,出於某種原因.ALG_SECURE_RANDOM總是崩潰。不知道爲什麼,我有一些想法。稍後再看。這適用於測試目的。 找到解決方案,請參閱文章。 – denBelg 2013-04-10 19:27:11
請注意,您可以在此論壇中回答自己的問題。這比編輯問題的答案要好... – 2013-04-21 10:42:34