IllegalBlockSize Исключение при выполнении RSA на байтах строк
Я пытаюсь написать классы шифрования и дешифрования RSA на Java для сервера, где клиент будет передавать строки назад и вперед. У меня есть следующий код для классов:
public class RSAEncryption {
public static final String KEYGENALGORITHM = "RSA";
public static final String ALGORITHM = "RSA/ECB/PKCS1Padding";
public static KeyPairContainer generateKey() {
KeyPairGenerator keyGen;
KeyPair key;
try {
keyGen = KeyPairGenerator.getInstance(KEYGENALGORITHM);
keyGen.initialize(1024);
key = keyGen.generateKeyPair();
return new KeyPairContainer(key.getPublic(), key.getPrivate());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
System.out.println("Error: No such algorithm");
}
return null;
}
public static String pubkeyToString(PublicKey key){
byte[] array = key.getEncoded();
BASE64Encoder encoder = new BASE64Encoder();
String tempstring = encoder.encode(array);
return tempstring;
}
public static PublicKey stringToPubKey(String string){
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] array = decoder.decodeBuffer(string);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(array);
KeyFactory keyFact = KeyFactory.getInstance(KEYGENALGORITHM);
PublicKey pubKey = keyFact.generatePublic(x509KeySpec);
return pubKey;
} catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
}
public static byte[] rSAencrypt(byte[] plaintext, String keystring) {
Cipher cipher;
try {
PublicKey key = stringToPubKey(keystring);
cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = cipher.doFinal(plaintext);
//String cipherText = new String(cipherTextbytes);
return cipherText;
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static byte[] rSAdecrypt(byte[] ciphertext, PrivateKey key){
Cipher cipher;
try {
//byte[] ciphertext = ciphertextstring.getBytes();
cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedText = cipher.doFinal(ciphertext);
return decryptedText;
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
У меня есть следующий код для тестового класса:
public class RSAEncryptionKeyDemo {
public static void main(String[] args){
KeyPairContainer keyPair = RSAEncryption.generateKey();
PublicKey pubKey = keyPair.getPublicKey();
String pubKeytext = RSAEncryption.pubkeyToString(pubKey);
System.out.println(pubKeytext);
String plaintext = "Hello world!";
byte[] ciphertext = RSAEncryption.rSAencrypt(plaintext.getBytes(), pubKeytext);
String ciphertextString = new String(ciphertext);
System.out.println(ciphertextString);
PrivateKey privkey = keyPair.getPrivateKey();
byte[] decryptedText = RSAEncryption.rSAdecrypt(ciphertextString.getBytes(), privkey);
String decryptedTextstring = new String(decryptedText);
System.out.println(decryptedTextstring);
}
}
Тем не менее, когда я пытаюсь запустить тестовый класс, генерация ключей и шифрование работают нормально, но я получаю сообщение об ошибке при попытке расшифровать. Ошибка javax.crypto.IllegalBlockSizeException: данные не должны быть длиннее 128 байт, однако мои данные определенно меньше 128 байт.
Я могу подтвердить, что преобразование открытого ключа в строку и обратно возвращает один и тот же открытый ключ. Я также пытался протестировать код, используя только байты, и это прекрасно работает. Ошибка, по-видимому, заключается в попытке расшифровать байты, взятые из строки.
Есть ли способ расшифровать байты, взятые из строки, не выбрасывая эту ошибку? Заранее спасибо, это очень ценится.
РЕДАКТИРОВАТЬ: я думаю, я мог бы изолировать проблему. Я пытаюсь превратить зашифрованный байтовый массив в строку, а затем извлечь из нее байты, но зашифрованный байтовый массив все равно не переводится должным образом в строку, поэтому, когда я получаю байты, он не извлекает исходный зашифрованный байтовый массив. , Это правильно, и если да, то как мне правильно превратить байтовый массив в строку, чтобы мы могли ее заменить?