已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 讨论/求助

标题: 【求助】Java SHA256withECDSA转php问题

作者: @Ta

时间: 2022-07-14

点击: 1197
被下沉

问题详情

将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|显示机器人聊天)』

1. 使用hash函数计算$msg的哈希值,
hash('sha256', $msg')
(/@Ta/2022-07-14 21:45//)

2. 大佬,牛批。
(/@Ta/2022-07-18 04:26//)

回复需要登录

8月5日 04:00 星期二

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1