Я пытался создать подпись, чтобы отправить зашифрованное сообщение на сервер.Но сервер не может проверить подпись.Точно так же я не могу проверить подпись, отправленную сервером.
Мой код написан на 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)