我的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“);”。
行答案 0 :(得分:2)
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支持。您最有可能只需要在AES
来电中将RSA
替换为getInstance();
,并进行一些微调。祝你好运
答案 1 :(得分:1)
据我所知,AES
是对称加密算法,即它只需要一个密钥进行加密/解密。
来自JavaDoc of java.security.KeyPairGenerator
:
KeyPairGenerator类用于生成公钥和私钥对。
意味着它应该用于非对称加密算法。对于对称加密算法,应使用javax.crypto.KeyGenerator
。
但是,我建议简单地模仿一些关于如何使用像this one这样的AES在Java中加密/解密字节数组的教程。
它使用sun.misc.Base64Encoder / Base64Decoder
类对字符串数组进行编码/解码,但是您可以跳过此步骤。
希望这有帮助
答案 2 :(得分:0)