Говоря о javax.crypto.Cipher
Я пытался шифровать данные с помощью Cipher.getInstance("RSA/None/NoPadding", "BC")
, но я получил исключение:
ArrayIndexOutOfBoundsException: too much data for RSA block
Похоже, что-то связано с "NoPadding", поэтому, читая прописку, похоже, что CBC - лучший подход к использованию здесь.
Я нашел в google что-то о "RSA/CBC/PKCS # 7", что это за "PKCS # 7"? И почему его нет в списке название стандартного алгоритма солнца?
Update:
Мне интересно, если это проблема с заполнением, почему этот пример работает нормально?
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import javax.crypto.Cipher;
/**
* Basic RSA example.
*/
public class BaseRSAExample
{
public static void main(
String[] args)
throws Exception
{
byte[] input = new byte[] { (byte)0xbe, (byte)0xef };
Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC");
KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC");
// create the keys
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(
new BigInteger("d46f473a2d746537de2056ae3092c451", 16),
new BigInteger("11", 16));
RSAPrivateKeySpec privKeySpec = new RSAPrivateKeySpec(
new BigInteger("d46f473a2d746537de2056ae3092c451", 16),
new BigInteger("57791d5430d593164082036ad8b29fb1", 16));
RSAPublicKey pubKey = (RSAPublicKey)keyFactory.generatePublic(pubKeySpec);
RSAPrivateKey privKey = (RSAPrivateKey)keyFactory.generatePrivate(privKeySpec);
// encryption step
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherText = cipher.doFinal(input);
// decryption step
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] plainText = cipher.doFinal(cipherText);
}
}
Обновление 2:
Я понял, что даже если я использую только Cipher.getInstance("RSA", "BC")
, он выдает одно и то же исключение.