2017-03-02 5 views
0

Je suis en train de jouer avec RSA sur Android, et je réalise que le cryptage RSA génère un texte chiffré différent avec le même texte et la même clé publique, grâce au padding. De même, les signatures numériques diffèrent-elles entre les exécutions pour le même texte en clair et la même clé privée, et existe-t-il un moyen de générer les mêmes signatures numériques?Est-il possible de générer 2 textes chiffrés RSA identiques avec le même texte en clair et la même clé publique?

Voici mon keygen:

 KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); 
     AlgorithmParameterSpec spec = null; 
     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 
      spec = new KeyPairGeneratorSpec.Builder(ctx) 
        .setAlias(mAlias) 
        .setSubject(new X500Principal("CN=" + mAlias)) 
        .setSerialNumber(BigInteger.valueOf(1337)) 
        .setStartDate(start.getTime()) 
        .setEndDate(end.getTime()) 
        .build(); 
     } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      spec = new KeyGenParameterSpec.Builder(mAlias, 
        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) 
        .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512) 
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) 
        .build(); 
     kpGenerator.initialize(spec); 
     KeyPair kp = kpGenerator.generateKeyPair(); 

Voilà comment je cryptant:

 KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
     keyStore.load(null); 
     KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mAlias, null); 
     Cipher cip = null; 

     RSAPublicKey pubKey = (RSAPublicKey)entry.getCertificate().getPublicKey(); 
     cip = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cip.init(Cipher.ENCRYPT_MODE, pubKey); 

     byte[] encryptBytes = cip.doFinal(challenge.getBytes()); 

Merci.

+0

Pouvez-vous nous montrer comment vous chiffrer? L'algorithme RSA * en lui-même est déterministe, donc, compte tenu du même texte en clair et de la même clé publique, la sortie chiffrée ne devrait pas différer. Si vous utilisez Java [Cipher] (http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#Cipher), certains modes (par exemple CBC) commenceront par un IV aléatoire, sauf indication contraire. – ephemient

+0

Oui, vous pouvez demander une chaîne de chiffrement sans remplissage. Mais pourquoi veux-tu faire ça? –

+0

Comment demander une chaîne de chiffrement sans remplissage? – user1118764

Répondre

1

Pour générer toujours le même texte de chiffrement, utilisez un algorithme sans bourrage. Remplacez RSA/ECB/PKCS1Padding par RSA/ECB/NoPadding.

Mais, pour des raisons de sécurité, je suggère d'utiliser un algorithme avec rembourrage, et si possible OAEP RSA/ECB/OAEPWithSHA-1AndMGF1Padding (Il est disponible à partir d'android 23). Le rembourrage ne doit pas être un problème pour le côté de décryptage

A PCKS # 1 signature numérique produira le même résultat pour la même clé privée et des données à signer

+0

Merci! Cela marche. Seriez-vous capable de savoir si le matériel clé n'est accessible que par le processus/l'application de création? En outre, le matériel clé est-il persistant (dans le logiciel KeyStore et dans le logiciel KeyStore soutenu par le matériel)? Par cela, je veux dire que les clés dans le KeyStore sont supprimées après la désinstallation de l'application de création, ainsi que lors d'une réinitialisation d'usine? – user1118764

+0

Le matériau de clé est uniquement accessible (mais non extractible) par l'application qui l'a créé. Le support matériel dépend du périphérique, s'il est disponible, il est utilisé (il existe une méthode api pour vérifier s'il existe). Si vous désinstallez l'application ou réinitialisez l'appareil, les clés ne seront plus accessibles. – pedrofb

+0

Merci. Qu'en est-il d'un appareil enraciné? Est-ce que d'autres applications ou l'utilisateur root pourraient accéder au matériel clé dans ce cas? En outre, une réinitialisation d'usine efface-t-elle réellement les éléments clés qui sont sauvegardés par le matériel (résidant dans le TEE)? – user1118764