Android Base64编码和Apache编解码器解码

杜塔

我们正在使用以下方法使用ANDROID Base64对字符串进行编码。

    public static String encrypt(String inputString, byte[] keyBytes) {
    Calendar cal = Calendar.getInstance();
    int mDay = cal.get(Calendar.DAY_OF_MONTH);
    // System.out.println("Day of month :::" + mDay);
    String encryptedString = "";
    Key publicKey = null;
    try {
        Random generator = new Random(mDay);
        int num = (generator.nextInt()) % 100;
        String salt = "WEER563784" + num;
        inputString += salt;
        X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        publicKey = keyFactory.generatePublic(publicKeySpec);
    } catch (Exception e) {
        System.out.println("Exception rsaEncrypt:::::::::::::::::  "
                + e.getMessage());
        e.printStackTrace();
    }
    // Encode the original data with RSA public key
    byte[] encodedBytes = null;
    try {
        Cipher c = Cipher.getInstance("RSA");
        c.init(Cipher.ENCRYPT_MODE, publicKey);
        encodedBytes = c.doFinal(inputString.getBytes());
        encryptedString = Base64.encodeToString(encodedBytes,
                Base64.NO_CLOSE);
        System.out.println(encryptedString);
    } catch (Exception e) {
        System.out.println("Exception rsaEncrypt:::::::::::::::::  "
                + e.getMessage());
        e.printStackTrace();
    }

    return encryptedString;
}

生成的加密字符串正在使用以下方法在Android应用外部解密

public static String decrypt(String inputString, byte[] keyBytes) {
        String resultStr = null;
        Calendar cal = Calendar.getInstance();
        int mDay = cal.get(Calendar.DAY_OF_MONTH);
        Random generator = new Random(mDay);
        int num = (generator.nextInt()) % 100;
        String salt = "qqq" + num;
        PrivateKey privateKey = null;
        try {
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyBytes);
            privateKey = keyFactory.generatePrivate(privateKeySpec);
        } catch (Exception e) {
            System.out.println("Exception privateKey:::::::::::::::::  "
                    + e.getMessage());
        }
        byte[] decodedBytes = null;
        try {
            Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            // Cipher c = Cipher.getInstance("RSA");
            c.init(Cipher.DECRYPT_MODE, privateKey);
            // decodedBytes = c.doFinal(Base64.decodeBase64(inputString));
            decodedBytes = c.doFinal(Base64InputStream());

        } catch (Exception e) {
            System.out.println("Exception privateKey1:::::::::::::::::  "
                    + e.getMessage());
            e.printStackTrace();
        }
        if (decodedBytes != null) {
            resultStr = new String(decodedBytes);
            System.out.println("resultStr:::" + resultStr + ":::::");
            resultStr = resultStr.replace(salt, "");
        }
        return resultStr;

    }

我们正在遵循以下例外

javax.crypto.BadPaddingException: Decryption error
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380)
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291)
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:365)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:391)
    at javax.crypto.Cipher.doFinal(Cipher.java:2087)
    at RSAEncryption.decrypt(RSAEncryption.java:41)
    at RSAEncryption.main(RSAEncryption.java:108)

所以问题是

1)是否可以在Android外部使用ANDROID Base64.NO_CLOSE解密加密的字符串,我的意思是直接在IDE中?

2)在一篇文章中,我发现使用ANDROID Base64.NO_WRAP加密的字符串可以在Android env外部解密,这是正确的理解吗?

非常感谢您的提前帮助。

问候,阿米特

杜塔

问题已解决...

解密时,我们需要使用RSA / ECB / NoPadding

基本上,当我们在单独的独立Java环境中通过Android设备解密中的RSA使用RSA加密值时,应该在Cipher中使用RSA / ECB / NoPadding。

Android加密代码:

public static String encrypt(String inputString, byte[] keyBytes) {
        Calendar cal = Calendar.getInstance();
        int mDay = cal.get(Calendar.DAY_OF_MONTH);
        // System.out.println("Day of month :::" + mDay);
        String encryptedString = "";
        Key publicKey = null;
        try {
            Random generator = new Random(mDay);
            int num = (generator.nextInt()) % 100;
            String salt = "MNSadm563784" + num;
            //inputString += salt;
            X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            publicKey = keyFactory.generatePublic(publicKeySpec);
        } catch (Exception e) {
            System.out.println("Exception rsaEncrypt:::::::::::::::::  "
                    + e.getMessage());
            e.printStackTrace();
        }
        // Encode the original data with RSA public key
        byte[] encodedBytes = null;
        try {
            Cipher c = Cipher.getInstance("RSA");
            c.init(Cipher.ENCRYPT_MODE, publicKey);
            encodedBytes = c.doFinal(inputString.getBytes());
            encryptedString = Base64.encodeToString(encodedBytes,
                    Base64.NO_CLOSE);
            System.out.print("-----??"+encryptedString+"??-------");
        } catch (Exception e) {
            System.out.println("Exception rsaEncrypt:::::::::::::::::  "
                    + e.getMessage());
            e.printStackTrace();
        }

        return encryptedString;
    }

服务器解密代码:

public static String decrypt(String inputString, byte[] keyBytes) {
        String resultStr = null;
//      Calendar cal = Calendar.getInstance();
//      int mDay = cal.get(Calendar.DAY_OF_MONTH);
//      Random generator = new Random(mDay);
//      int num = (generator.nextInt()) % 100;
//      String salt = "MNSadm563784" + num;
        PrivateKey privateKey = null;
        try {
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(
                    keyBytes);
            privateKey = keyFactory.generatePrivate(privateKeySpec);
        } catch (Exception e) {
            System.out.println("Exception privateKey:::::::::::::::::  "
                    + e.getMessage());
            e.printStackTrace();
        }
        byte[] decodedBytes = null;
        try {
            Cipher c = Cipher.getInstance("RSA/ECB/NoPadding");
            // Cipher c = Cipher.getInstance("RSA");
            c.init(Cipher.DECRYPT_MODE, privateKey);
            decodedBytes = c.doFinal(Base64.decodeBase64(inputString));
            // decodedBytes = c.doFinal(Base64InputStream());

        } catch (Exception e) {
            System.out.println("Exception privateKey1:::::::::::::::::  "
                    + e.getMessage());
            e.printStackTrace();
        }
        if (decodedBytes != null) {
            resultStr = new String(decodedBytes);
            System.out.println("resultStr:::" + resultStr + ":::::");
//          resultStr = resultStr.replace(salt, "");
        }
        return resultStr;

    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Apache编解码器base64编码/解码-未获得预期结果

来自分类Dev

Android WebRTC 支持的编解码器

来自分类Dev

在Android上的PJSIP 2.5.1上启用和配置OPUS编解码器

来自分类Dev

Android媒体编解码器无法实例化“视频/ MP4”类型的解码器

来自分类Dev

Android MediaCodec AVC / H264生成无效的关键帧和编解码器配置

来自分类Dev

使用媒体编解码器,媒体提取器API的Android HLS支持

来自分类Dev

Kivy(适用于Android的Python)缺少编解码器

来自分类Dev

Android上的kivy / Python缺少Unicode编解码器?

来自分类Dev

如何在Android 4.0上获取编解码器列表

来自分类Dev

如何使用MediaCodec在Android中使用软件编解码器

来自分类Dev

Android中的G729编解码器支持

来自分类Dev

MediaCodec如何在Android框架内找到编解码器?

来自分类Dev

将ffmpeg OMX编解码器添加到Genymotion Android 4.4.2模拟器

来自分类Dev

将ffmpeg OMX编解码器添加到Genymotion Android 4.4.2模拟器

来自分类Dev

Android和C#之间的Base64网址安全编码和解码

来自分类Dev

Android和C#之间的Base64网址安全编码和解码

来自分类Dev

哪种AudioEncoder编解码器最适合Android上最高质量的音频录制

来自分类Dev

是否可以通过C级使用android API?还是可以通过C代码使用编解码器?

来自分类Dev

编解码器参数不正确,无法为输出文件写入标头:FFMPEG-Android

来自分类Dev

如何禁用Grails createLink编解码器(编码)?

来自分类Dev

如何使用Opus编解码器编码音频?

来自分类Dev

UnicodeEncodeError:“ ascii”编解码器无法编码

来自分类Dev

如何在我的自定义视频编解码器的Android应用程序中使用.so文件创建.apk文件

来自分类Dev

如何启用视频和音频编解码器?

来自分类Dev

使用Webengine视频和音频编解码器

来自分类Dev

如何启用视频和音频编解码器?

来自分类Dev

Lucene 3.6.2和脉冲编解码器

来自分类Dev

如何安装ffmpeg和编解码器?

来自分类Dev

了解Unicode编解码器

Related 相关文章

  1. 1

    Apache编解码器base64编码/解码-未获得预期结果

  2. 2

    Android WebRTC 支持的编解码器

  3. 3

    在Android上的PJSIP 2.5.1上启用和配置OPUS编解码器

  4. 4

    Android媒体编解码器无法实例化“视频/ MP4”类型的解码器

  5. 5

    Android MediaCodec AVC / H264生成无效的关键帧和编解码器配置

  6. 6

    使用媒体编解码器,媒体提取器API的Android HLS支持

  7. 7

    Kivy(适用于Android的Python)缺少编解码器

  8. 8

    Android上的kivy / Python缺少Unicode编解码器?

  9. 9

    如何在Android 4.0上获取编解码器列表

  10. 10

    如何使用MediaCodec在Android中使用软件编解码器

  11. 11

    Android中的G729编解码器支持

  12. 12

    MediaCodec如何在Android框架内找到编解码器?

  13. 13

    将ffmpeg OMX编解码器添加到Genymotion Android 4.4.2模拟器

  14. 14

    将ffmpeg OMX编解码器添加到Genymotion Android 4.4.2模拟器

  15. 15

    Android和C#之间的Base64网址安全编码和解码

  16. 16

    Android和C#之间的Base64网址安全编码和解码

  17. 17

    哪种AudioEncoder编解码器最适合Android上最高质量的音频录制

  18. 18

    是否可以通过C级使用android API?还是可以通过C代码使用编解码器?

  19. 19

    编解码器参数不正确,无法为输出文件写入标头:FFMPEG-Android

  20. 20

    如何禁用Grails createLink编解码器(编码)?

  21. 21

    如何使用Opus编解码器编码音频?

  22. 22

    UnicodeEncodeError:“ ascii”编解码器无法编码

  23. 23

    如何在我的自定义视频编解码器的Android应用程序中使用.so文件创建.apk文件

  24. 24

    如何启用视频和音频编解码器?

  25. 25

    使用Webengine视频和音频编解码器

  26. 26

    如何启用视频和音频编解码器?

  27. 27

    Lucene 3.6.2和脉冲编解码器

  28. 28

    如何安装ffmpeg和编解码器?

  29. 29

    了解Unicode编解码器

热门标签

归档