【问题标题】:How to calculate a signature with EVP_Sign functions如何使用 EVP_Sign 函数计算签名
【发布时间】:2012-11-17 06:03:27
【问题描述】:

我有以下C代码,java代码在openssl digest different in c compared to java

EVP_MD_CTX md_ctx;
unsigned char sig_buf[4096];
/* Do the signature */
int err;
unsigned int sig_len;
String testSign = "c14N string ";
EVP_SignInit(&md_ctx, EVP_sha256());
EVP_SignUpdate(&md_ctx, testSign.c_str(), testSign.size());
sig_len = sizeof(sig_buf);
err = EVP_SignFinal(&md_ctx, sig_buf, &sig_len, privKey);
if (err != 1) {
    perror("Error While generating Signature for Security Token");
    return "Null Signature";
}
return calculateBase64(sig_buf,sig_len);

我面临的问题是 java 计算的签名与 C 不同。这必须使用私钥来完成,并且我有来自 OpenSSL 的 SSL 对象可用。

也只是添加以下命令行生成匹配的签名

echo -n "String here" | openssl dgst -dss1 -sha256 -sign client.key |openssl base64

这方面的任何指示都会有所帮助,谢谢。

【问题讨论】:

  • 这是 Java 问题、C 问题还是 C++ 问题?你的 Java 代码在哪里?
  • 这是一个 C/C++ 问题,java 代码是以下问题stackoverflow.com/questions/13608286/…
  • 这是双份吗,应该关闭。
  • 不同的是代码是一样的。以前是摘要计算,现在是签名计算。

标签: java c openssl digital-signature


【解决方案1】:

替换以下内容并得到正确的结果。

EVP_MD_CTX_init(&md_ctx);
EVP_SignInit_ex(&md_ctx, EVP_sha256(),NULL);
EVP_MD_CTX_cleanup(&md_ctx);

参考: http://www.nlnetlabs.nl/downloads/publications/hsm/hsm_node22.html

【讨论】:

  • 对了,上面代码的错误是你使用了一个未初始化的md_ctx。真正的解决方法是调用 EVP_MD_CTX_init。
  • 感谢您的解释,它很有帮助。因此,如果我做对了,我们需要同时初始化 mdcontext 和签名上下文。
猜你喜欢
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
相关资源
最近更新 更多