Я хочу обменять симметричные ключи между клиентской и серверной программой, работающей на Java RMI.Обмен симметричными ключами между клиентом и сервером с использованием открытого ключа
Мой сервер делает открытый ключ:
KeyPairGenerator keyGen = null;
try {
keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
KeyPair pair = keyGen.generateKeyPair();
this.priv = pair.getPrivate();
this.pub = pair.getPublic();
я отправляю публичный ключ к клиенту. Клиент сделает шифр, используя открытый ключ сервера. Я хочу использовать этот шифр для шифрования SealedObject, инкапсулирующего симметричный ключ, созданный клиентом, и отправку его на сервер.
//create cipher using server's public key
Cipher cipher = null;
try {
cipher = Cipher.getInstance(serverKey.getAlgorithm(), "SUN");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
try {
cipher.init(Cipher.ENCRYPT_MODE, serverKey);
} catch (InvalidKeyException e) {
e.printStackTrace();
}
Но когда я запускаю программу, у меня есть исключение при инициализации шифра:
java.security.NoSuchAlgorithmException: No such algorithm: DSA
at javax.crypto.Cipher.getInstance(Cipher.java:646)
at javax.crypto.Cipher.getInstance(Cipher.java:568)
at Client.main(Client.java:91)
Я не понимаю, почему я получаю это исключение NoSuchAlgorithm. Я не понимаю этого, если я сделаю открытый ключ RSA, а не DSA, но RSA дает мне:
javax.crypto.IllegalBlockSizeException:
Data must not be longer than 117 bytes
Так что я должен использовать, чтобы безопасно отправлять запечатанный объект, содержащий мой симметричный ключ?
Вместо этого вы не можете использовать стандартный 'SSLServerSocket'? TLS делает примерно то, что для вас – zapl
Я не могу. Это упражнение, которое мне нужно реализовать с использованием симметричных ключей, но сначала я должен безопасно обмениваться ключами с сервером. – Drok
Нет такого алгоритма: DSA объясняется здесь: http://crypto.stackexchange.com/questions/2585/why-dsa-cannot-be-used-for-encryption и причина ошибки ограничения размера блока заключается в том, что RSA является а не обычный блочный шифр: http://stackoverflow.com/questions/685470/encrypted-data-size-using-rsa-encryption-rsacryptoserviceprovider или http://security.stackexchange.com/questions/1878/what-type -of-cipher-is-rsa и поэтому может использоваться только в определенных пределах, например в https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange – zapl