【发布时间】:2018-01-09 22:07:28
【问题描述】:
基本上我正在尝试验证使用 openssl 的签名如下所示:
openssl dgst -sha256 -verify prime192v1-pub-v1.pem -signature signatureFile.bin < dataFile.bin
... 为了在 android 上做到这一点,我需要创建 PublicKey 对象。我使用的方法在kf.generatePublic(new X509EncodedKeySpec(encoded)) 行抛出java.security.spec.InvalidKeySpecException: Unexpected key type。
import org.spongycastle.util.encoders.Base64;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
public class SO {
public static PublicKey getPublicKeyFromString(String key) throws IOException, GeneralSecurityException {
String publicKeyPEM = key;
publicKeyPEM = publicKeyPEM.replace("-----BEGIN PUBLIC KEY-----\n", "");
publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", "");
byte[] encoded = Base64.decode(publicKeyPEM);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(new X509EncodedKeySpec(encoded));
}
}
这就是我调用方法的方式:
SO.getPublicKeyFromString(
"-----BEGIN PUBLIC KEY-----\n" +
"MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEXMHnQfWiM4oCaLfx296llgz7iaVv\n" +
"avMPppkzVNZAxtlNLhFlXnNWD0Mw9yzP8/Go\n" +
"-----END PUBLIC KEY-----"
);
有人知道我做错了什么吗?
【问题讨论】:
-
是的,它不是 RSA 公钥,而是椭圆曲线 (P192) 公钥。
-
Can't read OpenSSL-generated ECDSA key from Java: InvalidKeySpecException、How to create ECDSA keypair (256bit) for bitcoin curve (secp256k1) using spongy castle?、How to load PEM encoded Elliptic Curve public keys into Bouncy Castle?、How can I get a PublicKey object from EC public key bytes?、How do I load an Elliptic Curve PEM encoded Private Key?等
标签: java android openssl public-key pem