【发布时间】:2018-01-17 14:10:14
【问题描述】:
我编写代码以使用 spongycastle lib 在 Android 上生成 ECDSA 签名。然后我将标志字符串和公钥发送到服务器(Ubuntu 16.04)并尝试使用 php 和 python 来验证这个标志。
我在我的 android 应用上测试验证。效果很好。
我使用 php-openssl 扩展,在 Python 中我使用 ecdsa 0.13。但是,这两个都失败了。我再试一次,使用 openssl 命令,也验证不了。
我不知道,我错在哪里。
为什么 ECDSA 验证失败?
这是我的代码:
-
生成签名(安卓):
ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1"); try { KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA","SC"); g.initialize(spec, new SecureRandom()); KeyPair keyPair = g.generateKeyPair(); privateKey = keyPair.getPrivate(); publicKey = keyPair.getPublic(); ///write public key to pem file ...... FileOutputStream fileOutputStream1 = new FileOutputStream(file1); StringWriter writer1 = new StringWriter(); PemWriter pemWriter1 = new PemWriter(writer1); pemWriter1.writeObject(new PemObject("PUBLIC KEY",publicKey.getEncoded())); pemWriter1.flush(); pemWriter1.close(); String publickeyPem = writer1.toString(); fileOutputStream1.write(publickeyPem.getBytes()); fileOutputStream1.close(); } catch (Exception e) { e.printStackTrace();} ...... //Sign and veryfied String chuoi = txtChuoi.getText().toString(); byte[] chuoiInput = chuoi.getBytes("UTF-8"); Signature sig = Signature.getInstance("NONEwithECDSA","SC"); sig.initSign(privateKey); sig.update(chuoiInput); ///SIGN byte[] signatureBytes = sig.sign() txtMaHoa.setText(Base64.encodeToString(signatureBytes,Base64.DEFAULT)); sig.initVerify(publicKey); sig.update(chuoiInput); ///VERIFIED txtGiaiMa.setText(sig.verify(signatureBytes)+""); ///Write string sign in txtMahoa to file ....... -
输出我有签名和公钥是:
(Signature string) MEYCIQC7Hz631IFGsUOogcRLeN99uM9hWgLr+LGzuJvR/6nBrgIhAMXgZcvXyMRCAELXlNNS1a9j iAT1x0q2C5Mdu+2aZKtN(公钥)
-----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEj07XEM+ulPyrdsfAf9prN2L2dNUd /Yy0rABcFdueAwYUf86f8Cc93Ws6sxzIvf2iKOapFby7EjHewjhLM/z7Qg== -----END PUBLIC KEY----- -
使用 PHP 验证:
$pubkeyid = openssl_pkey_get_public("/var/www/html/ca.pem"); $data = "nguyen tran thanh Lam"; $signature = "MEYCIQC7Hz631IFGsUOogcRLeN99uM9hWgLr+LGzuJvR/6nBrgIhAMXgZcvXyMRCAELXlNNS1a9jiAT1x0q2C5Mdu+2aZKtN"; $ok = openssl_verify($data, $signature, $pubkeyid); if ($ok == 1) { echo "good"; } elseif ($ok == 0) { echo "bad"; } else { echo "ugly, error checking signature"; } ?>
【问题讨论】:
-
您的输出签名中有一个空白 9j iA
-
不,这是我的打字错误。
-
可能获得一个链接到 "/var/www/html/ca.pem",我想通过
pyopenssl进行验证? -
???它可以访问文件 ca.pem 但我有一个问题:在 Android 中生成字符串签名 ---> 我将其编码为 Base64 并发送到服务器。但是当我用 PHP 解码它时,它可能不像登录 android。所以我可以在android上验证这个标志但是使用php,它失败了。 PyOpenSSL?我没用过,能不能指导一下。谢谢。
-
PyOpenSSL signing-and-verifying-signatures
标签: php android python php-openssl boringssl