关于RSA公钥解密和验证签名的问题?

时间:2022-10-14 08:52:22
我使用的XYSSL开源库,利用该库内的测试例子,签名、验证签名是OK的,但是跟服务器对接(JAVA)的时候遇到了问题:已知如下条件


1.签名公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMgZpKqh8+
mkFY+s527efUKOrYUYt14rNYImhc1gfwDqKVRUbXdTLwDegh7inmLz0ADF
+uaFccXCvLsvjaN6JqsOC4Vo4/E2zvQRtCRPqNZymE8U4HxFIN9
+t22zLDhKhxCWIf7a+9YZ+B6vE7hIJiXz+HZVR6Lt0QQyATbeD7twIDAQAB     
2.明文:
partner=\"2088102000947391\"&seller=\"2088102000947391\"
&out_trade_no=\"64F189B67890123\"
&subject=\"苹果\"&body=\"kkk\"&total_fee=\"0.01\"
&notify_url=\"http%3A%2F%2Fnotify.java.jpxx.org%2Findex.jsp\"
&call_back_url=\"http%3A%2F%2Fnotify.java.jpxx.org%2Findex.jsp\"
&trade_no=\"2011031800407163\"&success=\"true\"

3.签名结果:
DXzw2ZU1T0YDSFoAPcX5F2AXiM85A0d674XLUJG
kraRtjjkSiYKkr3ppp5B3vVaOjdIVNDRDm36Pgf/uizp
+nxGOeS0CXLP/56c5alj3xC6FCcat2BUdi3IEmmKRmvr
Sf6oQRCbaOY9QyvVz2DDNq8aOxzZpMc4qfzyNihX4auw=


签名结果和公钥都经过base64编码


由于打算移植到symbian平台,因此代码如下:
主要就想问问我这个流程对不对?xyssl中验证签名的函数是rsa_pkcs1_verify,参数的ctx通过x509parse_pubkey解析签名公钥得到,mode=RSA_PUBLIC, hash_id=RSA_SHA1,hash通过里面的sha1()函数得到,hashlen=20,sig就是把签名结果解base64编码得到。

希望用过xyssl的大虾们指点指点,或者帮忙解释一下怎么解析类似上面格式的密钥。

rsa_pkcs1_verify的原型如下:
int rsa_pkcs1_verify ( rsa_context* ctx, int mode, int hash_id, int hashlen, unsigned char* hash, unsigned char* sig );

测试symbian函数如下:aPubKey  签名公钥,aVerifyText签名结果,明文aPlaintText;

TBool CRSATestAppUi::OpenRSAX509Verify(const TDesC8& aPubKey,const TDesC8& aVerifyText,const TDesC8& aPlaintText)
{
    unsigned char sha1sum[20];
    x509_cert clicert;
    
    memset( sha1sum, 0, 20 );
    memset( &clicert, 0, sizeof( x509_cert ) );
    
    HBufC8* hbufPK = HBufC8::NewLC( aPubKey.Length() + 1 );
    TPtr8 ptrPK = hbufPK->Des();
    ptrPK.Copy( aPubKey );//ptrPK是公钥字串的指针

    Base64Decode(aVerifyText);    
    HBufC8* hbufVerify = HBufC8::NewLC( bufDecode->Length() + 1 );
    TPtr8 ptrVerify = hbufVerify->Des();
    ptrVerify.Copy( *bufDecode );  //这一段把签名结果解码(base64编码) 
    
    TInt ret = x509parse_pubkey( &clicert, ( unsigned char * ) ptrPK.PtrZ(), ptrPK.Length() );//解析公钥

    HBufC8* plainttext = HBufC8::NewLC( aPlaintText.Length() + 1 );
    TPtr8 ptrCT = plainttext->Des();
    ptrCT.Copy( aPlaintText );//ptrCT是明文字串的指针 
    
    sha1( ( unsigned char * ) ptrCT.PtrZ(), ptrCT.Length(), sha1sum );//计算明文的SHA1值放到sha1sum数组 
    

    //验证签名函数
    if( rsa_pkcs1_verify( &clicert.rsa, RSA_PUBLIC, RSA_SHA1, 20,
     ( unsigned char*)(sha1sum), ( unsigned char * ) ptrVerify.PtrZ() ) != 0 )
    {
        //if( verbose != 0 )
            //printf( "failed\n" );
CleanupStack::PopAndDestroy(3);//cliphertext  hbufPK
        return( 0 );
    }  
    
    CleanupStack::PopAndDestroy(3);//cliphertext  hbufPK
    return (1);
}


2 个解决方案

#1


该回复于2011-03-22 09:00:20被版主删除

#2


其实就是实现SHA1withRSA算法的逆运算
已知没有公钥证书,只有一个所谓的公钥字符串(pkcs#8,经过base64编码过),明文,及验证字串(经过base64编码过),怎么用这个公钥字符串去验证签名?

我打算使用OPENSSL,找到了RSA_verify函数,其他参数都好解决,难点在于怎么把这个公钥字符串转化为RSA的结构体呢(即怎么解析这个公钥字符串填充RSA结构体),求大侠指点关键函数或者其他解决方案,不胜感激!

#1


该回复于2011-03-22 09:00:20被版主删除

#2


其实就是实现SHA1withRSA算法的逆运算
已知没有公钥证书,只有一个所谓的公钥字符串(pkcs#8,经过base64编码过),明文,及验证字串(经过base64编码过),怎么用这个公钥字符串去验证签名?

我打算使用OPENSSL,找到了RSA_verify函数,其他参数都好解决,难点在于怎么把这个公钥字符串转化为RSA的结构体呢(即怎么解析这个公钥字符串填充RSA结构体),求大侠指点关键函数或者其他解决方案,不胜感激!