我编写了代码,在Android上使用spongycastle生成ECDSA签名。然后我将符号字符串和公钥发送到服务器(Ubuntu16.04),并尝试使用php和python来验证这个标志。
我在我的android应用程序上测试验证。效果很好。
我使用php-openssl扩展,而Python使用ecdsa 0.13。但是这两件事都失败了。我再试一次,使用openssl命令,它也无法验证。
我不知道,哪里错了。
为什么ECDSA的验证失败?
这是我的代码:
openssl_pkey_get_public("/var/www/html/ca.pem");= "MEYCIQC7Hz631IFGsUOogcRLeN99uM9hWgLr+LGzuJvR/6nBrgIhAMXgZcvXyMRCAELXlNNS1a9jiAT1x0q2C5Mdu+2aZKtN";$data = "nguyen tran thanh Lam";$signature =“MEYCIQC7Hz631IFGsUOogcRLeN99uM9hWgLr+LGzuJvR/6nBrgIhAMXgZcvXyMRCAELXlNNS1a9jiAT1x0q2C5Mdu+2aZKtN”;$ok = openssl_verify($data,$signature,$pubkeyid);if ($ok == 1) { echo "good";} $pubkeyid ($ok == 0) { echo "bad";}$data{ echo“丑陋,错误检查签名”;} ?>?>
发布于 2017-08-13 11:38:03
评论:但是,验证函数不返回任何内容。所以我不确定
如果crypto.verify(...不抛出错误,这意味着验证是否正常。见下面更新的代码。
使用错误的证书、签名或数据进行验证。
注释:您认为添加what 64.b64decode如何?..。因为在android代码中我有一个
linetxtMaHoa.setText(Base64.encodeToString(signatureBytes,Base64.DEFAULT));
PEM已经是base64,检查上面的.setText(Base64...是否可以省略。现在,我已经用base64.b64decode更新了下面的代码。
问题:例子-- b"sha256"?"b“是二进制(内置函数,还是必须将字符串sha256转换为二进制?)
仅作为字符串(摘要名称)为我工作,例如:
import pem, base64
from OpenSSL import crypto
signature = b"MEYCIQC7Hz631IFGsUOogcRLeN99uM9hWgLr+LGzuJvR/6nBrgIhAMXgZcvXyMRCAELXlNNS1a9jiAT1x0q2C5Mdu+2aZKtN"
# As Creator of the Signatur do additional base64 encoding!
signature = base64.b64decode(signature)
data = "nguyen tran thanh Lam"
certificate = pem.parse_file('Android.pem')[0]
cert = crypto.load_certificate(crypto.FILETYPE_PEM, certificate.as_bytes())
try:
crypto.verify(cert=cert, signature=signature, data=data, digest='sha256')
except crypto.Error as exp:
print('crypto.Error:{}'.format(exp.args))
>>>crypto.Error:([('', 'ECDSA_do_verify', 'bad signature')],)Note:抛出
crypto.Error,因为没有使用创建signature的certificate。OpenSSL.crypto.verify(证书、签名、数据、摘要) 验证数据字符串的签名。 证书是与生成签名的私钥相对应的X509实例。 签名是给出签名本身的str实例。 data是一个str实例,它提供了应用签名的数据。 摘要是命名签名的消息摘要类型的str实例,例如b"sha256“。。新版本0.11。
https://stackoverflow.com/questions/45594864
复制相似问题