Я хочу зашифровать секретный ключ DSA открытым ключом RSA с помощью java. Однако, когда я это сделаю, я получаю эту ошибку:Шифровать закрытый ключ DSA с открытым ключом RSA
javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:337)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382)
Размер ключа DSA и RSA установлен равным 1024 и 2048 соответственно. Я знаю, что с помощью RSA мы не можем шифровать сообщения, имеющие размер больше, чем размер ключа RSA. Однако в этом случае размер ключа DSA меньше размера ключа RSA.
Я думаю, проблема связана с функцией getEncode(), потому что когда я проверил возвращаемое значение этой функции, я понял, что размер результата равен 335 байт.
Я хочу знать, как я могу исправить эту проблему? (Я не хочу увеличивать размер ключа RSA). Я установил размер ключа DSA на 1024. Почему размер ключа DSA имеет размер 335 байт после кодирования?
DSA и функции кейген RSA, а также функции шифрования RSA, являются следующие:
public static KeyPair generateDSAKey() {
KeyPair pair = null;
try {
KeyPairGenerator keyGen = KeyPairGenerator
.getInstance("DSA", "SUN");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(1024, random);
pair = keyGen.generateKeyPair();
} catch (Exception e) {
e.printStackTrace();
}
return pair;
}
public static KeyPair generateRSAKey() {
KeyPairGenerator kpg;
KeyPair kp = null;
try {
kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
kp = kpg.genKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return kp;
}
public static byte[] encryptRSA(byte[] msg, PublicKey pubKey) {
byte[] cipherData = null;
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
cipherData = cipher.doFinal(msg);
} catch (Exception e) {
e.printStackTrace();
}
return cipherData;
}
и я называю эту функцию для шифрования ключа DSA с RSA открытого ключа:
PrivateKey WSK = Crypto.generateDSAKey().getPrivate();
encWSK = encryptRSA(WSK.getEncoded(), RSAPublicKey);
Или он может зашифровать значение x и отправить параметры домена незашифрованные. –