Pergunta

Eu preciso assinar digitalmente algum texto em python usando uma chave privada armazenado em um arquivo .pem. Parece que M2Crypto é a forma preferida de fazer isso estes dias, de modo que é o que eu estou usando. Eu acho que eu recebo mais do mesmo, mas estou confuso sobre como configurar o estofamento. Para ser mais específico, eu preciso verificar a assinatura em um aplicativo para iPhone, usando um esquema de preenchimento chamado kSecPaddingPKCS1SHA1 e descrito assim:

Os dados a ser assinado é um hash SHA1. preenchimento ASN.1 padrão será feito, assim como PKCS1 preenchimento da operação RSA subjacente.

Não sendo um especialista em criptografia, tenho apenas uma idéia difusa que isso significa. Eu tentei olhar para alguns dos RFCs, mas encontrou-os impenetrável. Eu vejo que os métodos de encriptação / desencriptação de objetos RSA tomar tipos de preenchimento, mas eu não vejo nada de semelhante relacionada com a verificação de assinatura.

Qualquer ajuda, especialmente com código, será apreciado.

(Em certo sentido, isso é o inverso do esta questão .)


Ok, a resposta dada abaixo é AFAICT correta. O código a seguir gera uma assinatura para text que valida no iPhone usando o esquema kSecPaddingPKCS1SHA1 preenchimento.

from M2Crypto import EVP
privkey = EVP.load_key("privkey.pem")
privkey.sign_init()
privkey.sign_update(text)
signature = privkey.sign_final()

(Desculpe a editorialize, mas posso apenas dizer que hackers de criptografia são alguns dos lousiest escritores de documentação no universo?)

Foi útil?

Solução

AFAIK M2Crypto adiciona o preenchimento onde for necessário.

PKCS1 estofamento é o padrão.

Mas, (novamente apenas AFAIK), assinaturas não têm estofo, preenchimento é só acrescentou aos dados criptografados para prevenir um possível ataque.
EDIT: user CAF, em um comentário diz que um preenchimento é essnetial para uma boa assinatura. Eu ainda estou recomendando que você experimentá-lo com o comportamento padrão M2Crypto, pode adicioná-lo.

Em docs gerados de M2Crypto você pode ver que a {public, private} _ {codificar, decifrar} métodos têm uma opção de preenchimento, que é PKCS1 por padrão, enquanto o menthod sinal não tem nenhum.

IMO apenas dar-lhe um tiro com os parâmetros M2Crypto padrão, ele irá provavelmente trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top