Шифрование файла с помощью Nodejs (Crypto) выдает ошибку: плохое декодирование base64

Привет и извините, если мой вопрос глупый, я только начинаю работать с nodejs и приношу тяжелый багаж из мира PHP.

Я пытаюсь зашифровать файл с помощью открытого ключа, сгенерированного через командную строку Linux с помощью команды GnuPG.

В своем приложении я использую Express, fs и Crypto для создания буфера из файла и получения содержимого открытого ключа, а затем использую publicEncrypt для получения зашифрованных данных.

Когда я это делаю, приложение останавливается и выдает ошибку, жалующуюся на формат PEM: плохое декодирование base64.

Error: error:0906D064:PEM routines:PEM_read_bio:bad base64 decode

Здесь у вас есть основные части этого кода:

var encryptStringWithRsaPublicKey = function(toEncrypt, relativeOrAbsolutePathToPublicKey) {
var absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey);
var publicKey = fs.readFileSync(absolutePath, "utf8");
if(typeof toEncrypt !=='object') return false;
var buffer = new Buffer(toEncrypt);
console.log(publicKey);
var encrypted = crypto.publicEncrypt(publicKey, buffer);
return encrypted.toString("base64");

};

        fs.readFile(req.files[0].path, function (err, data){
            var encrypted = encryptStringWithRsaPublicKey(data, '/home/app/data/pub_key.txt');
            if(!encrypted) {
                fs.writeFile("/home/app/data/uploads/enc1/test.pdf", encrypted, function(err) {
                    if(err) {
                        return console.log(err);
                    }

                    console.log("The file was saved!");
                    res.end(req.files[0].filename);
                }); 
            }
            else {
                res.end({error:'encryption failed. all data deleted.'});
            }
        });

Может быть, в открытом ключе где-то есть неверные символы в конце строки, или, может быть, Crypto требует особого формата?

Это содержимое ключа паба:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

mQENBFiFz2ABCADGk6E2IgbaGYIHO7EVNotxiDjB4k5UZJ4xx41RwY9LeG0c+SLW
rC/ijPFJZ/kN3nrpvTAZEYpnK51olqvw/OOgt5p3k32mW47HALx91vU9WRrykt2Y
DMj+aeMDi5QZnda8qTnWCW3E+OBg4W0ZdpwPs+eOyHWRjp6zuBFxZfrtKQuFlzHs
6KKczdGidemUQCZL7ve34EQmgeh4rDJ1oNC8QzSFOYZHiSVQDXGvZSFirc3OMZus
JiflY1Al3Y0fJj2m8catu/i9bKfAPA+YE+yU86BrgV05Skn82px2K3coiI/+eSjp
j/ROxijvwzLf/F98B3/AiMJjx8pD/9APmnSbABEBAAG0MVBheSBGaWxlIChDdWJl
IEluc3BpcmUpIDxwYXlmaWxlQGN1YmVpbnNwaXJlLmNvbT6JATgEEwECACIFAliF
z2ACGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEBeEp+MzfXEgefgH/0bJ
Oug/m66vlENqR+y6Z+mbC7RzFnhvojJ51EB6JlJe9EJ2VwtcirxorY5zL9DjTyB2
ys/kzdeN0+FmuIIO0To7ksB1ASZ5jsg1UdQEvLuLeSZSJRzbmz9M7jvxEfR+vz0h
RJPqs6EfgAOtRyDs8C/IXyWTrhu1wI+09CChjBH0/tCJ2sO074f4xMY1IYzf8nm7
ohuiGpN1egHOVjIjIajpmb94dGBXnbGNq/tzNwGZu9GUtaeTs3+kuqqy0+eIQDvR
7AU4Gt43etwpFz4dbWVDd77OxKUFshilaChIAwGmngfFn3ksnrl/AZVsGIJrxmy0
ja5t+yZOwl7KdC82SOa5AQ0EWIXPYAEIAOHRdsrEm/WFG3Fps++Mo6xUf/CFTyz3
WQr2nkOoBxAzcHPQd/3muDNKUblRhxZMrwuVZcnOZVOOz9rMqaM5kYSAB84PpVpG
26QcYFUn5WCmR3KSn9MiKqtSFJDn695ysaCdzzEW5Y/eKgxydG4rhFOy07VcKTev
dBC19XcukjxAbzmnZ7qUFhaRrS2u11mA+s0FmRz+EVOd0uxQdJq/Lps1nMvZ3UfL
saHJuBDgX+gCarbt+7uSx3aC/jBDzrq63Ry7nqN5mypSMRBeEAmi7kKToIRDj0Uj
xwqCgU4NVj8zCG2iBlOzrfKPk9oMLgHBvMPQYDW9wLz5rQnoVr4RkrUAEQEAAYkB
HwQYAQIACQUCWIXPYAIbDAAKCRAXhKfjM31xIBDYB/0VTjC/zvFHJwD5t+8DzHjN
UqPg7Mk0kYbu6dyPYb0/S2G5uZa3LoJ99EgOhgFlfUHM9k0GBC0OTxKiUEqKtENH
+W/wBouTltqGGyzDit+KlqzKz9gsyWF/HO3GTg1Df9D8o3MhUHRGjEeuik0BbJyd
Hy4YfDk5a4qUYtFztbmUSxVqdLlFBZ7oMn3n+A25HaDtohv9g1ZC3gTLD+yTTMsG
ruOEs6ZMIOENn6pgsjFdMIUmJVP3tt9n538jVfbVf7EgTrPt+JKjoQF3EfTysTnO
Y0IuotQuA83+5Fa6IY+iFLLvkNABr1WACVOKMUzBJJJG7EnlvgPufZL3eJE4LUZ9
=rpky
-----END PGP PUBLIC KEY BLOCK-----

person Sergio Garcia    schedule 24.01.2017    source источник
comment
Данные, такие как содержимое файлов, обычно шифруются с помощью симметричных алгоритмов, таких как AES, которые не имеют ограничений по размеру данных. Асимметричное шифрование, такое как RSA, обычно используется для шифрования симметричных ключей, а размер данных ограничен размером меньше размера ключа.   -  person zaph    schedule 24.01.2017
comment
Проверьте документацию по CryptoJS — он может ожидать ключ RSA и не сможет обработать комментарий к версии GPG (который не закодирован в Base64).   -  person Andy    schedule 25.01.2017


Ответы (1)


Я нашел решение своей проблемы.

На самом деле метод publicEncrypt является оболочкой OpenSSL, а затем он ожидает открытый/закрытый ключ в этом формате. Ключ от GPG не подойдет.

Создав закрытый и открытый ключи с помощью следующей команды, код работает так, как ожидалось:

$ openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
$ openssl rsa -pubout -in private_key.pem -out public_key.pem
person Sergio Garcia    schedule 27.01.2017