Pozwól mi zacząć od stwierdzenia, że jestem niezmiernie nowy w tym wszystkim. Próbuję użyć gpg z poziomu Javy w celu odszyfrowania zaszyfrowanego pliku.Uzyskiwanie deszyfrowania GPG do pracy w Javie (Bouncy Castle)
Co robiłem z powodzeniem:
Gdyby kolega zaszyfrować plik, używając swojego klucza publicznego i klucza prywatnego i jego powodzeniem rozszyfrował go.
Went inny sposób
miał inny kolega starają się odszyfrować plik, który nie był dla niego nie (zgodnie z oczekiwaniami)
Mój klucz został wygenerowany w ten sposób ...
(gpg --version mi mówi, używam 1.4.5 i używam nadmuchiwany zamek 1,47)
gpg --gen-magicznych
Wybierz opcję "DSA i Elgamal (domyślnie)"
Wypełnij pozostałe pola i wygeneruj klucz.
Plik został zaszyfrowany przy użyciu mojego klucza publicznego i tajnego klucza innego użytkownika. Chcę ją odszyfrować. Napisałem następujący kod Java, aby to osiągnąć. Używam kilku przestarzałych metod, ale nie mogę wymyślić, jak poprawnie wdrożyć metody fabryczne wymagane do użycia nie-przestarzałych wersji, więc jeśli ktoś ma pomysł na implementacje tych, których powinienem używać, byłby to miły bonus.
Security.addProvider(new BouncyCastleProvider());
PGPSecretKeyRingCollection secretKeyRing = new PGPSecretKeyRingCollection(new FileInputStream(new File("test-files/secring.gpg")));
PGPSecretKeyRing pgpSecretKeyRing = (PGPSecretKeyRing) secretKeyRing.getKeyRings().next();
PGPSecretKey secretKey = pgpSecretKeyRing.getSecretKey();
PGPPrivateKey privateKey = secretKey.extractPrivateKey("mypassword".toCharArray(), "BC");
System.out.println(privateKey.getKey().getAlgorithm());
System.out.println(privateKey.getKey().getFormat());
PGPObjectFactory pgpF = new PGPObjectFactory(
new FileInputStream(new File("test-files/test-file.txt.gpg")));
Object pgpObj = pgpF.nextObject();
PGPEncryptedDataList encryptedDataList = (PGPEncryptedDataList) pgpObj;
Iterator objectsIterator = encryptedDataList.getEncryptedDataObjects();
PGPPublicKeyEncryptedData publicKeyEncryptedData = (PGPPublicKeyEncryptedData) objectsIterator.next();
InputStream inputStream = publicKeyEncryptedData.getDataStream(privateKey, "BC");
Więc kiedy uruchomić ten kod Uczę się, że mój algorytm i format są następujące dla mojego tajnego klucza:
Algorytm: DSA Format: PKCS # 8
A potem rozkłada na ostatnia linia:
Exception in thread "main" org.bouncycastle.openpgp.PGPException: error setting asymmetric cipher
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder.decryptSessionData(Unknown Source)
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder.access$000(Unknown Source)
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder$2.recoverSessionData(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at TestBouncyCastle.main(TestBouncyCastle.java:74)
Spowodowany przez: java.security.InvalidKeyException: nieznany typ klucz przeszedł do ElGamal na org.bouncyc astle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit (Nieznane źródło) at org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit (Nieznane źródło) na javax.crypto.Cipher.init (DashoA13 * ..) na javax.crypto.Cipher.init (DashoA13 * ..) ... 8 więcej
Jestem otwarty na wiele sugestii tutaj, ze „nie używać GPG, użyj zamiast x "do" nie używaj dmuchanego zamku, użyj x zamiast "do dowolnego miejsca pomiędzy. Dzięki!
+1 Ewwwwwwwwwwwwwwww;) –
-1 Z oczywistych powodów. Ponadto hasło może być widoczne dla każdego, kto przegląda listę aktywnych procesów podczas połączenia i może również znaleźć się w dzienniku systemowym. – user359996