2009-11-24 5 views
3

J'essaye de crypter une chaîne de Java en Python, en utilisant la librairie Bouncy Castle J2ME du côté client et Python M2Crypto de l'autre côté.Java to Python RSA

Tout est assez bon, je peux le décrypter correctement, mais le rembourrage est le problème.

La lib M2Crypto me donne (pour autant que je peux dire) que ces régimes Rembourrage: no_padding = 3 pkcs1_padding = 1 sslv23_padding = 2 pkcs1_oaep_padding = 4

Alors que le château gonflable J2ME offre seulement: NoPadding OAEPWithAndPadding PKCS5Padding SSL3Padding

donc, je peux utiliser NoPadding entre les deux, mais les chaînes qui sont générées après le décryptage sont remplis de caractère pêle-mêle s.

Je voudrais vraiment régler le remplissage, mais je ne sais pas comment convertir les schémas de remplissage/si c'est possible.

Aidez-moi à comprendre cela, ça me tue!

Répondre

1

Je ne suis pas familier avec Bouncy Castle, mais je suppose que vous utilisez en quelque sorte RSAEngine qui met en œuvre AsymmetricBlockCipher donc vous devriez être en mesure d'utiliser PKCS1 ou non?

Et il semble également être OAEP de soutien, qui, compte tenu des bons paramètres devraient également fonctionner.

+1

Je suppose que j'étais. J'ai posté cela après des heures de bricolage en désespoir de cause, et voilà que c'était quelque chose de plutôt simple. Il s'avère que si j'utilise la chaîne "RSA/ECB/PKCS1Padding" avec le fournisseur "BC", il peut être lu par python en utilisant PKCS1. La BCE est obligatoire, sinon il y a des caractères indésirables partout. En outre, j'ai dû m'assurer que la clé était au format DER, et le lire avec le X509EncodedKeySpec pour qu'il soit lu. DER = PEM moins l'en-tête (---- BEGIN ...), et base64 décodé. –

2

Le château gonflable fournit un rembourrage. Si vous voulez par exemple faire un RSA avec un rembourrage PKCS1 que vous devez faire ceci:

public static PKCS1Encoding create_rsa_public(RSAKeyParameters PublicKey){ 
    RSAEngine engine=new RSAEngine(); 
    PKCS1Encoding encrypto=new PKCS1Encoding(engine); 
    encrypto.init(true,PublicKey); 
    return encrypto; 
} 

Cette fonction vous renvoie un moteur RSA avec PKCS1Encoding.