Java 尝试加密过多数据时获取非法BlockSize

Java 尝试加密过多数据时获取非法BlockSize,java,encryption,public-key-encryption,Java,Encryption,Public Key Encryption,这是我的常数 //Encryption fields /** Algorithm=RSA Mode=ECB Padding=PKCS1Padding*/ public static final String ALGORITHM_MODE_PADDING = "RSA/ECB/PKCS1Padding"; /** Algorithm=RSA */ public static final String ALGORITHM = "RSA"; /** Provider=BouncyCastle */ p

这是我的常数

//Encryption fields
/** Algorithm=RSA Mode=ECB Padding=PKCS1Padding*/
public static final String ALGORITHM_MODE_PADDING = "RSA/ECB/PKCS1Padding";
/** Algorithm=RSA */
public static final String ALGORITHM = "RSA";
/** Provider=BouncyCastle */
public static final String PROVIDER = "BC";
/** Key size for the public and private keys */
public static final int KEY_SIZE = 1024;
我制作了如下两个公钥/私钥:

//Generate the keys
KeyPairGenerator kpg = KeyPairGenerator.getInstance(ALGORITHM,PROVIDER);
kpg.initialize(KEY_SIZE);
KeyPair kp = kpg.generateKeyPair();
PublicKey pubk = kp.getPublic();
PrivateKey prvk = kp.getPrivate();
byte[] privateKey = Base64.decodeBase64(pKey); //decode
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);
KeyFactory factory = KeyFactory.getInstance(ALGORITHM,PROVIDER);
PrivateKey privKey = factory.generatePrivate(keySpec);
Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, privKey);
return cipher.doFinal(data);
我是这样解密的:

//Generate the keys
KeyPairGenerator kpg = KeyPairGenerator.getInstance(ALGORITHM,PROVIDER);
kpg.initialize(KEY_SIZE);
KeyPair kp = kpg.generateKeyPair();
PublicKey pubk = kp.getPublic();
PrivateKey prvk = kp.getPrivate();
byte[] privateKey = Base64.decodeBase64(pKey); //decode
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);
KeyFactory factory = KeyFactory.getInstance(ALGORITHM,PROVIDER);
PrivateKey privKey = factory.generatePrivate(keySpec);
Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, privKey);
return cipher.doFinal(data);
这适用于少量数据,当数据变大时,例如263字节if因非法BlockSizeException而失败。我认为这是因为数据大于256字节,但这只是猜测,我不知道如何修复它

我做错了什么

我将其更改为使用更新方法,但仍然存在相同的问题:

// encryption pass
cipher.init(Cipher.ENCRYPT_MODE, privKey);
byte[] cipherText = new byte[cipher.getOutputSize(data.length)];
int ctLength = cipher.update(data, 0, data.length, cipherText, 0);
ctLength += cipher.doFinal(cipherText, ctLength);

顺便说一句,我正在尝试实现数字签名。客户端拥有公钥,服务器拥有私钥。

使用RSA加密的数据不能超过模数-11的字节大小。可能是您正在寻找的。

不相关,但如果您打算加密数据,并且使用RSA,为什么要使用私钥进行加密?@krystian那么,相对于RSA,我应该使用什么呢?加密和解密在不同的时间在不同的计算机上进行devices@jax:如果要使用RSA加密,请使用receiver@if如果要实现数字签名,谁将为消息签名?服务器?-你提到它有私钥。记住,要签名,您需要使用私钥。是的,服务器有私钥,公钥存储在客户机上。我设法解决了这个非法块大小的问题。只是好奇:如果你不想使用混合方法,你会把你的数据分成小块大小的部分,然后按顺序加密吗?如果这是有意义的,那么如何确定块大小?这当然可以消除错误。block size=module\u size-11,其中module size=(module.bitLength()+7)/8.+1混合加密是正确的解决方案,因为对称密码要快得多,您不希望只使用RSA加密大块数据,这会大大降低系统的速度。我错过了您尝试实现数字签名的机会。为此,只需使用Signature类。