从javacard到java的AES密钥,加密
我试图在java应用程序中使用基于JavaCard2.2.1的AESKey 如何制作AESKEY:从javacard到java的AES密钥,加密,java,key,javacard,Java,Key,Javacard,我试图在java应用程序中使用基于JavaCard2.2.1的AESKey 如何制作AESKEY: RandomData randomData = RandomData.getInstance(RandomData.ALG_PSEUDO_RANDOM); byte[] rnd = JCSystem.makeTransientByteArray((short)16, JCSystem.CLEAR_ON_RESET); randomData.generateData(rnd, (short)0, (
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来加密一些东西,但当我解密时,我得到一个错误:“给定的最后一个块没有正确填充”
我检查了一下,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);
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);
我认为这是因为您在没有pad的情况下启动加密:
Cipher symCipher = Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false);
数据被逐块分割和加密。这些块的大小与密钥的大小相同,因为需要加密的数据不一定是密钥的倍数。您必须指定填充方法,以便最后一个块“完整”以适合密钥大小
将填充方法更改为:
Cipher symCipher = Cipher.getInstance(Cipher.ALG_AES_CBC_ISO9797_M2 , false);
让我们知道会发生什么。我认为这是因为您在没有pad的情况下启动加密:
Cipher symCipher = Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false);
数据被逐块分割和加密。这些块的大小与密钥的大小相同,因为需要加密的数据不一定是密钥的倍数。您必须指定填充方法,以便最后一个块“完整”以适合密钥大小
将填充方法更改为:
Cipher symCipher = Cipher.getInstance(Cipher.ALG_AES_CBC_ISO9797_M2 , false);
并让我们知道发生了什么。找到了解决方案
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);
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);
找到解决方案
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);
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);
AES的块长度始终为128位,与密钥长度无关。对于128位AES密钥,您是正确的,但仅适用于此特定情况!谢谢你调查我的问题。找到了一个解决方案,请参阅文章。AES的块长度始终为128位,与密钥长度无关。对于128位AES密钥,您是正确的,但仅适用于此特定情况!谢谢你调查我的问题。找到解决方案,请参阅帖子。注意:加密密钥应始终使用
RandomData创建。ALG_SECURE_RANDOM
,切勿使用ALG_PSEUDO_RANDOM!谢谢你的评论,因为某些原因。ALG_安全_随机总是崩溃。还不知道为什么,我有一些想法。我以后会找的。这用于测试目的。找到解决方案,请参阅帖子。注意,您可以在此论坛中回答自己的问题。这比将答案编辑到问题中要好…注意:加密密钥应始终使用RandomData创建。ALG\u SECURE\u RANDOM
,切勿使用ALG\u PSEUDO\u RANDOM!谢谢你的评论,因为某些原因。ALG_安全_随机总是崩溃。还不知道为什么,我有一些想法。我以后会找的。这用于测试目的。找到解决方案,请参阅帖子。注意,您可以在此论坛中回答自己的问题。这比将答案编辑到问题中要好。。。