Pergunta sobre key, encryption, file, aes, java – AES KeyPairGenerator não reconhecido

2

Eu tenho um problema com o meu código java. Estou tentando criptografar um arquivo. No entanto, quando executo meu código java, recebo "java.security.InvalidKeyException: comprimento de chave AES inválido: 162 bytes".

Aqui está o 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();

O erro ocorre na linha "KeyPairGenerator keyGen = KeyPairGenerator.getInstance (" AES ");"

Apenas continue tentando algoritmos aleatórios até que algo funcione? Essa é uma alternativa ruim para realmente entender o que você está fazendo. James K Polk
Possivelmente relacionado astackoverflow.com/questions/1760785/… Nathan Ryan

Sua resposta

3   a resposta
0

mo de chave simétrica. Referir isto ligação. Isso significa que, se você criptografar dados usando uma chave "k", você terá que descriptografá-los usando a mesma chave "k".

Mas quando você gera o par de chaves, como o nome sugere, duas chaves são geradas e se você criptografar usando uma das chaves, você pode descriptografar somente usando a outra chave. Esta é a base paraPKI.

Se você quiser usar o gerador de keypair, use um algoritmo como"rsa" ou"dsa" nogetInstance() método como este:

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

Eu acho que seu código agora deve funcionar bem depois de fazer a alteração acima.

Obrigado! Originalmente, eu usei o RSA para o KeyPairGenerator, mas recebi um erro 'Os dados não devem ter mais de 117 bytes', portanto mudei para o AES. Eu mudarei para criptografia simétrica user1406126
@ user1406126: você deve usar a chave de 1024 bits. Seus dados são muito grandes? Se não for muito grande e estiver dentro de 245 bytes, você poderá usar uma chave de 2048 bits. Ashwin
1

AES ésimétrico algoritmo de criptografia, ou seja, ele precisa de apenas uma chave para criptografia / descriptografia.

Do JavaDocof java.security.KeyPairGenerator:

A classe KeyPairGenerator é usada para gerar pares de chaves públicas e privadas.

Significa que deve ser usado paraassimétrico algoritmos de criptografia. Parasimétrico algoritmos de criptografia deve-se usarjavax.crypto.KeyGenerator.

No entanto, eu aconselho simplesmente imitando algum tutorial sobre como criptografar / descriptografar a matriz de bytes em Java usando AES comoeste.

Usasun.misc.Base64Encoder / Base64Decoder classes para codificar / decodificar a matriz de bytes para / from String, no entanto, você pode pular esta etapa.

Espero que isto ajude

Muito útil! Obrigado! Vai olhar para isso .. user1406126
2

portanto, eles usamKeyPairGenerator não é suportado. Para gerar uma chave com o AES, você chamaKeyGenerator

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

Ao olhar para o resto do seu código, parece que você está tentando obter criptografia assimétrica (desde que você chamagetPublic() and getPrivate() etc), então eu aconselho você a usar o RSA ou qualquer outro algoritmo assimétrico suportado pelo java. Você vai mais likley só precisa substituirAES comRSA na tuagetInstance(); chama, e talvez alguns ajuste fino. Boa sorte

Obrigado! Isso fez o truque! user1406126

Perguntas relacionadas