- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 2 个代码,都应该签署 SHA256 哈希字符串,并且都使用 C++ 中的 openssl 库和私钥。但是,我不明白它们之间的区别。我没有写任何这些代码。
第一个使用 EVP_DigestSign 函数。
bool RSASign( RSA* rsa,
const unsigned char* Msg,
size_t MsgLen,
unsigned char** EncMsg,
size_t* MsgLenEnc) {
EVP_MD_CTX* m_RSASignCtx = EVP_MD_CTX_create();
EVP_PKEY* priKey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(priKey, rsa);
if (EVP_DigestSignInit(m_RSASignCtx,NULL, EVP_sha256(), NULL,priKey)<=0) {
return false;
}
if (EVP_DigestSignUpdate(m_RSASignCtx, Msg, MsgLen) <= 0) {
return false;
}
if (EVP_DigestSignFinal(m_RSASignCtx, NULL, MsgLenEnc) <=0) {
return false;
}
*EncMsg = (unsigned char*)malloc(*MsgLenEnc);
if (EVP_DigestSignFinal(m_RSASignCtx, *EncMsg, MsgLenEnc) <= 0) {
return false;
}
EVP_MD_CTX_cleanup(m_RSASignCtx);
return true;
}
char* signMessage(std::string privateKey, std::string plainText) {
RSA* privateRSA = createPrivateRSA(privateKey);
unsigned char* encMessage;
char* base64Text;
size_t encMessageLength;
RSASign(privateRSA, (unsigned char*) plainText.c_str(), plainText.length(), &encMessage, &encMessageLength);
Base64Encode(encMessage, encMessageLength, &base64Text);
free(encMessage);
return base64Text;
}
第二个非常不同,它不使用任何 EVP_.. 函数。
RSA * createRSA(unsigned char * key,int public_private)
{
RSA *rsa= RSA_new(); //NULL;
if (rsa == NULL)
{
LOGF_WARN("Failed to create RSA");
return 0;
}
BIO *keybio ;
keybio = BIO_new_mem_buf(key, -1);
if (keybio==NULL)
{
LOGF_TRACE( "Failed to create key BIO");
return 0;
}
if(public_private)
{
rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa,NULL, NULL);
}
else
{
rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa,NULL, NULL);
}
return rsa;
}
int private_sign(const unsigned char * data, int data_len, unsigned char * key,
unsigned char *sigret, unsigned int * siglen){
RSA * rsa = createRSA(key,0);
if (rsa == NULL || !rsa)
{
LOGF_TRACE("Failed to create RSA");
printLastError("SELLADO RSA-");
return 0;
}
printLastError("SELLADO RSA-");
int result = RSA_sign(NID_sha256, data, data_len,sigret, siglen, rsa);
return result;
}
我找到这些代码是因为我想对我之前在我的程序中创建的 SHA256 哈希进行签名。但是我对密码学不是很有经验,所以我很难理解这两个代码之间的区别,我读到 EVP 功能是高级的,这是否意味着其他功能是低级的?
希望您能帮我解决这个问题,在此先感谢您...如果您需要任何其他信息,请告诉我。
来源: http://hayageek.com/rsa-encryption-decryption-openssl-c/ https://gist.github.com/irbull/08339ddcd5686f509e9826964b17bb59
最佳答案
一个典型的签名过程包括
1) 摘要(消息
) => md
2) do_something_using_private_key(md
) => signature
EVP_DigestSignXXXs 会帮你完成这两步,RSA_sign 只做第 2 步,你需要自己做第 1 步,使用 EVP_DigestXXXs , SHA256_XXX , ...
例如:
unsigned char md[64];
SHA256(data, datalen, md);
RSA_sign(rsakey, md, mdlen, sig, &siglen);
private_sign
函数的参数data
, data_len
有点令人困惑。实际上应该传入一个消息摘要(md
)。
关于c++ - RSA_sign 和 EVP_DigestSignX() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59096604/
我有 2 个代码,都应该签署 SHA256 哈希字符串,并且都使用 C++ 中的 openssl 库和私钥。但是,我不明白它们之间的区别。我没有写任何这些代码。 第一个使用 EVP_DigestSig
我是一名优秀的程序员,十分优秀!