Pytanie w sprawie file, aes, encryption, key, java – AES KeyPairGenerator nie rozpoznany

2

Mam problem z moim kodem java. Próbuję zaszyfrować plik. Jednak po uruchomieniu kodu java otrzymuję „java.security.InvalidKeyException: Niepoprawna długość klucza AES: 162 bajty”.

Oto kod:

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

Błąd występuje w wierszu „KeyPairGenerator keyGen = KeyPairGenerator.getInstance („ AES ”);”.

Prawdopodobnie związane zstackoverflow.com/questions/1760785/… Nathan Ryan
Po prostu próbuj losowych algorytmów, dopóki coś nie zadziała? To słaba alternatywa dla zrozumienia tego, co robisz. James K Polk

Twoja odpowiedź

3   odpowiedź
1

AES jestsymetryczny algorytm szyfrowania, tzn. potrzebuje tylko jednego klucza do szyfrowania / deszyfrowania.

Z JavaDocof java.security.KeyPairGenerator:

Klasa KeyPairGenerator służy do generowania par kluczy publicznych i prywatnych.

Oznacza to, że powinien być używanyasymetryczny algorytmy szyfrowania. Dlasymetryczny należy użyć algorytmów szyfrowaniajavax.crypto.KeyGenerator.

Jednak radzę po prostu naśladować samouczek dotyczący szyfrowania / deszyfrowania tablicy bajtów w Javie za pomocą AESten.

To używasun.misc.Base64Encoder / Base64Decoder klasy do kodowania / dekodowania tablicy bajtów do / z ciągu znaków, jednak możesz pominąć ten krok.

Mam nadzieję że to pomoże

Bardzo przydatne! Dzięki! Zajrzę w to .. user1406126
0

klucza symetrycznego. Zapoznaj się z tym połączyć. Oznacza to, że jeśli szyfrujesz dane za pomocą klucza „k”, będziesz musiał je odszyfrować również przy użyciu tego samego klucza „k”.

Ale gdy generujesz parę kluczy, jak sugeruje nazwa, generowane są dwa klucze i jeśli zaszyfrujesz je za pomocą jednego z kluczy, możesz odszyfrować tylko przy użyciu drugiego klucza. To jest podstawa dlaPKI.

Jeśli chcesz użyć generatora pary klawiszy, użyj algorytmu takiego jak"rsa" lub"dsa" wgetInstance() taka metoda:

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

Myślę, że twój kod powinien teraz działać poprawnie po wprowadzeniu powyższej zmiany.

Dzięki! Pierwotnie użyłem RSA dla KeyPairGenerator, ale otrzymałem błąd „Dane nie mogą być dłuższe niż 117 bajtów”, dlatego przełączyłem się na AES. Zamiast tego przejdę do szyfrowania symetrycznego user1406126
@ user1406126: musisz używać klucza 1024-bitowego. Czy twoje dane są bardzo duże? Jeśli nie jest zbyt duży i mieści się w 245 bajtach, możesz użyć klucza 2048-bitowego. Ashwin
2

dlatego używająKeyPairGenerator nie jest wspierany. Aby wygenerować klucz za pomocą AES, zadzwońKeyGenerator

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

Patrząc na resztę kodu, wygląda na to, że próbujesz uzyskać asymetryczne szyfrowanie (ponieważ dzwoniszgetPublic() and getPrivate() itd.), więc radzę przejść do korzystania z RSA lub innego asymetrycznego algorytmu obsługiwanego przez java. Najbardziej lubisz tylko wymienićAES zRSA w TwoimgetInstance(); wywołania, a może nawet dostrojenie. Powodzenia

Dzięki! To załatwiło sprawę! user1406126

Powiązane pytania