2012-11-25 14 views
6

Piszę program, który wykorzystuje RSA w Androidzie. Mam następujący problem: otrzymuję kluczy RSA:szyfrowania RSA w Androidzie

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

Korzystanie z funkcji szyfrowania do szyfrowania ciąg testowy:

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

w funkcji deszyfrowania jestem odszyfrowywania danych z powrotem dostać oryginalny ciąg

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

dane w „p” wydrukowanym w dzienniku nie pasuje oryginalny napis „test”. Gdzie się mylę?

+0

Cóż, co jest drukowany w dzienniku? Jeśli masz niedopasowane klucze lub zniekształcony szyfr, otrzymasz wyjątek, a nie niepoprawną odpowiedź. –

+0

pamiętać, że 'cipherData' będzie losowy ciąg binarny-jak również, więc przekształcenie go na ciąg używając tylko surowe bajty (' łańcuch s = new String (cipherData); ') może dać dziwne wyniki. –

Odpowiedz

5

Oto przykład, w jaki sposób to zrobić, BUT w praktyce

Naprawdę nie można szyfrowania i deszyfrowania plików z całych tylko RSA. Algorytm RSA można szyfrować tylko jeden blok, a to jest raczej powolny za to cały plik.
Można zaszyfrować plik, używając 3DES lub AES, a następnie szyfrowania klucza AES przy użyciu klucza publicznego RSA zamierzonego odbiorcy.

Niektóre kodu:

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

u wspomnieli 'Można zaszyfrować plik, używając 3DES lub AES, a następnie szyfrowania klucza AES, używając zamierzonego odbiorcy RSA key.' publicznego potrzebowałem dokładnie, że do szyfrowania i deszyfrowania plików wideo. Czy możesz mi w tym pomóc ... niektóre próbki będą przydatne – Vishnu

+0

@nish Mam takie same wymagania, czy jesteś w stanie to zrobić? – Siddharth

Powiązane problemy