2016-10-04 154 views
0

我必须加密文件到pgp格式。我有我的公钥以.asc格式Java:如何从.asc文件创建java.security.Key?

密码init()方法需要传入一个公钥。什么是使用文件创建该密钥的方法。在我的情况下它是.asc文件。

Cipher cipher; 
    Key publicKey = null; 

    try 
    { 
     cipher = Cipher.getInstance("RSA", "BC"); 




    } catch (NoSuchAlgorithmException | NoSuchProviderException | NoSuchPaddingException e) { 
     String msg = "failed to create output stream"; 
     LOGGER.error(msg, e); 
     throw new RuntimeException(msg, e); 
    } 

    try { 
     publicKey = getPublicKey(publicKeyPath); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
    } catch (InvalidKeyException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return (new CipherOutputStream(outputStream, cipher)); 

我得到错误: java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:无效的密钥格式

我的方法的getpublickey看起来像(但是我认为,我没有做这样的文件,其公共密钥本身)

public static PublicKey getPublicKey(String filename) 
     throws Exception { 

     byte[] keyBytes = Files.readAllBytes(new File(filename).toPath()); 

     X509EncodedKeySpec spec = 
      new X509EncodedKeySpec(keyBytes); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     return kf.generatePublic(spec); 
     } 

Public_key.asc样子:

  -----BEGIN PGP PUBLIC KEY BLOCK----- 
      Version: Encryption Desktop 10.3.2 (Build 16127) 

      mQENBFYhXNoBCACgX/u03wm8cLqmTZiKGx6H/1ZUoBsfaDB2rdG2D8jYQzvaq4MA 
      hZWBEVhA2BGKrNI+a2SDhKGAY4OK7aUZVAVG1bfQNVdNe80TbEF8g/wO2FreYPkb 
      ojPtkwgyzsvb1BKwgRM1UMjkM5OWnhAPDhFDc39SFbmHLsXrURqFqJd9T3xzF6ty 

      ................................................................ 


      D4WXvHpPXCJcwCBe+/81ZpjxlrLkUu8bO79jxZdKcI5ZRpmIe/VPJoDUVKLvl9n3 
      ANvDJGdGcW3x6RyL9QOnoRDf6njimqcTm8UqImdLCz4TFdv94dvM4K0NOWuFdYal 
      E9Q+U0Q7aiaWn+Kt+OYpd6++m7wnJRH/q0H69LIR9v3Td3udzOaxv/gzXF1BFuAS 
      DQs6iA== 
      =ckOV 
      -----END PGP PUBLIC KEY BLOCK----- 

下面是这个键的属性:从罗伯特

enter image description here

+1

不能使用与AES的公钥。 AES是具有128位,192位或256位随机密钥的对称密码。公钥是RSA,EC或其他非对称算法。就像在你的油箱里放电池一样。 – erickson

+1

您需要特殊的PGP密钥加载器,因为与密钥格式相关的X.509与PGP不兼容。 – Robert

+1

为什么不使用Bouncy Castle内的PGP功能? –

回答

1

回复和马腾Bodewes是要走的途径之一。

我的公钥是在.skr .ASC文件和私有密钥(私钥环)

我实现这种方式,它的工作对我来说:

   public static PublicKey getPublicKey(
        String filePath) 
        throws PGPException, NoSuchProviderException, FileNotFoundException, IOException 
       { 
        PGPPublicKey encKey = readPublicKey(new FileInputStream(filePath)); 
        return new JcaPGPKeyConverter().setProvider("BC").getPublicKey(encKey); 
       } 




       public static PrivateKey getPrivateKey( 
         InputStream in, char[]  passwd) 
         throws IOException, PGPException, NoSuchProviderException 
        { 
         in = PGPUtil.getDecoderStream(in); 

         PGPSecretKeyRingCollection  pgpSec = new PGPSecretKeyRingCollection(in); 

         // 
         // we just loop through the collection till we find a key suitable for encryption, in the real 
         // world you would probably want to be a bit smarter about this. 
         // 

         // 
         // iterate through the key rings. 
         // 
         Iterator<?> rIt = pgpSec.getKeyRings(); 

         while (rIt.hasNext()) 
         { 
          PGPSecretKeyRing kRing = (PGPSecretKeyRing)rIt.next();  
          Iterator<?>      kIt = kRing.getSecretKeys(); 

          while (kIt.hasNext()) 
          { 
           PGPSecretKey k = (PGPSecretKey)kIt.next(); 

           if (k != null) 
           { 
            PGPPrivateKey pk = k.extractPrivateKey(passwd, "BC"); 
            return new JcaPGPKeyConverter().setProvider("BC").getPrivateKey(pk); 
           } 
          } 
         } 

         throw new IllegalArgumentException("Can't find secured key in key ring."); 
        } 

       public static PGPPublicKey readPublicKey( 
         InputStream in) 
         throws IOException, PGPException 
        { 
         in = PGPUtil.getDecoderStream(in); 

         PGPPublicKeyRingCollection  pgpPub = new PGPPublicKeyRingCollection(in); 

         // 
         // we just loop through the collection till we find a key suitable for encryption, in the real 
         // world you would probably want to be a bit smarter about this. 
         // 

         // 
         // iterate through the key rings. 
         // 
         Iterator<?> rIt = pgpPub.getKeyRings(); 

         while (rIt.hasNext()) 
         { 
          PGPPublicKeyRing kRing = (PGPPublicKeyRing)rIt.next();  
          Iterator<?>      kIt = kRing.getPublicKeys(); 

          while (kIt.hasNext()) 
          { 
           PGPPublicKey k = (PGPPublicKey)kIt.next(); 

           if (k.isEncryptionKey()) 
           { 
            return k; 
           } 
          } 
         } 

         throw new IllegalArgumentException("Can't find encryption key in key ring."); 
        }