2010-04-05 8 views
0

Où puis-je trouver un exemple de chiffrement RSA qui fait pas utilise "NoPadding"?RSA exemple qui n'utilise pas NoPadding

--update

Mieux: comment faire cette course SSCCE correctement sans jeter les "trop ​​de données pour le bloc RSA" exception?

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 TestRSA { 

    public static void main(String[] args) throws Exception { 

byte[] input = new byte[100]; 

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

    } 
} 

--update: environ boucle

utilisant:

byte[] cipherText = new byte[input.length]; 
for (int i = 0; i < input.length; i++) { 
    byte[] singleByteArray = new byte[] { input[i] }; 
    cipherText[i] = cipher.doFinal(singleByteArray)[0]; 
} 

ne fonctionne pas bien. Pour une raison inconnue, cipherText est devenu plein de zéros - même si l'entrée est un tableau de 0x03.

+0

Donc un exemple qui utilise un schéma de remplissage? – Omar

+0

@Baddle question mise à jour –

+0

bien, avez-vous essayé d'appeler simplement 'getInstance (" RSA ")'? Avez-vous réellement besoin de BC pour cela? – Bozho

Répondre

3

Le Sun Providers Documentation du fournisseur SunJCE vous indique les spécifications de remplissage autorisées dans l'argument Cipher.getInstance(). Essayez Cipher.getInstance("RSA/ECB/PKCS1PADDING");

EDIT:
Il est pas un problème de remplissage, il est plus que vous avez une mauvaise compréhension de la façon dont RSA est utilisé dans la cryptographie. Vous pouvez soit 1) rendre le module plus grand que les données, 2) utiliser un Hybrid cryptosystem, ou 3) le moins souhaitable est de fractionner manuellement l'entrée en morceaux qui sont chacun plus petits que le module. Si vous utilisez le remplissage PKCS1 (ce qui est généralement recommandé), l'entrée ne doit pas dépasser n-11 octets, où n est le nombre d'octets requis pour stocker le module RSA.

+0

J'ai essayé cela, mais je reçois la même erreur .. s'il vous plaît, voir ma mise à jour. –

+0

Oui, car vous utilisez une erreur RSA. Vous ne pouvez pas chiffrer RSA une valeur plus grande que le module. À moins que vous ne sachiez vraiment ce que vous faites. –

+1

Longueur du module en octets moins 11 est la longueur maximale du message dans PKCS # 1. – Accipitridae

-1
Cipher cipher = Cipher.getInstance("RSA"); 
cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
byte[] cipherData = cipher.doFinal(content); 

Mise à jour: Êtes-vous sûr que vous avez besoin bouncycastle pour cela? Et pourquoi ne pas simplement passer RSA comme argument à Cipher.getInstance(..)?

Mise à jour 2: Pourquoi n'essayez-vous aucun de ces RSA encryption examples?

+0

Merci. S'il vous plaît, voir ma mise à jour .. –

+0

Passant juste RSA à Cipher.getInstance() se produisent le même échec. Ce code est une adaptation (un essai) d'un exemple de livre. –

+0

donc, vous pouvez essayer de se débarrasser de "BC". Le fournisseur par défaut prend également en charge RSA. – Bozho