2017-03-02 3 views
0

Ich spiele mit RSA auf Android, und mir ist klar, dass die RSA-Verschlüsselung verschiedene Chiffretext mit dem gleichen Klartext und öffentlichen Schlüssel erzeugt, wegen Padding Gibt es eine Möglichkeit, denselben Chiffretext mit demselben Klartext und öffentlichen Schlüssel zu generieren?Ist es möglich, 2 identische RSA-Chiffretext mit dem gleichen Klartext und öffentlichen Schlüssel zu generieren?

Unterscheiden sich die digitalen Signaturen in Läufen bei gleichem Klartext und gleichem privaten Schlüssel, und gibt es eine Möglichkeit, dieselben digitalen Signaturen zu generieren?

Hier ist mein 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(); 

Hier ist, wie ich die Verschlüsselung:

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

Dank.

+0

Können Sie uns zeigen, zu unterschreiben produzieren, wie die Verschlüsselung Sie? Der RSA-Algorithmus * allein ist deterministisch. Wenn also derselbe Klartext und öffentliche Schlüssel verwendet wird, sollte sich die verschlüsselte Ausgabe nicht unterscheiden. Wenn Sie Java [Cipher] (http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#Cipher) verwenden, beginnen einige der Modi (zB CBC) mit eine zufällige IV, wenn nicht anders angegeben. – ephemient

+0

Ja, Sie können eine Verschlüsselungszeichenfolge ohne Auffüllung anfordern. Aber warum willst du das machen? –

+0

Wie würde ich eine verschlüsselte Zeichenfolge ohne Auffüllung anfordern? – user1118764

Antwort

1

Um immer denselben Chiffretext zu generieren, verwenden Sie einen Algorithmus ohne Auffüllung. Ersetzen Sie RSA/ECB/PKCS1Padding durch RSA/ECB/NoPadding.

Aber aus Sicherheitsgründen schlage ich vor, einen Algorithmus mit Padding zu verwenden, und wenn möglich OAEP RSA/ECB/OAEPWithSHA-1AndMGF1Padding (Es ist von Android 23 verfügbar). Die Polsterung sollte kein Problem für die Entschlüsselungsseite

A PCKS # 1 digitale Signatur wird das gleiche Ergebnis für den gleichen privaten Schlüssel und Daten

+0

Danke! Das funktioniert. Würdest du zufällig wissen, ob Schlüsselmaterial nur für den Erstellungsvorgang/die App verfügbar ist? Ist das Schlüsselmaterial persistent (sowohl im KeyStore als auch im hardwareseitigen KeyStore)? Damit meine ich, dass die Schlüssel im KeyStore gelöscht werden, nachdem die Erstellungs-App deinstalliert wurde, und auch nach dem Zurücksetzen auf die Werkseinstellungen? – user1118764

+0

Das Schlüsselmaterial ist nur von der Anwendung, die es erstellt hat, zugänglich (aber nicht extrahierbar). Die Hardware-Unterstützung hängt vom Gerät ab, falls verfügbar, wird verwendet (es gibt eine API-Methode, um zu überprüfen, ob sie existiert). Wenn Sie die Anwendung deinstallieren oder das Gerät zurücksetzen, sind die Schlüssel nicht mehr zugänglich. – pedrofb

+0

Danke. Was ist mit einem gerooteten Gerät? Würden andere Apps oder der Root-Benutzer in diesem Fall auf das Schlüsselmaterial zugreifen können? Löst ein Werksreset wirklich auch Schlüsselmaterial aus, das hardwaregestützt ist (sich im TEE befindet)? – user1118764

Verwandte Themen