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\"
¬ify_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
#2
其实就是实现SHA1withRSA算法的逆运算
已知没有公钥证书,只有一个所谓的公钥字符串(pkcs#8,经过base64编码过),明文,及验证字串(经过base64编码过),怎么用这个公钥字符串去验证签名?
我打算使用OPENSSL,找到了RSA_verify函数,其他参数都好解决,难点在于怎么把这个公钥字符串转化为RSA的结构体呢(即怎么解析这个公钥字符串填充RSA结构体),求大侠指点关键函数或者其他解决方案,不胜感激!
已知没有公钥证书,只有一个所谓的公钥字符串(pkcs#8,经过base64编码过),明文,及验证字串(经过base64编码过),怎么用这个公钥字符串去验证签名?
我打算使用OPENSSL,找到了RSA_verify函数,其他参数都好解决,难点在于怎么把这个公钥字符串转化为RSA的结构体呢(即怎么解析这个公钥字符串填充RSA结构体),求大侠指点关键函数或者其他解决方案,不胜感激!
#1
#2
其实就是实现SHA1withRSA算法的逆运算
已知没有公钥证书,只有一个所谓的公钥字符串(pkcs#8,经过base64编码过),明文,及验证字串(经过base64编码过),怎么用这个公钥字符串去验证签名?
我打算使用OPENSSL,找到了RSA_verify函数,其他参数都好解决,难点在于怎么把这个公钥字符串转化为RSA的结构体呢(即怎么解析这个公钥字符串填充RSA结构体),求大侠指点关键函数或者其他解决方案,不胜感激!
已知没有公钥证书,只有一个所谓的公钥字符串(pkcs#8,经过base64编码过),明文,及验证字串(经过base64编码过),怎么用这个公钥字符串去验证签名?
我打算使用OPENSSL,找到了RSA_verify函数,其他参数都好解决,难点在于怎么把这个公钥字符串转化为RSA的结构体呢(即怎么解析这个公钥字符串填充RSA结构体),求大侠指点关键函数或者其他解决方案,不胜感激!