проблема чтения файла publickey и использования ключа для шифрования другого файла - PullRequest
1 голос
/ 25 мая 2011

Я боролся с чтением файла publickey, в котором я хочу получить ключ ключа в файле и использовать его для шифрования другого файла. Я использую RSA PKCS1 v1.5 для шифрования и подписывания файла с помощью алгоритма хэширования SH1, но это не проблема, проблема в том, что мне предоставлен файл 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 ]

1 голос
/ 26 мая 2011

Нашел решение, но пока не уверен, что это правильное решение, потому что мне все еще нужно получить 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 =="

1 голос
/ 25 мая 2011

Ключи AFAIK X509 - это двоичные файлы, закодированные с использованием ASN.1.Поэтому вопрос о новых строках в конце не имеет никакого смысла.

Если у вас есть текстовый файл, у вас есть файл в кодировке PEM, и я в настоящее время не уверен, какой KeySpec вы должны использовать в этом случае.

Вы можете преобразовать кодированный ключ PEM в кодированный ключ DER (например, используя OpenSSL), или вы можете использовать BouncyCastle , который поддерживает загрузку кодированных ключей PEM.

Кстати: использование keyfis.read(encKey); опасно, так как метод read читает только байты encKey, но не обязан.Лучше создать DataInputStream из InputStream и использовать readFully (encKey):

new DataInputStream(keyfis).readFully(encKey);
...