2010-07-02 19 views
1

Voici mes constantesObtenir IllegalBlockSize en essayant de chiffrer les données trop

//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; 

J'ai fait deux clés publiques/privées comme ceci:

//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(); 

Je suis Décryptage comme ceci:

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); 

Cela fonctionne avec de petites quantités de données, lorsque les données deviennent plus grandes telles que 263 octets en cas d'échec avec une exception IllegalBlockSizeException. Je pense que c'est parce que les données sont supérieures à 256 octets mais c'est juste une supposition et je n'ai aucune idée de la façon de le réparer.

Qu'est-ce que je fais mal?

je l'ai changé d'utiliser la méthode de mise à jour, mais toujours le même problème:

// 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); 

Je suis en train de mettre en œuvre les signatures numériques de la manière. Le client a la clé publique et le serveur a la clé privée.

+0

Non lié, mais si vous voulez chiffrer des données et que vous utilisez RSA, pourquoi utilisez-vous une clé privée pour le chiffrement? – Krystian

+0

Bon point, j'ai raté ça. –

+0

@krystian alors que devrais-je utiliser par opposition à RSA? Le cryptage et le décryptage sont effectués à des moments différents sur différents appareils – jax

Répondre

2

Vous ne pouvez pas utiliser RSA pour crypter plus de données que la taille en octets du module - 11. This est probablement ce que vous cherchez.

+0

Juste curieux: si vous didn didn ne voulez pas vous embêter avec la méthode hybride, pourriez-vous simplement diviser vos données en sections d'un petit bloc et crypter séquentiellement? Si cela a du sens, comment déterminez-vous la taille du bloc? –

+0

Cela permettrait bien sûr de se débarrasser des erreurs. block size = modulus_size - 11, où module size = (modulus.bitLength() + 7)/8. –

+0

+1 Le chiffrement hybride est la bonne solution car les chiffrements symétriques sont beaucoup plus rapides, vous ne voudriez pas chiffrer de gros morceaux de données en utilisant seulement RSA - cela ralentirait beaucoup le système. – Krystian