gpt4 book ai didi

java - Android Pay : Public, 私钥对生成(带 NISTP-256 的椭圆曲线)

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:36:06 25 4
gpt4 key购买 nike

Android 支付问题

在 Android Pay 中,从信用卡生成 token 的过程如下:

生成公钥和私钥(下面的调用使用带 NISTP-256 算法的椭圆曲线返回 key )

为此我调用...

public static KeyPair generateKeyPair() {
KeyPair pair =null;
try {
ECGenParameterSpec ecGenSpec = new ECGenParameterSpec("prime256v1");
java.security.KeyPairGenerator g = KeyPairGenerator.getInstance("EC");
g.initialize(ecGenSpec, new SecureRandom());
pair = g.generateKeyPair();
pair.getPrivate();
pair.getPublic();
}catch (Throwable e ){
e.printStackTrace();
}
return pair;
}

…这成功返回了公钥和私钥,但我不确定 key 的格式/编码是什么。我找不到任何关于此的文档。

问题 1:这是为 Android Pay 生成公钥和私钥的正确方法吗?

将 base64 编码格式的公钥传递给 Android Pay createMaskedWalletRequet 方法(详情请参阅 Android Pay 文档)

String publicKey = String (Base64.encodeBase64(pair.getPublic().getEncoded()));

PaymentMethodTokenizationParameters parameters = PaymentMethodTokenizationParameters.newBuilder().setPaymentMethodTokenizationType(PaymentMethodTokenizationType.NETWORK_TOKEN).addParameter("publicKey", publicKey).build();

这里我得到以下异常:

03-30 17:02:06.459 3786-15263/? E/WalletClient: Error validating MaskedWalletRequest.paymentMethodTokenizationParameters: first byte of parameter "publicKey" must be 0x04 (which indicates uncompressed point format)

问题 2:你能帮我理解我做错了什么吗?我认为这可能与格式不匹配有关,但不确定,也不知道如何解决。

感谢您的帮助!!

最佳答案

答案一:

根据 Android Pay 文档,您可以像这样通过 OpenSSL 生成公钥: https://developers.google.com/android-pay/integration/gateway-processor-integration#example-using-openssl-to-generate-and-format-a-public-key enter link description here

然后生成私钥使用

openssl pkcs8 -topk8 -inform PEM -outform PEM -in merchant-key.pem -nocrypt

或者您可以使用 shell 脚本文件。(例如:Android pay quickstart 中的 genkey.sh)
使用下面的代码(将代码复制到.sh文件并双击)你可以得到私钥。

#!/bin/bash

# Generate key.pem file:
openssl ecparam -name prime256v1 -genkey -noout -out key.pem

# Print public and private key in hex form:
openssl ec -in key.pem -text -noout

openssl pkcs8 -topk8 -inform PEM -outform PEM -in key.pem -nocrypt

sleep 2m

然后在终端中复制 pub 字符串并替换为这段代码,然后保存这段代码以再次创建 .sh 文件

#!/bin/bash

KEY="04:a9:9b:54:81:b0:67:0d:d3:50:84:e0:d4:d2:29:
a5:3a:d6:5c:21:ae:5e:dd:58:75:f0:27:63:44:e8:
a9:86:8d:cf:17:64:63:96:54:34:ed:16:37:c4:37:
e6:b7:27:ad:06:af:b0:07:d1:b5:66:0a:2a:85:c0:
71:9e:cc:39:54"

echo $KEY | xxd -r -p | base64
sleep 2m

然后获取公钥。

答案 2:您可以通过这些键进行测试:

公钥:BKmbVIGwZw3TUITg1NIppTrWXCGuXt1YdfAnY0ToqYaNzxdkY5ZUNO0WN8Q35rcnrQavsAfRtWYKKoXAcZ7MOVQ=

(此公钥可以作为字符串直接传递给 MaskedWalletRequet)

私钥:MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgTA/wqrlbeVddorTlaT1AqhALrIBwS+DUdV3N1K1gImqhRANCAASpm1SBsGcN01CE4NTSKaU61lwhrl7dWHXwJ2NE6KmGjc8XZGOWVDTtFjfEN+a3J60Gr7AH0bVmCiqFwHGezDlU

关于java - Android Pay : Public, 私钥对生成(带 NISTP-256 的椭圆曲线),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36320178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com