Как расшифровать файл, закодированный в mp4 PKCS8, используя закрытый ключ в node js и шифрование - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь расшифровать файл MP4, зашифрованный с помощью ключа publi c в формате pkcs8 в Node JS и секретного ключа.

Я пробовал этот код:

var decrypted = crypto.privateDecrypt({ key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING }, buffer);

Я получаю следующую ошибку:

Ошибка: ошибка: 0406506 C: подпрограммы rsa: rsa_ossl_private_decrypt: данные больше, чем mod len

I'm в настоящее время используется этот Java код, который работает. Я хотел бы перейти на Node JS

final byte[] cekWrapped = Base64.getDecoder().decode(conn.getHeaderField("x-amz-meta-x-amz-key").getBytes());
        final byte[] iv = Base64.getDecoder().decode(conn.getHeaderField("x-amz-meta-x-amz-iv").getBytes());
        // Now we need to decrypt the envelope
        Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
        cipher.init(DECRYPT_MODE, privateKey);
        final byte[] decryptedSymmetricKeyBytes = cipher.doFinal(cekWrapped);
        final SecretKeySpec cek = new SecretKeySpec(decryptedSymmetricKeyBytes, "AES");

        // Once we have the symmetric master key, we can decrypt the contents
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        try {
            cipher.init(DECRYPT_MODE, cek, new IvParameterSpec(iv));
        } catch (final InvalidKeyException e) {
            System.out.println(
                    "Invalid key exception. Please make sure that Java Cryptography Extensions with unlimited " +
                            "jurisdiction are installed");
        }
        try (final InputStream in = conn.getInputStream()) {
            try (final CipherInputStream cis = new CipherInputStream(in, cipher)) {
                try (final FileOutputStream fos = new FileOutputStream(destination.toFile())) {
                    byte[] b = new byte[1024];
                    int bytesRead;
                    while ((bytesRead = cis.read(b)) >= 0) {
                        fos.write(b, 0, bytesRead);
                    }
                }
            }
        }

1 Ответ

0 голосов
/ 12 января 2020

RSA использует сложность факторизации больших полупростых в качестве функции ловушки.

Как часть криптосистемы RSA, два простых числа генерируются при создании открытого / секретного ключа.

Мы называем два простых числа p и q. Они умножаются, образуя n, который является модулем (полу-простым).

Хотя RSA может использоваться для непосредственного шифрования данных (через c=m^e mod{n}), вы не можете зашифровать данные, большие чем модуль напрямую.

Поэтому, если вы используете 2048-bit простых чисел для генерации n, вы можете только зашифровать 4096-bit s информации непосредственно ключами (на практике даже немного меньше).

Вместо этого для больших данных вам нужно сгенерировать случайный ключ симметрии c и отправить его своему партнеру, зашифровав его своим открытым ключом RSA c, а затем использовать согласованный ключ с симметричным c шифром, подобным AES-GCM или xSalsa20.

Действительно, вы должны перейти к использованию ECDH по эллиптическим c кривым.

tldr: если вы шифруете некоторые данные с помощью RSA, где data.length> modulus.length, когда вы расшифруете его, вы получите чепуху.

...