Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从不知道密钥算法的密钥字节获取公钥_Java_Cryptography_Bouncycastle - Fatal编程技术网

Java 从不知道密钥算法的密钥字节获取公钥

Java 从不知道密钥算法的密钥字节获取公钥,java,cryptography,bouncycastle,Java,Cryptography,Bouncycastle,我有一个包含编码公钥的字节数组。 我不知道密钥算法。 我想得到公钥对象 我得到的是: import org.bouncycastle.crypto.params.AsymmetricKeyParameter; import org.bouncycastle.crypto.util.PublicKeyFactory; AsymmetricKeyParameter keyParameters = PublicKeyFactory.createKey(keyBytes); keyParameter

我有一个包含编码公钥的字节数组。 我不知道密钥算法。 我想得到公钥对象

我得到的是:

import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.util.PublicKeyFactory;

AsymmetricKeyParameter keyParameters = PublicKeyFactory.createKey(keyBytes);
keyParameters类可以是RSAKeyParameters、ECPublicKeyParameters、。。。现在我可以知道密钥算法了

然后:

KeyFactory keyFactory = KeyFactory.getInstance(keyAlgorithm);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
PublicKey publicKey = keyFactory.generatePublic(keySpec);
但我不知道是否有更直接的方法获得公钥。
我的意思是,有没有一种直接的方法可以从密钥字节中获取公钥,而不需要获取第一个AsymmetricKeyParameter(也不需要手动解码密钥字节)?

恐怕没有直接的方法。需要检查bouncycastle创建的类以了解算法(比手动解析密钥更好的选项),并使用
X509EncodedKeySpec

像这样的

 //load key with Bouncycastle 
 AsymmetricKeyParameter keyParameters = PublicKeyFactory.createKey(keyBytes);

 //get algorithm inspecting the created class
 String keyAlgorithm = extractKeyAlgorithm(keyParameters);

 //get public key
 KeyFactory keyFactory = KeyFactory.getInstance(keyAlgorithm);
 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
 PublicKey publicKey = keyFactory.generatePublic(keySpec);

AsymmetricKeyParameter
的每个实例都有密钥的参数,可以在本文中提供给X509EncodedKeySpec的构造函数。但我认为上面的代码更简单

这里有一个直接的方法(使用Bouncy Castle API):


你知道密钥的长度吗,EC密钥通常比RSA密钥短。您是否在十六进制编辑器甚至纯文本编辑器中检查过字节数组?代码有什么问题?正如您所说,可以使用AssymetricKeyParameters类来了解keyAlgorithm。据我所知,从AsymetricKeyParameters到java
PublicKey
没有直接的转换,这似乎是一个鸡或蛋的问题(要获得密钥,你必须知道算法,但只有在拥有密钥对象后才能知道算法)。除了执行
if(keyParameters instanceof rsakeparameters){use RSA algorithm}
等等,我看不到其他解决方法on@pedrofb使用PublicKeyFactory.createKey(keyBytes),我可以获得一个正确类型的AsymmetricKeyParameter。我的意思是,如果有一种方法可以直接从keyBytes获取公钥,而不需要在AsymmetricKeyParameter之前获取并检查其类。也就是说,类似于PublicKey PublicKey=PublicKeyFactory.generateKey(keyBytes)@是的,我知道密钥编辑字节的算法。但是我正在搜索的是一种从任何类型的keyBytes中自动获取公钥对象的方法。这仍然相关吗?我得到一个错误,pgpFact不接受2个参数,但只接受1个。编译器强制我删除新的JcaKeyFingerprintCalculator(),检查您的bouncycastle版本。版本1.59或1.61的bouncycastle具有此2参数构造函数,请参阅:
 public String extractKeyAlgorithm(AsymmetricKeyParameter keyParameters){

       if (keyParameters instanceof RSAKeyParameters){
             return "RSA";
       } else if (keyParameters instanceof DSAKeyParameters){
             return "DSA";
       } else {
          ...
       }
 }
public PublicKey publicKeyParse(byte[] publicKeyBytes) {
            InputStream pgpIn = PGPUtil.getDecoderStream(new ByteArrayInputStream(publicKeyBytes));
            PGPObjectFactory pgpFact = new PGPObjectFactory(pgpIn, new JcaKeyFingerprintCalculator());
            PGPPublicKeyRing pgpSecRing = (PGPPublicKeyRing) pgpFact.nextObject();
            PGPPublicKey publicKey = pgpSecRing.getPublicKey();
            JcaPGPKeyConverter converter = new JcaPGPKeyConverter();
            Provider bcProvider = new BouncyCastleProvider();
            converter.setProvider(bcProvider);
            return converter.getPublicKey(publicKey);
    }