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 命令行工具对于将证书转换为不同格式也非常有帮助。