ZBLOG

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

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

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

以下是一个完整示例:

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

  1. // 引入 jsrsasign 库
  2. const KJUR = require('jsrsasign');
  3. // 假设我们有一个ECC公钥(PEM格式)
  4. const publicKeyPEM = `
  5. -----BEGIN PUBLIC KEY-----
  6. YOUR_ECC_PUBLIC_KEY_HERE
  7. -----END PUBLIC KEY-----
  8. `;
  9. // 要签名的数据
  10. const dataToSign = "Hello, ECC!";
  11. // 使用 KJUR 对数据进行 SHA256 签名
  12. function signData(data, privateKeyPEM) {
  13. const privateKey = KJUR.KEY.getKey(privateKeyPEM); // 用你的私钥替换
  14. const signature = new KJUR.crypto.Signature({"alg": "SHA256withECDSA"});
  15. signature.init(privateKey);
  16. signature.updateString(data);
  17. return signature.sign();
  18. }
  19. const privateKeyPEM = `
  20. -----BEGIN PRIVATE KEY-----
  21. YOUR_ECC_PRIVATE_KEY_HERE
  22. -----END PRIVATE KEY-----
  23. `;
  24. const signedData = signData(dataToSign, privateKeyPEM);
  25. console.log("Signed Data:", signedData);

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

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

  1. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  2. import org.bouncycastle.util.encoders.Hex;
  3. import java.security.Security;
  4. import java.security.KeyFactory;
  5. import java.security.PublicKey;
  6. import java.security.Signature;
  7. import java.security.spec.X509EncodedKeySpec;
  8. public class EccSignatureVerification {
  9. static {
  10. Security.addProvider(new BouncyCastleProvider());
  11. }
  12. public static void main(String[] args) throws Exception {
  13. String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n" +
  14. "YOUR_ECC_PUBLIC_KEY_HERE\n" +
  15. "-----END PUBLIC KEY-----";
  16. String signedHexString = "SIGNED_DATA_FROM_JS"; // 替换为从 JS 获取的十六进制字符串
  17. boolean isVerified = verifySignature("Hello, ECC!", signedHexString, publicKeyPEM);
  18. System.out.println("Signature Verified: " + isVerified);
  19. }
  20. private static boolean verifySignature(String originalData, String hexSignedData, String pemPublicKey) throws Exception {
  21. byte[] signedBytes = Hex.decode(hexSignedData.trim());
  22. // 转换 PEM 格式公钥为 Public Key 对象
  23. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(java.util.Base64.getDecoder().decode(
  24. pemPublicKey.replaceAll("-----(BEGIN|END) PUBLIC KEY-----", "").replaceAll("\\s+", "")));
  25. KeyFactory keyFactory = KeyFactory.getInstance("EC");
  26. PublicKey publicKey = keyFactory.generatePublic(keySpec);
  27. Signature signatureVerifier = Signature.getInstance("SHA256withECDSA");
  28. signatureVerifier.initVerify(publicKey);
  29. // 更新要验证的数据并验证签名
  30. signatureVerifier.update(originalData.getBytes());
  31. return signatureVerifier.verify(signedBytes);
  32. }
  33. }

注意事项

  • 请替换占位符 "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

注册

已经有帐号?