Как зашифровать данные с помощью закрытого ключа RSA (не обычной подписи) в Python? - PullRequest
1 голос
/ 17 апреля 2019

Я хочу сделать шифрование RSA с помощью закрытого ключа (не для обычной подписи), но PyCryptodome, похоже, не сможет это сделать.

Причина, по которой мне нужно сделать это с помощью закрытого ключа, заключается в том, что мне нужно получитьте же результаты, что и для не написанной мной Java-программы, которая неправильно использует javax.crypto.Cipher и закрытый ключ для подписи сообщений ...

import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import javax.crypto.Cipher;

...

String deviceKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASC...";
PKCS8EncodedKeySpec localPKCS8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decode(deviceKey).getBytes("UTF-8"));
PrivateKey localPrivateKey = KeyFactory.getInstance("RSA").generatePrivate(localPKCS8EncodedKeySpec);

byte[] hash = MessageDigest.getInstance("SHA-256").digest("test".getBytes());
Cipher localCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
localCipher.init(Cipher.ENCRYPT_MODE, localPrivateKey);
String sign = new String(Base64.encode(localCipher.doFinal(hash)));
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from Crypto.Hash import SHA256

...

deviceKey = 'MIIEvgIBADANBgkqhkiG9w0BAQEFAASC...'
privateKey = RSA.importKey(deviceKey)
hash = SHA256.new('test'.encode()).digest()
signer = PKCS1_v1_5.new(privateKey)
sign = b64encode(signer.encrypt(hash))

Результат программы Java:

  • Хэш: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

  • Знак: k8y6zMfl0KVH0W0W0W0W0W0W0W5* Результат моего скрипта Python:

    • Хэш: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

    • * 10-ю киловатт-киловатт-киловатт-киловатт1027 *

1 Ответ

1 голос
/ 02 мая 2019

Вы не используете закрытые ключи для шифрования данных.

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

Если то, что вы действительнохочу подписать ваш хэш, вместо использования функции encrypt, вы должны использовать функцию sign.

Итак, вместо

from Crypto.Cipher import PKCS1_v1_5
PKCS1_v1_5.new(privateKey).encrypt(hash)

вы можете попробовать

from Crypto.Signature import pkcs1_15
pkcs1_15.new(privateKey).sign(hash)

Я написал небольшое сообщение в блоге о подписании / проверке с использованием pycryptodome, если вы хотите взглянуть.

...