在Android中加密 - 用Java解密

时间:2014-11-21 20:49:19

标签: java android encryption cryptography

我正在尝试在Android设备(客户端)和Java服务器(我的笔记本电脑作为普通服务器)之间实现客户端 - 服务器架构。我正在尝试实现RSA算法来加密客户端发送的数据并在服务器上解密。发送时我首先将加密数据更改为Base 64字符串: 客户端:

    byte[] dataToEncrypt = temp.getBytes(StandardCharsets.UTF_8); //temp is a String
    byte[] encryptedData = null;

    Cipher cipher = Cipher.getInstance("RSA");
    //cipher.init(Cipher.ENCRYPT_MODE, serverPubKey);
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    encryptedData = cipher.doFinal(dataToEncrypt);
    String cipherStr = Base64.encodeToString(encryptedData,Base64.DEFAULT);

我将cipherStr发送到我正在使用以下代码进行解密的服务器。

服务器:

    byte[] decryptedData = null;
    System.out.println("Before Decryption:");
    System.out.println(tmp);

    byte [] byteArray = Base64.decode(tmp);

    try {
        privKey = pair.getPrivate();
        //  System.out.println("PRIVATE KEY IN FUNCTION"+privKey);

        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privKey);
        // System.out.println(new String(byteArray, StandardCharsets.UTF_8));

        decryptedData = cipher.doFinal(byteArray);
        System.out.println("Decrypted Data: ");
        sentToDB = new String(decryptedData, StandardCharsets.UTF_8);
    }

但是,在服务器端,我收到了BadPaddingException

错误:

javax.crypto.BadPaddingException: Decryption error
    at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)
    at sun.security.rsa.RSAPadding.unpad(Unknown Source)
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
    at javax.crypto.Cipher.doFinal(Cipher.java:2121)
    at sslservefr.simplesslserver$clientThread.run(simplesslserver.java:175)
java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at sslservefr.simplesslserver$clientThread.run(simplesslserver.java:198)

有人可以帮忙吗?我怎么前进? 我读了几个问题,包括this ..但没有帮助。

编辑: 我发现Android只发送了一半的加密文本

Android O / p:

11-22 13:44:21.530: W/Cipher String(2056): WRsALdJsVgIHqbg5x3ouYGsSwRKk5209lvyr4V8k1sj5IED9nSOoxTF3u9Ioz21l0oK5yOmtHeW4
11-22 13:44:21.530: W/Cipher String(2056): i1azUDYd+qD3Emtau8gEwJaYLOGfSgyhEtw4pbHSY2Nedp3iyqHahKyDcyxFSEWzSnOEMBRZInh8
11-22 13:44:21.530: W/Cipher String(2056): v0DyxAvRm8T8lxI5yVc=

我用Java收到的内容:

received: WRsALdJsVgIHqbg5x3ouYGsSwRKk5209lvyr4V8k1sj5IED9nSOoxTF3u9Ioz21l0oK5yOmtHeW4

这只是第一行。我不知道为什么?如果我将整个'encryptedData'存储在String中并将其发送到服务器..为什么在Java服务器中只收到第一行?

请帮帮我!!! :(

EDIT2:因为,Android分割数据,我在服务器端这样做了:

           String l1 = br.readLine();
           String l2 = br.readLine();
           String l3 = br.readLine();
           tmp = l1+l2+l3;

现在我收到服务器上的数据与客户端发送的数据完全相同,但我仍然收到相同的错误!!

从客户端发送的加密字符串:

RpFC6Jq1bqH3IVjfQy91QlZ7C+btMkUQhZ5/HQWdC8LwRSaJlU63hEOHPzDltTpfV6u260MhhfwyNYuFbMS7WbFnpHLGMxR+WOPsZirG5Xr6QVm+b19bbZYgqDYxpaflvSRs2CnBQtKWFSsVg4nC9n6ICrhsQEhkA39P11IYt+U=

在服务器上收到的字符串:

RpFC6Jq1bqH3IVjfQy91QlZ7C+btMkUQhZ5/HQWdC8LwRSaJlU63hEOHPzDltTpfV6u260MhhfwyNYuFbMS7WbFnpHLGMxR+WOPsZirG5Xr6QVm+b19bbZYgqDYxpaflvSRs2CnBQtKWFSsVg4nC9n6ICrhsQEhkA39P11IYt+U=

请帮忙。

0 个答案:

没有答案