Я хочу обмениваться симметричными ключами между клиентской и серверной программой, работающей через 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 за вас - person zapl   schedule 24.11.2015