c - 在 polarssl c 中签署和验证 rsa 签名

标签 c encryption rsa polarssl

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

我已经在 128 位上进行了加密,但我在签名部分遇到了问题。 当我运行代码时,验证时出现填充错误 (POLARSSL_ERR_RSA_INVALID_PADDING -0x4100)

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

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。

最佳答案

哈希失败的原因是因为你在签名前没有填写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); (取决于你的“协议(protocol)”是如何工作的)。

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

关于c - 在 polarssl c 中签署和验证 rsa 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19791859/

相关文章:

c++ - system() 是否会在内部执行类似 sem_post 的调用?

c - 为什么我总是用 rand() 得到相同的随机数序列?

java-me - J2ME AES 解密错误(org.bouncycaSTLe.crypto.InvalidCipherTextException : pad block corrupted)

java读取加密对象

c# - 如何使用 AES 为相同的明文获取不同的密文

php - 在创建 JWT token 期间了解 RS256 和 SHA256

c++ - 是否存在用于Content Aware Image转换的C/C++开源库?

c# - 如何验证 RSA 公钥?

c# - 使用公钥解密

C - 在不重新分配内存的情况下将 C 字符串拆分为单词