2012-11-25 17 views
6

Sto scrivendo un programma che utilizza RSA in Android. Ho il seguente problema: sto ottenendo le chiavi RSA:Codifica RSA in Android

KeyPair kp = kpg.genKeyPair(); 
publicKey = kp.getPublic(); 
privateKey = kp.getPrivate(); 

Utilizzando la funzione di crittografia per cifrare una stringa di prova:

String test ="test"; 
byte[] testbytes = test.getBytes(); 
Cipher cipher = Cipher.getInstance("RSA"); 
cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
byte[] cipherData = cipher.doFinal(testbytes); 
String s = new String(cipherData); 
Log.d("testbytes after encryption",s); 

Nella funzione di decifratura sto decodificare i dati indietro a prenderlo la stringa originale

Cipher cipher2 = Cipher.getInstance("RSA"); 
cipher2.init(Cipher.DECRYPT_MODE, privateKey); 
byte[] plainData = cipher.doFinal(cipherData); 
String p = new String(plainData); 
Log.d("decrypted data is:",p); 

I dati contenuti nel 'p' stampato nel log non corrisponde alla stringa originale "test". Dove sto andando male in questo?

+0

bene che cosa è stampato nel registro? Se avessi le chiavi di mancata corrispondenza o il codice confuso otterresti un'eccezione, non una risposta errata. –

+0

Si noti inoltre che 'cipherData' sarà una stringa binaria casuale, quindi convertirla in una stringa usando solo i byte non elaborati (' String s = new String (cipherData); ') potrebbe dare strani risultati. –

risposta

5

Ecco un esempio su come farlo, MA in pratica,

Non si può davvero cifrare e decifrare i file intere con solo RSA. L'algoritmo RSA può solo crittografare un singolo blocco, ed è piuttosto lento per fare un intero file.
È possibile crittografare il file utilizzando 3DES o AES e quindi crittografare la chiave AES utilizzando la chiave pubblica RSA del destinatario previsto .

Alcuni codice:

public static void main(String[] args) throws Exception { 
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 

    kpg.initialize(1024); 
    KeyPair keyPair = kpg.generateKeyPair(); 
    PrivateKey privKey = keyPair.getPrivate(); 
    PublicKey pubKey = keyPair.getPublic(); 

    // Encrypt 
    cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

    String test = "My test string"; 
    String ciphertextFile = "ciphertextRSA.txt"; 
    InputStream fis = new ByteArrayInputStream(test.getBytes("UTF-8")); 

    FileOutputStream fos = new FileOutputStream(ciphertextFile); 
    CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

    byte[] block = new byte[32]; 
    int i; 
    while ((i = fis.read(block)) != -1) { 
     cos.write(block, 0, i); 
    } 
    cos.close(); 

    // Decrypt 
    String cleartextAgainFile = "cleartextAgainRSA.txt"; 

    cipher.init(Cipher.DECRYPT_MODE, privKey); 

    fis = new FileInputStream(ciphertextFile); 
    CipherInputStream cis = new CipherInputStream(fis, cipher); 
    fos = new FileOutputStream(cleartextAgainFile); 

    while ((i = cis.read(block)) != -1) { 
     fos.write(block, 0, i); 
    } 
    fos.close(); 
} 
+0

hai menzionato 'È possibile crittografare il file utilizzando 3DES o AES e quindi crittografare la chiave AES utilizzando la chiave pubblica RSA del destinatario previsto. Avevo esattamente bisogno di crittografare e decodificare i file video. Puoi aiutarmi con questo ... qualche campione sarà utile – Vishnu

+0

@nish ho lo stesso requisito, sei in grado di farlo? – Siddharth