1

ファイル内のキー文字列を取得し、それを使用して別のファイルを暗号化する公開鍵ファイルの読み取りに苦労しています。SH1ハッシュアルゴリズムを使用してファイルの暗号化と署名にRSA PKCS1 v1.5を使用していますが、それは問題ではありません。問題は、暗号化時に使用する公開鍵ファイルが提供されており、読み取りに勝てないようですファイルを開き、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

解決策は見つかりましたが、正しい解決策かどうかはまだわかりません。PrivateKeyを取得してファイルを復号化する必要がありますが、今のところ、提供されたPublicKeyをモジュラスとして使用して暗号化できましたが、指数がなく、暗号化の重要な部分ではないことを私が読んだ指数として、いくつかの一般的な番号「65537」を使用しました。

X509EncodedKeySpecの代わりにRSAPublicKeySpec(BigIntegerとBase64Decoderを使用)を使用して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 に答える
1

AFAIK X509 でエンコードされたキーは、ASN.1 を使用してエンコードされたバイナリ ファイルです。したがって、最後の改行に関する質問は意味がありません。

テキスト ファイルがある場合は、PEM でエンコードされたファイルがあり、この場合にどの KeySpec を使用する必要があるかは現在わかりません。

PEM でエンコードされたキーを DER でエンコードされたキーに変換することも (たとえば、OpenSSL を使用して)、 PEM でエンコードされたキーをロードするためのサポートとしてBouncyCastleを使用することもできます。

ところで: keyfis.read(encKey);read メソッドは encKey バイトのみを読み取るため、使用するのは危険ですが、そうする必要はありません。InputStream から DataInputStream を作成し、readFully(encKey) を使用することをお勧めします。

new DataInputStream(keyfis).readFully(encKey);
于 2011-05-25T15:19:47.447 に答える