ZBLOG

TypeError: KJUR.asn1.ASN1Util.stringToHex is not a function

抱歉造成了混淆。jsrsasign 的 API 可能在不同的版本中有所变化,stringToHex 并不是 KJUR.asn1.ASN1Util 下的方法。我们可以使用 jsrsasign 的其他功能来进行 ECC 加密和签名。

如果你想使用 ECC 公钥对数据进行加密,通常是通过签名方式进行,而不是直接加密数据。这是因为ECC主要用于数字签名。在这个过程中,我们会生成一个哈希值,并用公钥来验证该哈希。

以下是一个完整示例:

前端 (JavaScript) 使用 jsrsasign 进行签名

// 引入 jsrsasign 库
const KJUR = require('jsrsasign');

// 假设我们有一个ECC公钥(PEM格式)
const publicKeyPEM = `
-----BEGIN PUBLIC KEY-----
YOUR_ECC_PUBLIC_KEY_HERE
-----END PUBLIC KEY-----
`;

// 要签名的数据
const dataToSign = "Hello, ECC!";

// 使用 KJUR 对数据进行 SHA256 签名
function signData(data, privateKeyPEM) {
    const privateKey = KJUR.KEY.getKey(privateKeyPEM); // 用你的私钥替换
    const signature = new KJUR.crypto.Signature({"alg": "SHA256withECDSA"});
    signature.init(privateKey);
    signature.updateString(data);
    return signature.sign();
}

const privateKeyPEM = `
-----BEGIN PRIVATE KEY-----
YOUR_ECC_PRIVATE_KEY_HERE
-----END PRIVATE KEY-----
`;

const signedData = signData(dataToSign, privateKeyPEM);

console.log("Signed Data:", signedData);

后端 (Java) 使用 Bouncy Castle 验证签名

这里是在 Java 中如何使用 Bouncy Castle 来验证前端发送的签名:

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

import java.security.Security;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.X509EncodedKeySpec;

public class EccSignatureVerification {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    public static void main(String[] args) throws Exception {
        String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n" +
                               "YOUR_ECC_PUBLIC_KEY_HERE\n" +
                               "-----END PUBLIC KEY-----";
        String signedHexString = "SIGNED_DATA_FROM_JS"; // 替换为从 JS 获取的十六进制字符串
        
        boolean isVerified = verifySignature("Hello, ECC!", signedHexString, publicKeyPEM);
        
        System.out.println("Signature Verified: " + isVerified);
    }

    private static boolean verifySignature(String originalData, String hexSignedData, String pemPublicKey) throws Exception {
        byte[] signedBytes = Hex.decode(hexSignedData.trim());

        // 转换 PEM 格式公钥为 Public Key 对象
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(java.util.Base64.getDecoder().decode(
                pemPublicKey.replaceAll("-----(BEGIN|END) PUBLIC KEY-----", "").replaceAll("\\s+", "")));
        
        KeyFactory keyFactory = KeyFactory.getInstance("EC");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);

        Signature signatureVerifier = Signature.getInstance("SHA256withECDSA");
        signatureVerifier.initVerify(publicKey);
        
        // 更新要验证的数据并验证签名
        signatureVerifier.update(originalData.getBytes());
        
       return signatureVerifier.verify(signedBytes); 
   }
}

注意事项

  • 请替换占位符 "YOUR_ECC_PUBLIC_KEY_HERE""YOUR_ECC_PRIVATE_KEY_HERE" 为实际的 ECC 密钥。
  • 确保将从 JavaScript 得到的 已签名的数据 传递给 Java 后台以供验证。
  • 此外,确保正确引入 Bouncy Castle 的依赖项,并根据需要处理异常。

这样,你就能在前端对数据进行数字签名,然后在后端验证该签名,以确认数据的完整性和来源。如果需要进一步加密原始数据,可以考虑使用对称加密算法(如 AES)来保护数据内容。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20958

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?