Java AES密钥生成器未识别

Java AES密钥生成器未识别,java,file,encryption,key,aes,Java,File,Encryption,Key,Aes,我的java代码有问题。我正试图加密一个文件。然而,当我运行java代码时,我得到了“java.security.InvalidKeyException:无效AES密钥长度:162字节” 代码如下: byte[] rawFile; File f = new File("./src/wonkybox.stl"); FileInputStream fileReader = new FileInputStream(f); rawFile = new byte[(int)f.length()]; fil

我的java代码有问题。我正试图加密一个文件。然而,当我运行java代码时,我得到了“java.security.InvalidKeyException:无效AES密钥长度:162字节”

代码如下:

byte[] rawFile;
File f = new File("./src/wonkybox.stl");
FileInputStream fileReader = new FileInputStream(f);
rawFile = new byte[(int)f.length()];
fileReader.read(rawFile);

/*****   Encrypt the file (CAN DO THIS ONCE!)  ***********/

//Generate the public/private keys
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG","SUN");
keyGen.initialize(1024, random);
KeyPair key = keyGen.generateKeyPair();
PrivateKey privKey = key.getPrivate();
PublicKey pubKey = key.getPublic();

//Store the keys
byte[] pkey = pubKey.getEncoded();
FileOutputStream keyfos = new FileOutputStream("./CloudStore/keys/pubkey");
keyfos.write(pkey);
keyfos.close();

pkey = privKey.getEncoded();
keyfos = new FileOutputStream("./CloudStore/keys/privkey");
keyfos.write(pkey);
keyfos.close();


//Read public/private keys
KeyFactory keyFactory = KeyFactory.getInstance("AES");
FileInputStream keyfis = new FileInputStream("./CloudStore/keys/pubkey");
byte[] encKey = new byte[keyfis.available()];
keyfis.read(encKey);
keyfis.close();

X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
PublicKey pub1Key = keyFactory.generatePublic(pubKeySpec);

keyfis = new FileInputStream("./CloudStore/keys/privkey");
encKey = new byte[keyfis.available()];
keyfis.read(encKey);
keyfis.close();

PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(encKey);
PrivateKey priv1key = keyFactory.generatePrivate(privKeySpec);

//Encrypt file using public key
Cipher cipher = Cipher.getInstance("AES");
System.out.println("provider= " + cipher.getProvider());
cipher.init(Cipher.ENCRYPT_MODE, pub1Key);


byte[] encryptedFile;
encryptedFile = cipher.doFinal(rawFile);

//Write encrypted file to 'CloudStore' folder
FileOutputStream fileEncryptOutput = new FileOutputStream(new File("./CloudStore/encrypted.txt"));
fileEncryptOutput.write(encryptedFile);
fileEncryptOutput.close();

错误发生在“KeyPairGenerator keyGen=KeyPairGenerator.getInstance(“AES”);”行。

据我所知,
AES
是对称加密算法,即加密/解密只需要一个密钥

从java.security.KeyPairGenerator的JavaDoc

KeyPairGenerator类用于生成公钥和私钥对

这意味着它应该用于非对称加密算法。对于对称加密算法,应该使用
javax.crypto.KeyGenerator

然而,我建议简单地模仿一些关于如何使用类似AES的方法在Java中加密/解密字节数组的教程

它使用
sun.misc.Base64Encoder/Base64Decoder
类对字符串中的字节数组进行编码/解码,但您可以跳过此步骤


希望这有帮助

据我所知,
AES
是一种对称加密算法,即加密/解密只需要一个密钥

从java.security.KeyPairGenerator的JavaDoc

KeyPairGenerator类用于生成公钥和私钥对

这意味着它应该用于非对称加密算法。对于对称加密算法,应该使用
javax.crypto.KeyGenerator

然而,我建议简单地模仿一些关于如何使用类似AES的方法在Java中加密/解密字节数组的教程

它使用
sun.misc.Base64Encoder/Base64Decoder
类对字符串中的字节数组进行编码/解码,但您可以跳过此步骤


希望这有帮助

AES是一种对称算法,因此不支持使用
KeyPairGenerator
。要使用AES生成密钥,请调用
KeyGenerator

KeyGenerator kgen = KeyGenerator.getInstance("AES");
       kgen.init(128);  //set keysize, can be 128, 192, and 256

通过查看代码的其余部分,您似乎正在尝试实现非对称加密(因为您调用了
getPublic()和getPrivate()
etc),因此我建议您切换到使用RSA或java支持的任何其他非对称算法。在
getInstance()中,您很可能只需要将
AES
替换为
RSA
调用,并进行一些微调。好运

AES是一种对称算法,因此不支持使用
KeyPairGenerator
。要使用AES生成密钥,请调用
KeyGenerator

KeyGenerator kgen = KeyGenerator.getInstance("AES");
       kgen.init(128);  //set keysize, can be 128, 192, and 256

通过查看代码的其余部分,您似乎正在尝试实现非对称加密(因为您调用了
getPublic()和getPrivate()
etc),因此我建议您切换到使用RSA或java支持的任何其他非对称算法。在
getInstance()中,您很可能只需要将
AES
替换为
RSA
调用,并进行一些微调。祝你好运

如何使用AES的密钥对生成器?AES是一种对称密钥算法。参考这个。这意味着如果您使用密钥“k”加密数据,那么您还必须使用相同的密钥“k”对其进行解密

但当您生成密钥对时,顾名思义,会生成两个密钥,如果您使用其中一个密钥进行加密,则只能使用另一个密钥进行解密。这是我们的基础

如果要使用密钥对生成器,请在
getInstance()
方法中使用类似于
“rsa”
“dsa”
的算法,如下所示:

KeyPairGenerator keygen=KeyPairGenerator.getInstance("rsa");

我认为在进行上述更改后,您的代码现在应该可以正常工作。

如何使用AES的密钥对生成器?AES是一种对称密钥算法。参考这个。这意味着如果您使用密钥“k”加密数据,那么您还必须使用相同的密钥“k”对其进行解密

但当您生成密钥对时,顾名思义,会生成两个密钥,如果您使用其中一个密钥进行加密,则只能使用另一个密钥进行解密。这是我们的基础

如果要使用密钥对生成器,请在
getInstance()
方法中使用类似于
“rsa”
“dsa”
的算法,如下所示:

KeyPairGenerator keygen=KeyPairGenerator.getInstance("rsa");

我认为在做了上述更改后,您的代码现在应该可以正常工作。

可能与继续尝试随机算法直到某些算法起作用有关?这对于真正理解你在做什么来说是一个糟糕的选择。可能是因为你一直在尝试随机算法,直到某件事情奏效?这不是真正理解你在做什么的好办法。谢谢!最初,我在KeyPairGenerator中使用RSA,但是我得到了一个“数据不得超过117字节”错误,因此我切换到AES。我将切换到对称加密instead@user1406126:您必须使用1024位密钥。你的数据很大吗?如果它不是很大,并且在245字节以内,那么您可以使用2048位的密钥。谢谢!最初,我在KeyPairGenerator中使用RSA,但是我得到了一个“数据不得超过117字节”错误,因此我切换到AES。我将切换到对称加密instead@user1406126:您必须使用1024位密钥。你的数据很大吗?如果它不是很大并且在245字节内,那么可以使用2048位密钥。