读取publickey文件并使用密钥加密另一个文件的问题

时间:2011-05-25 12:15:40

标签: java encryption public-key

我一直在阅读一个publickey文件,我希望在文件中获取密钥并使用它来加密另一个文件。我正在使用RSA PKCS1 v1.5加密和使用SH1哈希algorythim对文件进行签名,但这不是问题,问题是我已经提供了加密时使用的publickey文件,我似乎无法通过阅读获胜该文件并生成一个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();
       }
}

有人可以帮忙!!

2 个答案:

答案 0 :(得分:1)

AFAIK X509编码密钥是使用ASN.1编码的二进制文件。因此,最后关于新线的问题没有任何意义。

如果你有一个文本文件,你有一个PEM编码文件,我目前不确定在这种情况下你必须使用哪个KeySpec。

您可以将PEM编码密钥转换为DER编码密钥(例如,使用OpenSSL),或者您可以使用BouncyCastle作为加载PEM编码密钥的支持。

BTW:使用keyfis.read(encKey);是危险的,因为read方法只读取encKey字节但不必读取。最好从InputStream创建一个DataInputStream并使用readFully(encKey):

new DataInputStream(keyfis).readFully(encKey);

答案 1 :(得分:1)

找到解决方案但不确定它是否是正确的解决方案因为我仍然需要获取PrivateKey并解密文件但是现在我能够使用提供的PublicKey作为模数加密它但我没有指数我只是使用了一些公共数字“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 ==”