1

我一直在努力阅读一个公钥文件,我想在文件中获取密钥字符串并使用它来加密另一个文件。我正在使用 RSA PKCS1 v1.5 使用 SH1 散列算法对文件进行加密和签名,但这不是问题,问题是我已经获得了要在加密时使用的公钥文件,我似乎无法通过阅读获胜文件并生成一个 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();
       }
}

有人可以帮忙吗!!

4

2 回答 2

1

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

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

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

顺便说一句:使用keyfis.read(encKey);是危险的,因为 read 方法只读取 encKey 字节,但不必这样做。更好地从 InputStream 创建一个 DataInputStream 并使用 readFully(encKey):

new DataInputStream(keyfis).readFully(encKey);
于 2011-05-25T15:19:47.447 回答
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=="

于 2011-05-26T12:35:46.843 回答