Rsa operation error

With the 1.0.2j/1.1.0b openssl built in subdirectories using "./config; make" I can use the roundtrip script in the attached zipfile to encrypt a file with a public key derived from the i...

With the 1.0.2j/1.1.0b openssl built in subdirectories using «./config; make» I can use the roundtrip script in the attached zipfile to encrypt a file with a public key derived from the included private key, then decrypt using the private and finally compare the output to the plaintext (in raw mode (-r) at least).

If the openssl binary used is openssl 1.0.1t (say) all is well. However the machines with cpuinfo attached in the zipfile as E7450.cpuinfo and PavillionGaming.cpuinfo show errors for versions 1.0.2j & 1.1.0b.:

$ LD_LIBRARY_PATH=$(pwd)/openssl-1.1.0b ./roundtrip rsa.key openssl-1.1.0b/apps/openssl RSA operation error 140193654368000:error:0407109F:rsa routines:RSA_padding_check_PKCS1_type_2:pkcs decoding error:crypto/rsa/rsa_pk1.c:243: 140193654368000:error:04065072:rsa routines:rsa_ossl_private_decrypt:padding check failed:crypto/rsa/rsa_ossl.c:477: cmp: EOF on rsa.output
and $ OPENSSL_CONF=openssl-1.0.2j/apps/openssl.cnf ./roundtrip rsa.key openssl-1.0.2j/apps/openssl RSA operation error 140062524487320:error:0407109F:rsa routines:RSA_padding_check_PKCS1_type_2:pkcs decoding error:rsa_pk1.c:273: 140062524487320:error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed:rsa_eay.c:602: cmp: EOF on rsa.output
Using the machine described by E5-2670v2.cpuinfo results in the same invocations succeeding.
If I replace the file crypto/bn/asm/x86_64-mont.pl with the same file taken from the openssl 1.0.1 release then the problem is solved. By using different openssl executables for the encrypt/decrypt step I was able to see that it is the encryption step that is wrong in the affected version/machines.
Using the -r switch to roundtrip causing «raw» encryption to be used rather than PKCS#1, with the result that the output file does not match the plaintext: i.e. it’s not a problem with the padding code.
Not every RSA key causes the failure, however I with different RSA keys I was seeing errors approximately 50% of the time.

rsa_encrypt.zip

Перевод: Encrypt and decrypt files to public keys via the OpenSSL Command Line
Автор: Реми ван Элст (Remy van Elst)

Содержание

  1. Получение публичного ключа
  2. Создание случайного файла пароля
  3. Шифрование файла случайным ключом
  4. Шифрование случайного ключа файлом публичного ключа
  5. Расшифровывание случайного ключа при помощи файла своего приватного ключа
  6. Расшифровывание большого файла случайным ключом

Этот небольшой рецепт показывает, как использовать openssl из командной строки для шифрования файла публичным ключом и расшифровывания файла. Сначала мы создадим случайный ключ, зашифруем этот случайный ключ публичным ключом другого человека и с помощью этого случайного ключа зашифруем сам файл, используя симметричное шифрование.

Из-за особенностей алгоритма RSA, с его помощью невозможно шифровать большие файлы. Если создать ключ из n бит, то шифруемый файл не должен быть больше чем (n минус 11) бит. Наиболее эффективное использование RSA — шифрование случайного пароля, с последующим шифрованием файла паролем с помощью алгоритма симметричного шифрования. Если файл больше, чем размер ключа, то команда шифрования завершится ошибкой:

RSA operation error: 020:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:.cryptorsarsa_pk1.c:151:

Создадим случайный файл и используем его в качестве ключа для шифрования большого файла алгоритмом симметричного шифрования. Этот случайный файл выполнит роль пароля, который мы сообщим. Большой файл зашифруем маленьким файлом, выступающим в роли пароля. Затем отправим зашифрованный файл и зашифрованный ключ получателю, а он сможет расшифровать ключ своим приватным ключом и использовать этот ключ для расшифровывания большого файла.

Для работы с ключами RSA используются следующие команды:

  • openssl genrsa: Создание приватных ключей RSA.
  • openssl rsa: Управление приватными ключами RSA (включая создание публичного ключа из приватного).
  • openssl rsautl: Шифрование и расшифровывание файлов ключами RSA.

Ключ — это просто строка случайных байтов. Воспользуемся строкой из 128 байтов, из которых в результате кодирования base64 получится 175 символов. Поскольку 175 символов — это 1400 бит, ключ получится достаточно маленьким, чтобы можно было зашифровать его при помощи RSA.

Получение публичного ключа

Попросите получателя отправить вам его сертификат или публичный ключ. Если он отправил сертификат, можно извлечь из него публичный ключ с помощью следующей команды:

openssl rsa -in certificate.pem -out publickey.pem -outform PEM -pubout

Создание случайного файла пароля

Воспользуемся следующей командой, чтобы создать случайный ключ:

openssl rand -base64 128 -out key.bin

Делайте это при каждом шифровании файла. Каждый раз используйте новый ключ!

Шифрование файла случайным ключом

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

openssl enc -aes-256-cbc -salt -in largefile.pdf -out largefile.pdf.enc -pass file:./bin.key

Размер файла вырастет ненамного:

$ ls -larth
-rw-r--r-- 1 user group 40M Nov 9 21:14 Linux-Voice-Issue-020.pdf
-rw-r--r-- 1 user group 40M Nov 9 22:03 Linux-Voice-Issue-020.pdf.enc

Однако, он зашифрован:

$ file Linux-Voice-Issue-020.pdf
Linux-Voice-Issue-020.pdf: PDF document, version 1.4

$ file Linux-Voice-Issue-020.pdf.enc
Linux-Voice-Issue-020.pdf.enc: data

Шифрование случайного ключа файлом публичного ключа

Воспользуемся следующей командой для шифрования файла случайного ключа публичным ключом получателя:

openssl rsautl -encrypt -inkey publickey.pem -pubin -in key.bin -out key.bin.enc

Теперь можно без опаски отправить получателю key.bin.enc и largefile.pdf.enc.

Полезно также подписать оба файла своим публичным ключом.

Расшифровывание случайного ключа при помощи файла своего приватного ключа

Если нужно расшифровать файл, зашифрованный описанным способом, воспользуйтесь следующей командой, указав ей свой приватный ключ (соответствующий публичному ключу, которым был зашифрован случайный ключ) для расшифровывания случайного ключа:

openssl rsautl -decrypt -inkey privatekey.pem -in key.bin.enc -out key.bin

В результате получим расшифрованный случайный ключ, которым зашифрован полученный файл.

Расшифровывание большого файла случайным ключом

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

openssl enc -d -aes-256-cbc -in largefile.pdf.enc -out largefile.pdf -pass file:./bin.key

В результате получим расшифрованный большой файл.

Доброе время суток необходима помощь в расшифровки текста или указание в ошибке выполнения задания, прохожу челендж на сайте root-me.org, где дан открытый ключ и зашифрованный текст:

-----BEGIN PUBLIC KEY-----
MGQwDQYJKoZIhvcNAQEBBQADUwAwUAJJAMLLsk/b+SO2Emjj8Ro4lt5FdLO6WHMM
vWUpOIZOIiPu63BKF8/QjRa0aJGmFHR1mTnG5Jqv5/JZVUjHTB1/uNJM0VyyO0zQ
owIDAQAB
-----END PUBLIC KEY-----

e8oQDihsmkvjT3sZe+EE8lwNvBEsFegYF6+OOFOiR6gMtMZxxba/bIgLUD8pV3yEf0gOOfHuB5bC3vQmo7bE4PcIKfpFGZBA

Используя Python и библиотеку pycrypto я вытащил из ключа модуль n:

from Crypto.PublicKey import RSA
key = RSA.importKey(open('pubkey.pem').read())
print('n = ',key.n)
print('e = ',key.e)

где n = 188198812920607963838697239461650439807163563379417382700763356422988859715234665485319060606504743045317388011303396716199692321205734031879550656996221305168759307650257059
e = 65537
Далее погуглив про факторизацию я наткнулся на RSA Factoring Challenge, где и нашёл искомый модуль, который соответствовал RSA-576 и там же находилась факторизация числа. Имея все эти данные воспользовался википедией и python реализовал вычисление секретного ключа.

def egcd(a, b):
    x,y,u,v = 0,1,1,0
    while a != 0:
        q, r = b // a, b % a
        m, n = x - u * q, y - v * q
        b,a,x,y,u,v = a,r,u,v,m,n
    return b, x, y

def modinv(e, m):
    g, x, y = egcd(e, m)
    if g != 1:
        return None
    else:
        return x % m

def pqe2rsa(p, q, e):
    n = p * q
    phi = (p - 1) * (q - 1)
    d = modinv(e, phi)
    key_params = (int(n), int(e), int(d), int(p), int(q))
    priv_key = RSA.construct(key_params)
    with open('privkey.pem', 'wb') as f:
        f.write(priv_key.exportKey())

что на выходе мне дало вот это:

-----BEGIN RSA PRIVATE KEY-----
MIIBXwIBAAJJAMLLsk/b+SO2Emjj8Ro4lt5FdLO6WHMMvWUpOIZOIiPu63BKF8/Q
jRa0aJGmFHR1mTnG5Jqv5/JZVUjHTB1/uNJM0VyyO0zQowIDAQABAkgyAw5Cxp1O
d95+I5exPbouUvLFeiBfWXP+1vh2MvU8+IhmCf9j+hFOK13x22JJ+Orwv1+iatW4
5It/qwUNMvxXS0RuItCLp7ECJQDM6VRX8SfElUbleEECmsavcGBMZOgoEBisu1OC
M7tX83puaJUCJQDzXLgl8AM5bxHxSaWaD+c9tDFiyzBbjr/tpcqEC+JMU2tqrlcC
JQCjGt8+GQD0o3YJVc05i4W3RBYC+RcqPJXHeFyieRcYjP/ZPnkCJQDVUULBTl8l
KuzJWcrk/metuJNJi925g6lMwHSBxoD4cm7HtkUCJFqWTOzCIODw7eoypcJYjm2O
/ohEsSjEXsg6Bh8mY3LunBaqiA==
-----END RSA PRIVATE KEY-----

и далее, чтобы расшифровать исходный текст я решил воспользоваться Openssl в Ubuntu

openssl rsautl -decrypt -in ciphertext -out text -inkey privkey.pem

На что мне программа говорит «Ошибка чтения входящего файла»
Либо может уже к вечеру голова не варит и я действительно какую-то примитивную вещь сделал не так нежели другого не знаю, помогите дельным советом!

Понравилась статья? Поделить с друзьями:
  • Rpgvx rtp ошибка на японском
  • Routing error uninitialized constant
  • Self protection failed error code 4 как исправить
  • Rosemount 8750 loi comm error
  • Security violation error принтер