AES KeyPairGenerator无法识别

我的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是一种对称算法,因此不支持使用KeyPairGenerator 。 要使用AES生成密钥,请调用KeyGenerator

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

通过查看其余代码,看起来您正在尝试实现非对称加密(因为您调用了getPublic() and getPrivate()等),所以我建议您切换到使用RSA或java支持的任何其他非对称算法。 你最有可能只需要在你的getInstance();中用RSA代替AES getInstance(); 电话,和pherhaps一些微调。 祝好运

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

来自of java.security.KeyPairGenerator的JavaDoc:

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

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

但是,我建议简单地模仿一些关于如何使用像这样的 AES加密/解密Java中的字节数组的教程。

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

希望这可以帮助

如何使用密钥对生成器进行AES? AES是对称密钥算法。 请参阅此链接 。 这意味着如果使用密钥“k”加密数据,则必须使用相同的密钥“k”对其进行解密。

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

如果你想使用keypair生成器在getInstance()方法中使用像"rsa""dsa"这样的算法,如下所示:

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

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