读取公共密钥文件并使用密钥加密另一个文件时出现问题。

| 我一直在努力阅读一个公共密钥文件,该文件要在文件中获取密钥字符串,然后用它来加密另一个文件。我正在使用RSA PKCS1 v1.5通过SH1哈希算法algorythim对文件进行加密和签名,但这不是问题,问题在于我已经提供了用于加密时使用的公钥文件,我似乎无法赢读取文件并生成publicKey对象。 这是代码:
void setPublicKey(String file) 
{ 
     try 
     { 
       FileInputStream keyfis = new FileInputStream(file); 
       byte[] encKey = new byte[keyfis.available()]; keyfis.read(encKey);
       keyfis.close();
       X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
       KeyFactory keyFactory = KeyFactory.getInstance(\"RSA\");
// I get an exception on the below line
       publicKey = keyFactory.generatePublic(pubKeySpec);
     } catch (Exception e)
       {
         e.printStackTrace();
       }
}
有人可以帮忙!!     
已邀请:
AFAIK X509编码的密钥是使用ASN.1编码的二进制文件。因此,最后换行的问题没有任何意义。 如果您有一个文本文件,则有一个PEM编码的文件,我目前不确定在这种情况下必须使用哪个KeySpec。 您可以将PEM编码的密钥转换为DER编码的密钥(例如,使用OpenSSL),也可以使用BouncyCastle来支持加载PEM编码的密钥。 顺便说一句:使用
keyfis.read(encKey);
是危险的,因为该读取方法仅读取encKey字节,而不必读取。更好地从InputStream创建一个DataInputStream并使用readFully(encKey):
new DataInputStream(keyfis).readFully(encKey);
    
找到了解决方案,但是还不确定它是否是正确的解决方案,因为我仍然必须获取私钥并解密文件,但是现在我能够使用提供的公钥作为模数对它进行加密,但是我没有指数并且我只是使用一些通用数字“ 65537”作为指数 我读到它不是加密的关键部分。 我必须更改逻辑以使用RSAPublicKeySpec(它使用BigInteger和Base64Decoder)代替X509EncodedKeySpec来设置KeySpec 并继续使用KeyFactory对象生成公共密钥。 现在,此逻辑需要模数和指数。
byte[] buffer = new byte[(int) new File(file).length()];
BufferedInputStream f = new BufferedInputStream(new FileInputStream(file));
f.read(buffer);
String modulusBase64 = new String(buffer);
BASE64Decoder b64dec = new BASE64Decoder();
String exponentBase64 = \"65537\";
RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(new BigInteger    (1,                      b64dec.decodeBuffer(modulusBase64)), new BigInteger(1,     b64dec.decodeBuffer(exponentBase64)));
KeyFactory publicKeyFactory = KeyFactory.getInstance(\"RSA\");
publicKey = publicKeyFactory.generatePublic(publicKeySpec);
//这是文件中的PublicKey。 \ “J45t4SWGbFzeNuunHliNDZcLVeFU7lOpyNkX1xX + sVNaVJK8Cr0rSjUkDC8h9n + Zg7m0MVYk0byafPycmzWNDynpvj2go9mXwmUpmcQprX1vexxT5j1XmAaBZFYaJRcPWSVU92pdNh1Sd3USdFjgH0LQ5B3s8F95xdyc / 5I5LDKhRobx6c1gUs / rnJfJjAgynrE4AsNsNem + STaZWjeb4J + f5Egy9xTSEl6UWxCClgCwhXopy10cBlH8CucpP0cyckOCIOloJ7mEMRCIpp6HPpYexVmXXSikTXh7aQ7tSlTMwUziIERc / zRpyj1Nk96Y7V8AorLFrn1R4Of66mpAdQ == \”     

要回复问题请先登录注册