AES的KeyPairGenerator无法识别(AES KeyPairGenerator Not

2019-06-24 22:56发布

我有我的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注册机= KeyPairGenerator.getInstance(” AES “)发生了错误;”。

Answer 1:

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支持。 你很likley只需要更换AESRSA在你getInstance(); 打来电话,pherhaps一些微调。 祝好运



Answer 2:

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

根据JavaDoc of java.security.KeyPairGenerator

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

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

不过,我建议干脆模仿如何加密/使用AES解密一样的字节数组在Java中的一些教程这一个 。

它使用sun.misc.Base64Encoder / Base64Decoder类来编码从字符串/解码字节数组/然而可以跳过此步骤。

希望这可以帮助



Answer 3:

你怎么能使用AES密钥对生成器? AES是一种对称密钥算法。 请参阅此链接 。 这意味着如果你使用一键“K”对数据进行加密,那么你将不得不解密它也使用相同的密钥“K”。

但是,当你生成密钥对,顾名思义,是产生两个键,如果你加密使用的关键之一,你只能使用其他密钥来解密。 这是基本的PKI 。

如果你想使用密钥对生成器使用类似的算法"rsa""dsa"getInstance()这样的方法:

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

我觉得你的代码现在应该进行上述更改后正常工作。



文章来源: AES KeyPairGenerator Not Recognised