2017-02-16 113 views
8

Pracuję nad aplikacją Node, w której zbudowałem funkcję rozszyfrowującą, i użyłem modułu npm Openpgp.js, aby to działało. Biorę różne przesłane pliki klienta PGP utworzone za pomocą naszego klucza publicznego, odszyfrowuję je przy użyciu naszego klucza prywatnego, kiedy je wprowadzam, i umieszczam odszyfrowane wersje w folderze, do którego mam dostęp, a wszystko wydaje się być dobrze ... ponieważ pliki są zbrojone. Oto kilka przykładowych linii kodu przedstawiający kolejność zdarzeń:Odszyfruj niepancerne pliki PGP za pomocą OpenPGP.js

const encryptedData = fs.readFileSync(encryptedFilePath, 'utf8') 
openpgp.decrypt({ 
     message: openpgp.message.readArmored(encryptedData), 
     publicKeys, 
     privateKey 
}).then((decrypted) => { fs.writeFile(decryptedFilePath, decrypted.data }) 

Gdy plik opancerzony przychodzi poprzez, wszystko jest dobrze i mam plik odszyfrowane w określonym folderze. Pliki te po otwarciu w edytorze tekstu są sformatowane tak:

-----BEGIN PGP MESSAGE----- 
WBh2X7KwfEBDx0LEE1FzlnvxZs44o62FclpTazJpcl9J7DjwVfg9cHCID0TAN6Y6 
B3b5bCQQFe1wTgpIkVtd0mFGQx7KGHj4FGte53qseVxC2bfq9PGKRIAUg6olr+82 

jednak mamy klientów, że szyfrowanie plików z opcją opancerzonego off, więc oni są w formacie szesnastkowym typu po otwarciu w edytorze tekstowym. ...

7403 436d e6c0 f941 daac 945b 9a81 f066 
6cd2 0032 5df0 9ca2 23a0 6eec a7bb f24c 
a941 99a8 1053 ae23 f88b 245c f709 c2b2 

..... lub jako zakodowane pliki tekstowe, które wyglądają tak:

DµÉ‰í+�3K€Ð�˜PªeZ_|Ò®ó0��ãZqRµ3!ŒpuÉW�NZrìÚk´ 
Aˆ›œiêø8�Ú�ól:äΟ”�6‡) 
w�¬ÌŒWÝÚ¢�Q��œ�œ?�H¨¿�œ//�ÃBA�´>(%°�e� 

(te dwa ostatnie przypominają to, co widzę, kiedy pocieszyć log „encryptedData” powyżej w mój dorsz e przykład.)

Za każdym razem, gdy pojawiają się pliki nie zbrojone, proces się nie powiedzie i początkowo dostałem kilka różnych błędów w zależności od typu pokazanego powyżej. Zabrałem kodowanie "utf8" na fs.readFileSync i wstawiłem "fromBinary" zamiast "readArmored", aby pracować z danymi jako binarne myślenie, które może działać, ale wtedy dostaję błędy o "Invalid session key deszyfrowanie". Tak więc próbowałem użyć funkcji "decryptSessionKey" przed głównym deszyfrowaniem, jak to pokazuje w dokumentach, i to dostaje mi niezdefiniowany klucz i błąd o "Nie znaleziono symetrycznie zaszyfrowanego pakietu kluczy sesji". Poza tym, prawdopodobnie wypalam złe drzewo, ponieważ używanie binarnego z Openpgp.js wydaje się wymagać hasła, które, jak sądzę, jest inne niż hasło, które odblokowuje mój klucz prywatny, który jest jedynym hasłem, jakie mam.

Przeszukałem całą dokumentację Openpgp.js i wyszukałem go jak szalonego, ale nie mogę znaleźć solidnej procedury, jak zmienić mój kod, który działa dla plików zbrojnych ASCII w celu odszyfrowania plików, które nie są zbrojone. (Jednak każdy pojedynczy plik odszyfrowuje szybko i bezbłędnie podczas korzystania z programu odszyfrowującego na pulpicie, takiego jak PGP Desktop, więc nie wiem, gdzie jest moja rozbieżność i dlaczego rozwiązanie nie jest oczywiste.) Każdy ma jakiekolwiek doświadczenie z tym lub możliwym rozwiązaniem?

+0

[Ta odpowiedź] (http://stackoverflow.com/a/33690541/1735215) na bardzo podobne pytanie (do którego jest prawdopodobnie duplikatem) sugeruje użycie 'openpgp.message.fromBinary()' zamiast ' openpgp.message.readArmored() '. Nie mam większego doświadczenia w JavaScript, ale uważam, że możesz zrobić "spróbuj { message = openpgp.message.readArmored (encryptedData); } catch (err) { message = openpgp.message.fromBinary (encryptedData); } 'przed wywołaniem funkcji' openpgp.decrypt() 'w' message'. – 0range

+0

Dziękuję za odpowiedź, mimo że widziałem ten wpis, z którym byłeś powiązany, i to nie pomaga. Kiedy używam "fromBinary", otrzymuję komunikat "data musi być w formacie Uint8array", ponieważ przekazuję go z ciągiem utf-8. Jeśli skonwertuję ciąg znaków na Uint8 za pomocą narzędzia openpgp, a następnie przekazuję dane, pojawia się kolejny błąd: "Błąd odszyfrowania wiadomości: Nieprawidłowy klucz sesji do odszyfrowania." Ponownie, są to pliki, które mogę po prostu przenieść do PGP Desktop i od razu odszyfrowują. Musi być jakiś trik, którego mi brakuje ... – threepears

Odpowiedz

1

Non-pancerna wersja openpgp.message.readArmored() jest openpgp.message.read()

Więc coś jak to powinno działać:

const encryptedData = fs.readFileSync(encryptedFilePath, 'utf8') 

if encryptedData.startsWith('-----BEGIN PGP MESSAGE-----') 
    encryptedMessage = openpgp.message.readArmored(encryptedData) 
else 
    var TextEncoder = require('text-encoding').TextEncoder; 
    var encryptedUint8 = new TextEncoder().encode(encryptedData); 
    encryptedMessage = openpgp.message.read(encryptedUint8) 

openpgp.decrypt({ 
    message: encryptedMessage, 
    publicKeys, 
    privateKey 
}).then((decrypted) => { fs.writeFile(decryptedFilePath, decrypted.data }) 

(nie jest wymagane tutaj Linia var TextEncoder jeśli załadować TextEncoder wcześniej w kodzie)

+0

Dziękuję za odpowiedź! Próbowałem tego i, jak się obawiałem, to działa dobrze dla plików zbrojonych, ale pozostałe pliki nadal nie są w stanie go wykonać. Z każdym, który nie jest zbrojony, pojawia się błąd o nazwie "TypeError: input.subarray nie jest funkcją". Mogę dać ci ślad stosu, jeśli to pomaga, ale ostatni element to "w Object.read (/Users/......./openpgp/dist/openpgp.js:16777:61)" Jeśli masz jakieś dalsze sugestie jak rozwiązać ten błąd, chciałbym je usłyszeć, ponieważ spędziłem sporo czasu próbując to zrozumieć i to wciąż jest tajemnicą ..... – threepears

+0

@ threepears - Przepraszam, w mojej wersji w dokumentacji nie zwracałem uwagi na metodę 'read()' przyjmującą argument typu 'Uint8array'. Dodam krok konwersji w ... – Stobor