0

ランダムに生成されたキーでファイルの内容を暗号化する Java プログラムがあります。そのキーは RSA で暗号化され、テキスト ファイルに保存されます。

今、ファイルとRSAキーが保存されているキーストアを指定したJavaプログラムがあり、最初に暗号化されたキーを復号化し、次にキーを使用してファイルを復号化する必要があります。

これが私がこれまでに持っているものです:

// Fetch the other public key and decrypt the file encryption key
java.security.cert.Certificate cert2 = keystore.getCertificate("keyForSeckeyDecrypt");
Key secKeyPublicKey = cert2.getPublicKey();
Cipher cipher = Cipher.getInstance(secKeyPublicKey.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, secKeyPublicKey);
keyFileFis = new FileInputStream(keyFile);
byte[] encryptedKey = new byte[128];
keyFileFis.read(encryptedKey);
byte[] realFileKey = cipher.doFinal(encryptedKey, 0, encryptedKey.length);
Key realKey = //  THE PROBLEM!!!;
keyFileFis.close();

要するに、キー テキスト ファイルから暗号化されたキーを取得して復号化すると、復号化されたキーがバイト配列として取得されます。これを再びキー変数にするにはどうすればよいでしょうか。

この方法でキーを生成しました:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
Key secKey = keyGen.generateKey();
cipher.init(Cipher.ENCRYPT_MODE, secKey);

そして、このように暗号化しました:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.genKeyPair();
PrivateKey privateKey = kp.getPrivate();
Cipher keyCipher = Cipher.getInstance("RSA");
keyCipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encryptedKey = keyCipher.doFinal(secKey.getEncoded());
FileOutputStream keyStream = new FileOutputStream("key.txt");
keyStream.write(encryptedKey);
keyStream.close();
4

2 に答える 2

1

私は試していませんが、APIをクリックすると、SecretKeySpecが探しているものになる可能性があります。

SecretKeySpec(byte[] key, String algorithm)

(プロバイダーベースの)SecretKeyFactoryを経由せずに、バイト配列からSecretKeyを構築するために使用できます。

このクラスは、バイト配列として表すことができ、キーパラメータが関連付けられていない生の秘密キー(DESまたはトリプルDESキーなど)にのみ役立ちます。

于 2012-12-15T20:53:04.773 に答える
0

私がそれを正しく理解すれば、これはうまくいくはずです。

Key privateKey = keyStore.getKey("youralias", "password".toCharArray());
PublicKey publicKey = keyStore.getCertificate("youralias").getPublicKey();

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
Key secKey = keyGen.generateKey();

Cipher keyCipher = Cipher.getInstance("RSA");
keyCipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encryptedKey = keyCipher.doFinal(secKey.getEncoded());

// Write & Read to/from file!

Cipher decryptCipher = Cipher.getInstance("RSA");
decryptCipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] decryptedKey = decryptCipher.doFinal(encryptedKey);

boolean equals = Arrays.equals(secKey.getEncoded(), new SecretKeySpec(decryptedKey, "AES").getEncoded());
System.out.println(equals?"Successfull!":"Failed!");
于 2012-12-15T23:07:38.260 に答える