首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在polarssl c中签名和验证rsa签名

在polarssl c中签名和验证rsa签名
EN

Stack Overflow用户
提问于 2013-11-05 14:54:38
回答 1查看 2.7K关注 0票数 1

我正在一个嵌入式系统中使用RSA加密。为此,我将使用polarssl代码。

我的加密工作在128位,但我有问题的签名部分。运行代码时,在验证(POLARSSL_ERR_RSA_INVALID_PADDING -0x4100)上会出现一个填充错误。

下面是密码。问题代码接近尾声,最上面的一行是关于加密的。仍然对背景信息有帮助。

代码语言:javascript
复制
int main()
{
    size_t len;
    rsa_context rsa;
    unsigned char rsa_plaintext[PT_LEN];
    unsigned char rsa_decrypted[PT_LEN];
    unsigned char rsa_ciphertext[KEY_LEN];
    unsigned char rsa_hash[PT_LEN];
    unsigned char rsa_sig_out[PT_LEN];
    unsigned char rsa_hash_result[PT_LEN];

rsa_init( &rsa, RSA_PKCS_V15, 0 );
rsa.len = KEY_LEN;

mpi_read_string( &rsa.N , 16, RSA_N  );
mpi_read_string( &rsa.E , 16, RSA_E  );
mpi_read_string( &rsa.D , 16, RSA_D  );
mpi_read_string( &rsa.P , 16, RSA_P  );
mpi_read_string( &rsa.Q , 16, RSA_Q  );
mpi_read_string( &rsa.DP, 16, RSA_DP );
mpi_read_string( &rsa.DQ, 16, RSA_DQ );
mpi_read_string( &rsa.QP, 16, RSA_QP );

// Checking the public and private keys
if( rsa_check_pubkey(  &rsa ) != 0 ||
    rsa_check_privkey( &rsa ) != 0 ) {
    printf( "Public/Private key error! \n" );
    exit(0);
}

memcpy( rsa_plaintext, RSA_PT, PT_LEN );

if( rsa_pkcs1_encrypt( &rsa, &myrand, NULL, RSA_PUBLIC, PT_LEN,
                       rsa_plaintext, rsa_ciphertext ) != 0 ) {
    printf( "Encryption failed! \n" );
    exit(0);
}
if( rsa_pkcs1_decrypt( &rsa, &myrand, NULL, RSA_PRIVATE, &len,
                       rsa_ciphertext, rsa_decrypted,
                       sizeof(rsa_decrypted) ) != 0 ) {
    printf( "Decryption failed! \n" );
    exit(0);
}
if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 ) {
    printf( "Compare failed! \n" );
    exit(0);
}
printf("Oh when it all falls down!\n");

// Signing and Verifying message
sha2(rsa_plaintext, len, rsa_hash, 0); //hashing the message 
if (rsa_pkcs1_sign( &rsa, &myrand, NULL, RSA_PRIVATE, SIG_RSA_SHA256, 0, rsa_hash, rsa_sig_out ) != 0) {
    printf( "Signing failed! \n" );
    exit(0);
}
/*
if (rsa_pkcs1_verify( &rsa, NULL, NULL, RSA_PUBLIC, SIG_RSA_SHA256, 0, rsa_sig_out, rsa_hash_result ) != 0) {
    printf( "Verifying signature failed! \n" );
    exit(0);
}
*/
printf("Error Message!:%d \n", rsa_pkcs1_verify( &rsa, NULL, NULL, RSA_PUBLIC,
SIG_RSA_SHA256, 0, rsa_sig_out, rsa_hash_result ));
exit(0);

if( memcmp( rsa_hash, rsa_hash_result, len ) != 0 )
{
    printf( "Signature not verified! \n" );
    exit(0);
}
rsa_free(&rsa);

return 0;

}

有人知道我能解决这个问题然后继续前进。请让我知道。谢谢,我是在windows的MinGw gcc编译器上运行的。rsa代码依赖于bignum、md和sha2。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-05 15:24:38

散列失败的原因是在签名之前没有填充rsa_hash,在验证之前没有填充rsa_hash_result

rsa_pkcs1_sign()rsa_pkcs1_verify()对所提供的散列进行签名和验证。他们不做散列,因为他们不知道数据。(即rsa_plaintextrsa_ciphertext从不输入符号或验证函数)。

因此,在调用rsa_pkcs1_sign()之前,您应该运行sha256(rsa_plaintext, rsa_hash);sha256(rsa_ciphertext, rsa_hash); (取决于您的“协议”的工作方式)。

然后,在验证之前,运行sha256(XXX, rsa_hash_result);并向rsa_pkcs1_verify()提供该值,以便它能够实际验证您的哈希。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19791859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档