Pregunta sobre encryption, java, file, aes, key – AES KeyPairGenerator no reconocido

2

Tengo un problema con mi código java. Estoy tratando de cifrar un archivo. Sin embargo, cuando ejecuto mi código java obtengo "java.security.InvalidKeyException: longitud de clave AES no válida: 162 bytes".

Aquí está el código:

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();

El error se produce en la línea "KeyPairGenerator keyGen = KeyPairGenerator.getInstance (" AES ");".

Posiblemente relacionado constackoverflow.com/questions/1760785/… Nathan Ryan
¿Sigue intentando algoritmos aleatorios hasta que algo funcione? Esa es una mala alternativa para entender realmente lo que estás haciendo. James K Polk

Tu respuesta

3   la respuesta
1

Por lo que sé,AES essimétrico algoritmo de cifrado, es decir, solo necesita una clave para el cifrado / descifrado.

Desde el JavaDocof java.security.KeyPairGenerator:

La clase KeyPairGenerator se utiliza para generar pares de claves públicas y privadas.

Lo que significa que debe ser utilizado paraasimétrico algoritmos de encriptación. porsimétrico algoritmos de encriptación uno debe usarjavax.crypto.KeyGenerator.

Sin embargo, aconsejo simplemente imitar algunos tutoriales sobre cómo cifrar / descifrar la matriz de bytes en Java utilizando AES comoéste.

Usasun.misc.Base64Encoder / Base64Decoder clases para codificar / decodificar la matriz de bytes a / desde la cadena, sin embargo, puede omitir este paso.

Espero que esto ayude

¡Muy útil! ¡Gracias! Mirará en ella .. user1406126
2

AES es un algoritmo simétrico, de ahí que utilicenKeyPairGenerator no es apoyado. Para generar una clave con AES se llama.KeyGenerator

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

Al mirar el resto de su código, parece que está tratando de lograr un cifrado asimétrico (ya que llamagetPublic() and getPrivate() etc), por lo que le aconsejo que cambie a utilizar RSA o cualquier otro algoritmo asimétrico que soporte Java. Usted probablemente solo necesita reemplazarAES conRSA en tusgetInstance(); llamadas, y quizás algún ajuste fino. Buena suerte

¡Gracias! Eso hizo el truco! user1406126
0

¿Cómo se puede usar un generador de par de llaves para AES? AES es un algoritmo de clave simétrica. Refiera esto enlazar. Eso significa que si encripta los datos usando una clave "k", entonces tendrá que descifrarlos también usando la misma clave "k".

Pero cuando genera un par de claves, como sugiere su nombre, se generan dos claves y si encripta usando una de las claves, puede desencriptar solo usando la otra clave. Esta es la base paraPKI.

Si quieres usar el generador de par de llaves usa un algoritmo como"rsa" o"dsa" en elgetInstance() método como este:

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

Creo que su código ahora debería funcionar bien después de hacer el cambio anterior.

@ usuario1406126: debe estar usando una clave de 1024 bits. ¿Son sus datos muy grandes? Si no es muy grande y está dentro de los 245 bytes, puede usar una clave de 2048 bits. Ashwin
¡Gracias! Originalmente, usé RSA para KeyPairGenerator; sin embargo, recibí el error 'Los datos no deben tener más de 117 bytes', por lo tanto, cambié a AES. Cambiaré al cifrado simétrico en su lugar user1406126

Preguntas relacionadas