Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从javacard到java的AES密钥,加密_Java_Key_Javacard - Fatal编程技术网

从javacard到java的AES密钥,加密

从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, (

我试图在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, (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_安全_随机总是崩溃。还不知道为什么,我有一些想法。我以后会找的。这用于测试目的。找到解决方案,请参阅帖子。注意,您可以在此论坛中回答自己的问题。这比将答案编辑到问题中要好。。。