我在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#加密系统是如何工作的,这样可以对实际问题的研究有所帮助。