如果你有一个有效的 Base64 编码的 SECP-256k1 公钥,下面的代码将使你能够使用 Web3j 获取以太坊地址。
String encodedKey = "MFYwEAYHKoZIzj0CAQYFK4EE123456789n9DSxZh3wfq0BIL5LDF5B54e07bxFiKc89K/GaKj4qrGC/Mb/KnakQBrN4khMQHLnxm7TjaxXQPxtJMV5b+A==";
byte[] decoded = Base64.getDecoder().decode(encodedKey);
String address = Keys.getAddress(Numeric.toHexString(decoded));
但是,正如评论中提到的,输入的编码密钥似乎不是 128 位公钥,而是 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 命令行工具对于将证书转换为不同格式也非常有帮助。