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.
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
Oui, vous pouvez demander une chaîne de chiffrement sans remplissage. Mais pourquoi veux-tu faire ça? –
Comment demander une chaîne de chiffrement sans remplissage? – user1118764