Можно, но все равно скрыто произойдет выработка ключей согласования (шифрование возможно на секретном ключе или ключе согласования). При этом передать сертификат для зашифрования и закрытый ключ для расшифрования ключа можно. Попробуйте использовать Cipher.getInstance("GostTransport").
Например:
final KeyGenerator kg = KeyGenerator.getInstance("GOST28147");
final SecretKey key = kg.generateKey();
// Зашифровали секретный ключ.
Cipher cipher = Cipher.getInstance("GostTransport");
cipher.init(Cipher.WRAP_MODE, responderCert);
final byte[] wrap = cipher.wrap(key);
// Зашифровали данные на симметричном ключе
cipher = Cipher.getInstance("GOST28147");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
final byte[] encryptedData = cipher.doFinal(TEXT);
// ... Передали зашифрованный секретный ключ ...
cipher = Cipher.getInstance("GostTransport");
// Расшифруем симметричный ключ
cipher.init(Cipher.UNWRAP_MODE, responderPrivateKey);
final SecretKey key_ = (SecretKey)cipher.unwrap(wrap, null, Cipher.SECRET_KEY);
// Расшифруем данные на с помощью расшифрованного симм. ключа
cipher = Cipher.getInstance("GOST28147");
cipher.init(Cipher.DECRYPT_MODE, key_, iv);
final byte[] decr_ = cipher.doFinal(encr);
// Сравним результат и исходные данные
if (Arrays.equals(TEXT, decr_)) System.out.println("OK");
Похожий код в примере Encrypt в Crypt_samples, CMSSignAndEncrypt в CMS_samples (samples.jar).
Отредактировано пользователем 28 декабря 2012 г. 14:41:11(UTC)
| Причина: Не указана