2012-11-25 71 views
6

我正在編寫一個在Android中使用RSA的程序。我有以下問題: 我收到RSA密鑰:Android中的RSA加密

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

使用加密功能加密測試字符串:

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

在解密功能,我正在對數據進行解密回去取原始字符串

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

打印在日誌中的'p'中的數據與原始字符串「test」不匹配。我在哪裏錯了?

+0

那麼是什麼在日誌中打印出來?如果你有不匹配的密鑰或亂碼,你會得到一個異常,而不是一個錯誤的答案。 –

+0

另外請注意''cipherData'將是一個隨機的二進制字符串,所以通過使用原始字節('String s = new String(cipherData);')將它轉換爲一個字符串可能會給你奇怪的結果。 –

回答

5

這裏就如何做到這一點,但在實踐中一個例子,

你不能真正的加密和解密,只需RSA整個文件。 RSA算法只能加密一個單獨的塊,並且對於整個文件來說,它的速度很慢 。
您可以使用3DES或AES加密文件,然後使用預期收件人的 RSA公鑰對AES密鑰進行加密。

一些代碼:

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

你已經提到'你可以使用3DES或AES加密文件,然後使用預期收件人的RSA公鑰對AES密鑰進行加密。'我完全需要加密和解密視頻文件。你能幫我嗎?一些樣品將是有用的 – Vishnu

+0

@nish我有同樣的要求,你能夠做到這一點嗎? – Siddharth