Java 120 个字符 ECDSA public 130 个字符或以太坊地址的密钥
Java 120 char ECDSA public key to 130 char or Ethereum address
外部系统给了我一个 120 个字符的 ECDSA 生成的 X509 public 密钥。我现在想通过将其转换为地址在以太坊中使用它。
(不是真正的密钥,而是内容示例(120 个字符))
MFYwEAYHKoZIzj0CAQYFK4EE123456789n9DSxZh3wfq0BIL5LDF5B54e07bxFiKc89K/GaKj4qrGC/Mb/KnakQBrN4khMQHLnxm7TjaxXQPxtJMV5b+A==
我看不到使用 web3j 执行此操作的简单方法,也许还有另一种方法?
我认为,查看测试,org.web3j.crypto.Keys.getAddress(String)
需要 130 个字符的十六进制版本。
如何将 120 个字符 转换为 130 个字符 十六进制表示以允许我调用 getAddress 方法或者也许有将 120 个字符的公钥转换为以太坊地址的直接方法?
如果您有一个有效的 Base64 编码的 SECP-256k1 public 密钥,以下代码将使您能够使用 Web3j 获取以太坊地址。
String encodedKey = "MFYwEAYHKoZIzj0CAQYFK4EE123456789n9DSxZh3wfq0BIL5LDF5B54e07bxFiKc89K/GaKj4qrGC/Mb/KnakQBrN4khMQHLnxm7TjaxXQPxtJMV5b+A==";
byte[] decoded = Base64.getDecoder().decode(encodedKey);
String address = Keys.getAddress(Numeric.toHexString(decoded));
但是,如评论中所述,输入的编码密钥似乎不是 128 位 public 密钥,而是 X.509 证书。因此,您需要按照以下方式做一些事情:
String encodedKey = "MFYwEAYHKoZIzj0CAQYFK4EE123456789n9DSxZh3wfq0BIL5LDF5B54e07bxFiKc89K/GaKj4qrGC/Mb/KnakQBrN4khMQHLnxm7TjaxXQPxtJMV5b+A==";
byte[] decoded = Base64.getDecoder().decode(encodedKey);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(decoded));
// TODO: Figure out how to convert this PublicKey into a byte array or BigInteger
byte[] publicKey = cert.getPublicKey();
String address = Keys.getAddress(Hex.toHexString(publicKey));
还值得一提的是,OpenSSL 命令行工具对于将证书转换为不同格式也非常有帮助。
外部系统给了我一个 120 个字符的 ECDSA 生成的 X509 public 密钥。我现在想通过将其转换为地址在以太坊中使用它。
(不是真正的密钥,而是内容示例(120 个字符))
MFYwEAYHKoZIzj0CAQYFK4EE123456789n9DSxZh3wfq0BIL5LDF5B54e07bxFiKc89K/GaKj4qrGC/Mb/KnakQBrN4khMQHLnxm7TjaxXQPxtJMV5b+A==
我看不到使用 web3j 执行此操作的简单方法,也许还有另一种方法?
我认为,查看测试,org.web3j.crypto.Keys.getAddress(String)
需要 130 个字符的十六进制版本。
如何将 120 个字符 转换为 130 个字符 十六进制表示以允许我调用 getAddress 方法或者也许有将 120 个字符的公钥转换为以太坊地址的直接方法?
如果您有一个有效的 Base64 编码的 SECP-256k1 public 密钥,以下代码将使您能够使用 Web3j 获取以太坊地址。
String encodedKey = "MFYwEAYHKoZIzj0CAQYFK4EE123456789n9DSxZh3wfq0BIL5LDF5B54e07bxFiKc89K/GaKj4qrGC/Mb/KnakQBrN4khMQHLnxm7TjaxXQPxtJMV5b+A==";
byte[] decoded = Base64.getDecoder().decode(encodedKey);
String address = Keys.getAddress(Numeric.toHexString(decoded));
但是,如评论中所述,输入的编码密钥似乎不是 128 位 public 密钥,而是 X.509 证书。因此,您需要按照以下方式做一些事情:
String encodedKey = "MFYwEAYHKoZIzj0CAQYFK4EE123456789n9DSxZh3wfq0BIL5LDF5B54e07bxFiKc89K/GaKj4qrGC/Mb/KnakQBrN4khMQHLnxm7TjaxXQPxtJMV5b+A==";
byte[] decoded = Base64.getDecoder().decode(encodedKey);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(decoded));
// TODO: Figure out how to convert this PublicKey into a byte array or BigInteger
byte[] publicKey = cert.getPublicKey();
String address = Keys.getAddress(Hex.toHexString(publicKey));
还值得一提的是,OpenSSL 命令行工具对于将证书转换为不同格式也非常有帮助。