无法在C#中验证OpenSSL C ++签名

时间:2017-02-06 11:20:28

标签: c# c++ openssl cryptography rsa

我在C ++中使用openSSL生成密钥对,我用它来签署一条消息,通过严格使用RSACryptoServiceProvider(没有BouncyCastle等)的C#服务器进行身份验证。我使用了PKCS#1 SHA256来生成签名。签名随后以十六进制形式与公钥一起传输。问题是签名无法在服务器上验证。 我已经尝试删除标题“----- BEGIN RSA PUBLIC KEY -----”等。但是还没有结果。用于生成密钥对和签名的c ++代码是:

RSA             *keypair = NULL;
bne = BN_new();
int  ret = 0;
ret = BN_set_word(bne, ea);
keypair = RSA_new();    
RSA_generate_key_ex(keypair , 2048, bne, NULL);
SHA256((unsigned char*)msg, strlen(msg) + 1, hash);
RSA_sign(NID_sha256, hash, SHA256_DIGEST_LENGTH, sign,&signLen, keypair);

我使用BIO在字符缓冲区中收集了公钥,并将签名数据转换为十六进制字符串以便传输到c#。然而,我尝试通过编写示例表单应用程序以及在c ++上验证的签名和公钥来复制服务器,我已将它们硬编码作为c#sample的输入。但它们也会失败。 任何人都可以帮助我找出可能的原因或谬误的地方吗?

 RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
 RSA.ImportParameters(rsParam);
 UTF8Encoding encoding = new UTF8Encoding();
 byte[] datax = encoding.GetBytes(data);
 byte[] sigx = encoding.GetBytes(sig);
 SHA256Managed sha256 = new SHA256Managed();
 byte[] hash = sha256.ComputeHash(datax);
 iRes= RSA.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA256"), sigx);

传递'数据'并且'sig'是硬编码值,'rsParam是使用用于生成'sig'的硬编码公钥创建的。将公钥转换为rsParam的代码是:

pubkey = Convert.FromBase64String(pemString);
RSAParameters rsParam = RSA.ExportParameters(false);
rsParam .Modulus = pubkey;
RSA.ImportParameters(rsParam );

我编写此代码只是为了了解基本的C#加密系统是如何工作的,这样可以对实际问题的研究有所帮助。

0 个答案:

没有答案