Ответ на оригинальный вопрос:
Key key = new SecretKeySpec(byte[]keyBytes,RC4);
должно быть
Key key = new SecretKeySpec(keyBytes, "RC4");
Также
deCipher.init(Cipher.WHATEVER, keyBytes);
должно быть
deCipher.init(Cipher.WHATEVER, key);
Затем он компилируется, однако все еще есть некоторые проблемы с логикой приложения.Это опять ваше дело:).
Ответ на новый вопрос:
Проблема заключалась в ненужном использовании SecretKeySpec
.Где-то между getKey()
, keyGet()
всеми byte[]
играми и SecretKeySpec
что-то пошло не так.У меня не хватило терпения отследить его, поэтому я просто удалил его и сделал код несколько более читабельным, чтобы быть уверенным, что ничего не пропустил.Я думаю, вы все равно поймете это, так как это по-прежнему ваш код, и теперь он намного проще.
import java.security.*;
import javax.crypto.*;
public class RCC4 {
public static void main(String[] args) throws Exception {
String plain = "testisperfect";
Key key = RCC4.getKey();
String encrypted = RCC4.encrypt(plain, key);
String decrypted = RCC4.decrypt(encrypted, key);
System.out.println(encrypted);
System.out.println(decrypted);
}
private static String rc4(String plaintext, int mode, Key key) throws Exception {
Cipher cipher = Cipher.getInstance("RC4");
cipher.init(mode, key);
return new String(cipher.doFinal(plaintext.getBytes()));
}
public static String encrypt(String plaintext, Key key) throws Exception {
return rc4(plaintext, Cipher.ENCRYPT_MODE, key);
}
public static String decrypt(String ciphertext, Key key) throws Exception {
return rc4(ciphertext, Cipher.DECRYPT_MODE, key);
}
public static Key getKey() throws Exception {
KeyGenerator kg = KeyGenerator.getInstance("RC4");
SecureRandom sr = new SecureRandom();
kg.init(128, sr);
return kg.generateKey();
}
}