Вопрос по aes, java, key, encryption, file – AES KeyPairGenerator не распознан

2

У меня проблема с моим кодом 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 »);».

Возможно связано сstackoverflow.com/questions/1760785/… Nathan Ryan
Просто продолжайте пробовать случайные алгоритмы, пока что-нибудь не заработает? Это плохая альтернатива реальному пониманию того, что вы делаете. James K Polk

Ваш Ответ

3   ответа
2

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(); звонки, и, возможно, некоторые тонкой настройки. Удачи

Спасибо! Это сделало трюк! user1406126
0

Как вы можете использовать генератор пар ключей для AES? AES - алгоритм симметричного ключа. Отослать это ссылка на сайт, Это означает, что если вы шифруете данные с помощью ключа «k», то вам придется дешифровать их также с помощью того же ключа «k».

Но когда вы генерируете пару ключей, как следует из названия, генерируются два ключа, и если вы шифруете с помощью одного из ключей, вы можете расшифровать только с помощью другого ключа. Это база дляИПК.

 Если вы хотите использовать генератор пар ключей, используйте алгоритм вроде"rsa" или же"dsa" вgetInstance() метод как это:

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

Я думаю, что ваш код теперь должен работать нормально после внесения вышеуказанных изменений.

@ user1406126: вы должны использовать 1024-битный ключ. Ваши данные очень большие? Если он не очень большой и находится в пределах 245 байт, вы можете использовать 2048-битный ключ.
Спасибо! Первоначально я использовал RSA для KeyPairGenerator, однако получил «данные не должны быть длиннее 117 байт»; ошибка, следовательно, я перешел на AES. Я переключусь на симметричное шифрование вместо user1406126
1

AES являетсяsymmetric алгоритм шифрования, т. е. для шифрования / дешифрования нужен только один ключ.

Из JavaDocof java.security.KeyPairGenerator:

The KeyPairGenerator class is used to generate pairs of public and private keys.

Это означает, что он должен быть использован дляasymmetric алгоритмы шифрования. Заsymmetric алгоритмы шифрования следует использоватьjavax.crypto.KeyGenerator.

Тем не менее, я советую просто подражать некоторому учебнику о том, как зашифровать / расшифровать массив байтов в Java, используя AES, напримерэтот.

Оно используетsun.misc.Base64Encoder / Base64Decoder классы для кодирования / декодирования байтового массива в / из String, однако вы можете пропустить этот шаг.

Надеюсь это поможет

Очень полезно! Спасибо! Посмотрим на это .. user1406126

Похожие вопросы