Ошибка проверки подписи PyCrypto с другими языками - PullRequest
0 голосов
/ 19 февраля 2019

Я пытался создать подпись, чтобы отправить зашифрованное сообщение на сервер.Но сервер не может проверить подпись.Точно так же я не могу проверить подпись, отправленную сервером.

Мой код написан на python2.7, и я использую библиотеку PyCrypto.Серверный код находится в .NET.

Мне кажется, что-то не так с PyCrypto.Модуль RSACryptoServiceProvider в .NET не может проверить подпись.Я также использовал JSEncrypt из JavaScript, но также не смог проверить подпись, созданную PyCrypto.

Ниже приведен мой код:

from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as SignaturePKCS1_v1_5
from Crypto.Hash import SHA256
from base64 import b64encode, b64decode


def signEncryptedDataWithSHA256(Encrypted_Data, privateKey):
  h = SHA256.new(Encrypted_Data)
  signer = SignaturePKCS1_v1_5.new(privateKey)
  signature = signer.sign(h)
  return signature

def verifySignatureWithSHA256(Encrypted_Data, signature, publicKey):
  h = SHA256.new(Encrypted_Data)
  verifier = SignaturePKCS1_v1_5.new(publicKey)
  if verifier.verify(h, signature):
    return True
  else:
    return False

#private-public keypair has been generated using following OpenSSL command:
#openssl req -newkey rsa:4096 -nodes -keyout PrivateKey.pem -x509 -days 1095 -out certificate.pem
#openssl x509 -pubkey -noout -in certificate.pem  > PublicKey.pem
rsa_private_key = RSA.importKey(open("files/PrivateKey.pem", "rb").read())
rsa_public_key = RSA.importKey(open("files/PublicKey.pem", "rb").read())


# to send message to server:
data = <some-string> #for e.g., data = 'Q\xd4#\xc8\x1a\xf1)\x1cUq\xe5\x06\xae\xdcW\x93' (it is output of AES encryption)
signedData = signEncryptedDataWithSHA256(data, rsa_private_key)
body = {            #this body is sent to server
  "Data": b64encode(data),
  "Sign": b64encode(signedData)
}

# after receiving response from server
'''
server_data = data received from server
server_sign = sign received from server
server_pub_key = server's public key
'''
verfied = verifySignatureWithSHA256(b64decode(server_data),b64decode(server_sign),server_pub_key)

Пожалуйста, помогите мне решить эту проблему.Я застрял с этим с последних 20 дней.

ОБНОВЛЕНИЕ: [Добавление кода .NET, работающего на стороне сервера]

Функция, используемая для генерации подписи:

public byte[] SignData(byte[] input, string private_key)
{
    byte[] encryptedSignedBytes;
    using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider(2048))
    {
        provider.FromXmlString(private_key);
        encryptedSignedBytes = provider.SignData(input, new SHA256CryptoServiceProvider());
    }
    return encryptedSignedBytes;
}

Вышеуказанная функция, вызываемая в подписи, отправляется следующим образом: Convert.ToBase64String(<claa-obj-name>.SignData(Encoding.UTF8.GetBytes(Data), PrivateKey))

Функция, используемая для проверки подписи:

public bool VerifySignData(byte[] input, byte[] signInput, string partnerPublic_key)
{
    bool retunValue = false;
    using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider())
    {
        provider.FromXmlString(partnerPublic_key);
        retunValue = provider.VerifyData(input, new SHA256CryptoServiceProvider(), signInput);
    }
    return retunValue;
}

Вышеуказанная функция вызывается следующим образом: VerifySignData(Encoding.UTF8.GetBytes(cninfo.Request.Data),Convert.FromBase64String(Sign), PublicKey)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...