标题: 【求助】Java SHA256withECDSA转php问题
时间: 2022-07-14
将java代码使用php的simplito/elliptic-php库转换为php代码时候生成的signature无法通过java的验证。求助!
static String algorithm = "EC"; // 椭圆曲线算法 这三个参数保持不变即可
static String curve = "secp256k1"; // S256曲线 | prime256v1、secp256r1-->P256
static String signatureAlgorithm = "SHA256withECDSA"; // 签名/验签时对明文使用的摘要算法
static String apiKey = "baHoDsyWuDASJ3RjZ1G3st1PZb//wrkxd540dbdFlP0="; // api密钥
static int app_id = 10000042; // 应用id
// 还原私钥
public static ECPrivateKey ReducePrivateKey(String keyB64Str, String algorithm, String curve) {
byte[] privateKeyS = Base64.getDecoder().decode(keyB64Str);
log.info("privateKeyS=>{}", new String(privateKeyS));
try {
AlgorithmParameters parameters = AlgorithmParameters.getInstance(algorithm); // EC
parameters.init(new ECGenParameterSpec(curve)); // secp256k1
ECParameterSpec ecParameters = parameters.getParameterSpec(ECParameterSpec.class);
ECPrivateKeySpec privateSpec = new ECPrivateKeySpec(new BigInteger(1, privateKeyS), ecParameters);
KeyFactory kf = KeyFactory.getInstance(algorithm);
ECPrivateKey privateKey = (ECPrivateKey) kf.generatePrivate(privateSpec);
return privateKey;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// 私钥签名
public static String Sign(String message, ECPrivateKey privateKey) {
String signRes = "";
try {
Signature sig = Signature.getInstance(signatureAlgorithm); // SHA256withECDSA
sig.initSign(privateKey);
// string使用UTF-8转bytes
sig.update(message.getBytes(StandardCharsets.UTF_8));
signRes = Base64.getEncoder().encodeToString(sig.sign());
} catch (Exception e) {
e.printStackTrace();
}
return signRes;
}
public static void main(String[] args) {
String signature = Sign(String.format("%d", app_id), ReducePrivateKey(apiKey, algorithm, curve));
}
<?php
require __DIR__ . "./vendor/autoload.php";
use Elliptic\EC;
$ec = new EC('secp256k1');
// Generate keys
$key = $ec->keyFromPrivate(bin2hex(base64_decode("baHoDsyWuDASJ3RjZ1G3st1PZb//wrkxd540dbdFlP0=")),'hex');
// Sign message (can be hex sequence or array)
$msg = '10000042';
$signature = $key->sign($msg);
$derSign = $signature->toDER('hex');
$sign_base64 = base64_encode(hex2bin($derSign));
『回复列表(2|显示机器人聊天)』