【求助】Java SHA256withECDSA转php问题

@Ta 2022-07-14 1195点击
被下沉

问题详情

将java代码使用php的simplito/elliptic-php库转换为php代码时候生成的signature无法通过java的验证。求助!

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使用simplito/elliptic-php库

<?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|隐藏机器人聊天)
添加新回复
回复需要登录