java prime256v1,java – Android Pay:公共,私钥对生成(椭圆曲线与NISTP-256)

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

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

为此,我打电话给…

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;

}

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

问题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:你能帮我理解我做错了什么.我认为这可能与格式不匹配有关,但不确定,也不确定如何修复它.

感谢您的帮助!!

解决方法:

答案1:

然后生成私钥使用

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,android-pay

来源: https://codeday.me/bug/20190519/1135423.html

你可能感兴趣的:(java,prime256v1)