1

組み込みシステムで 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 に依存しています。

4

1 に答える 1

3

ハッシュが失敗する理由は、rsa_hash署名rsa_hash_result前または検証前に入力しなかったためです。

rsa_pkcs1_sign()提示されたハッシュにrsa_pkcs1_verify()署名して検証します。彼らはデータを知らないので、ハッシュを作成しません。(つまり、sign または verify 関数を入力しないでください) rsa_plaintextrsa_ciphertext

したがって、呼び出す前にorrsa_pkcs1_sign()を実行する必要があります(「プロトコル」の動作方法によって異なります)。sha256(rsa_plaintext, rsa_hash);sha256(rsa_ciphertext, rsa_hash);

次に、検証の前に、実際にハッシュを検証できるように、sha256(XXX, rsa_hash_result);その値を実行して提供します。rsa_pkcs1_verify()

于 2013-11-05T15:24:38.423 に答える