首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP/Python验证ECDSA签名

使用PHP/Python验证ECDSA签名
EN

Stack Overflow用户
提问于 2017-08-09 15:27:39
回答 1查看 1.7K关注 0票数 1

我编写了代码,在Android上使用spongycastle生成ECDSA签名。然后我将符号字符串和公钥发送到服务器(Ubuntu16.04),并尝试使用php和python来验证这个标志。

我在我的android应用程序上测试验证。效果很好。

我使用php-openssl扩展,而Python使用ecdsa 0.13。但是这两件事都失败了。我再试一次,使用openssl命令,它也无法验证。

我不知道,哪里错了。

为什么ECDSA的验证失败?

这是我的代码:

  1. 生成签名(android):ECNamedCurveParameterSpec规范= ECNamedCurveTable.getParameterSpec("prime256v1");{ KeyPairGenerator g= KeyPairGenerator.getInstance("ECDSA","SC");g.initialize( spec,新SecureRandom());KeyPair keyPair = g.generateKeyPair();privateKey = keyPair.getPrivate();publicKey = keyPair.getPublic();/写入pem文件的公钥.fileOutputStream1.write(publickeyPem.getBytes());fileOutputStream1 =新的FileOutputStream(file1);StringWriter writer1 =新的StringWriter();PemWriter pemWriter1 =新的PemWriter(writer1);pemWriter1.writeObject(新的PemObject(“公钥”,publicKey.getEncoded());pemWriter1.ush();pemWriter1.close();String publickeyPem = writer1.toString();fileOutputStream1 fileOutputStream1.lose();} catch (除e) { e.printStackTrace();} .//符号和验证字符串chuoi = txtChuoi.getText().toString();byte[] chuoiInput = chuoi.getBytes("UTF-8");sig = Signature.getInstance("NONEwithECDSA","SC");sig.initSign(privateKey);sig.update(chuoiInput);//符号byte[] signatureBytes = sig.sign() sig.update Base64.DEFAULT);sig.initVerify(publicKey);txtGiaiMa.setText(sig.verify(signatureBytes)+"");/ sig.update(chuoiInput);/已验证的txtMahoa /写字符串符号文件.
  2. 有签名和公开密钥的输出是: (签名字符串) MEYCIQC7Hz631IFGsUOogcRLeN99uM9hWgLr+LGzuJvR/6nBrgIhAMXgZcvXyMRCAELXlNNS1a9j iAT1x0q2C5Mdu+2aZKtN (公匙) --开始使用公钥- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEj07XEM+ulPyrdsfAf9prN2L2dNUd /Yy0rABcFdueAwYUf86f8Cc93Ws6sxzIvf2iKOapFby7EjHewjhLM/z7Qg== -末端公钥
  3. 使用PHP验证:

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“丑陋,错误检查签名”;} ?>?>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-13 11:38:03

评论:但是,验证函数不返回任何内容。所以我不确定

如果crypto.verify(...不抛出错误,这意味着验证是否正常。见下面更新的代码。

使用错误的证书、签名或数据进行验证。

注释:您认为添加what 64.b64decode如何?..。因为在android代码中我有一个linetxtMaHoa.setText(Base64.encodeToString(signatureBytes,Ba‌​se64.DEFAULT));

PEM已经是base64,检查上面的.setText(Base64...是否可以省略。现在,我已经用base64.b64decode更新了下面的代码。

问题:例子-- b"sha256"?"b“是二进制(内置函数,还是必须将字符串sha256转换为二进制?)

仅作为字符串(摘要名称)为我工作,例如:

代码语言:javascript
复制
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,因为没有使用创建signaturecertificate

OpenSSL.crypto.verify(证书、签名、数据、摘要) 验证数据字符串的签名。 证书是与生成签名的私钥相对应的X509实例。 签名是给出签名本身的str实例。 data是一个str实例,它提供了应用签名的数据。 摘要是命名签名的消息摘要类型的str实例,例如b"sha256“。。新版本0.11。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45594864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档