公钥和私钥的编码方式不同。私钥在PKCS#8中编码,而公钥则没有。相反,它们根据ASN.1规范在X.509中编码。
Key.getFormat()方法的描述:
返回此密钥的主要编码格式的名称;如果此密钥不支持编码,则返回null。如果存在针对此密钥的ASN.1规范,则根据适当的ASN.1数据格式来命名主要编码格式。例如,公共密钥的ASN.1数据格式的名称是X.509标准定义的SubjectPublicKeyInfo。在这种情况下,返回的格式为“
X.509”。同样,私钥的ASN.1数据格式的名称是PrivateKeyInfo,如PKCS#8标准所定义;在这种情况下,返回的格式为“
PKCS#8”。
据此,您应该将其读取为X.509,而不是将其作为PKCS#8读取。
考虑从以下位置更改您的公共密钥读取代码:
PKCS8EnpredKeySpec keySpec = new PKCS8EnpredKeySpec(data);
至:
X509EnpredKeySpec keySpec = new X509EnpredKeySpec(data);



