问题描述
|
我一直在努力阅读一个公共密钥文件,该文件要在文件中获取密钥字符串,然后用它来加密另一个文件。我正在使用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 == \”