2012-11-25 68 views
6

Tôi đang viết một chương trình sử dụng RSA trong Android. Tôi có vấn đề sau đây: Tôi nhận được chìa khóa RSA:Mã hóa RSA trong Android

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

Sử dụng chức năng mã hóa để mã hóa một chuỗi thử nghiệm:

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

Trong chức năng giải mã tôi đang giải mã dữ liệu trở lại để có được chuỗi gốc

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

Dữ liệu trong 'p' được in ra trong nhật ký không khớp với chuỗi gốc "test". Tôi sẽ sai ở đâu?

+0

Vâng những gì được in ra trong nhật ký? Nếu bạn có khóa không khớp hoặc mật mã bị cắt xén, bạn sẽ nhận được ngoại lệ, không phải là câu trả lời không chính xác. –

+0

Cũng lưu ý rằng 'cipherData' sẽ là một chuỗi nhị phân giống như ngẫu nhiên, do đó chuyển đổi nó thành chuỗi bằng cách chỉ sử dụng byte thô (' String s = new String (cipherData); ') có thể cho bạn kết quả lạ. –

Trả lời

5

Dưới đây là một ví dụ về cách để làm điều đó, NHƯNG trong thực tế,

Bạn có thể không thực sự mã hóa và giải mã toàn bộ file chỉ với RSA. Thuật toán RSA chỉ có thể mã hóa một khối duy nhất và nó khá chậm để thực hiện toàn bộ tệp.
Bạn có thể mã hóa tệp bằng cách sử dụng 3DES hoặc AES, sau đó mã hóa khóa AES bằng cách sử dụng khóa công khai RSA của người nhận dự định.

Một số mã:

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 đã đề cập đến 'Bạn có thể mã hóa tệp bằng 3DES hoặc AES, sau đó mã hóa khóa AES bằng khóa công khai RSA của người nhận.' Tôi cần chính xác để mã hóa và giải mã tệp video. Bạn có thể giúp tôi với nó ... một số mẫu sẽ hữu ích – Vishnu

+0

@nish tôi có cùng yêu cầu, bạn có thể làm điều đó không? – Siddharth

Các vấn đề liên quan