使用RSA公钥的Android加密字符串 [英] Android Encrypting String using RSA Public key

查看:218
本文介绍了使用RSA公钥的Android加密字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一个必须使用RSA公钥加密密码的项目中工作。我从SO尝试了许多示例和解决方案,如下所示

I am working in a project where I have to encrypt password using RSA public key. I tried many samples and solutions from SO like as follows


  1. 通过公共字符串进行Android RSA加密

使用SpongyCastle的RSA

但是不幸的是,没有一种解决方案对我来说有效。如果我尝试解决任何问题,我会反复遇到以下例外情况

But none of the solutions worked in my case unfortunately. I was getting following exceptions repeatedly if i try with any work around

错误日志:

04-21 07:50:57.876 18842-18842/com.takeoffandroid.passwordencryption W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
04-21 07:50:57.986 18842-18842/com.takeoffandroid.passwordencryption W/System.err: java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0890ba:ASN.1 encoding routines:asn1_check_tlen:WRONG_TAG
04-21 07:50:57.986 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at com.android.org.conscrypt.OpenSSLKey.getPublicKey(OpenSSLKey.java:250)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at com.android.org.conscrypt.OpenSSLRSAKeyFactory.engineGeneratePublic(OpenSSLRSAKeyFactory.java:47)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at java.security.KeyFactory.generatePublic(KeyFactory.java:172)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at com.takeoffandroid.passwordencryption.MainActivity.RSAEncrypt(MainActivity.java:181)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at com.takeoffandroid.passwordencryption.MainActivity.onCreate(MainActivity.java:80)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at android.app.Activity.performCreate(Activity.java:6532)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2383)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at android.app.ActivityThread.access$900(ActivityThread.java:157)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at android.os.Looper.loop(Looper.java:148)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5437)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err: Caused by: java.lang.RuntimeException: error:0c0890ba:ASN.1 encoding routines:asn1_check_tlen:WRONG_TAG
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at com.android.org.conscrypt.NativeCrypto.d2i_PUBKEY(Native Method)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:     at com.android.org.conscrypt.OpenSSLKey.getPublicKey(OpenSSLKey.java:248)
04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  ... 16 more

我的要求:

我有一个公共密钥,我想用该公共密钥加密在edittext中输入的文本。例如:Password @ 123应该使用公钥加密。

I have a public key with me and I wanted to encrypt the text entered in the edittext with that public key. For Eg: Password@123 should be encrypted using public key.

公钥:

public static String PUBLIC_KEY = "-----BEGIN RSA PUBLIC KEY-----\n" +
            "MMDDFDFK43545mmdf499Mdfdasl43ND/GGKLGKL4434safddEcBFfbTZUM517\n" +
            "VDSVFS45fwdGJGGLKGGL332XSA3=d/S/2ETegJPFQ4sjiY7/DsS2o9Gr\n" +
            "asBASF3465243FCDXSDCDxsSFC39NkDiNO2QKNXivAQVpuJeuoDeK\n" +
            "wNGmwDkIsvxBn8u55QpOwvdaRBeLqllJ6xoF6OuwnD0IB4tVDL2MbMVj1U9GtEGL\n" +
            "DJKHSJAH434jjhdds54KkhjbvGJGGGG/Vn4OYNooIWE9uuiyxm2M\n" +
            "AFSDAFXZB546FGHxcvv324FDGJIYTaa346/9xQIDAQAB\n" +
            "-----END RSA PUBLIC KEY-----";

我尝试过的代码实现:

示例I:

  public static String encryptDataRSA(final String data) throws IOException {
        final byte[] dataToEncrypt = data.getBytes();
        byte[] encryptedData = null;

        try {

            PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(RSAUtils.PUBLIC_KEY.getBytes()));

            final Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            encryptedData = cipher.doFinal(dataToEncrypt);

            try {
                final String encryptedText = new String(Base64.encode(encryptedData, Base64.DEFAULT), "UTF-8");
                return encryptedText.toString();
            }
            catch (final UnsupportedEncodingException e1) { return null; }
        } catch (Exception e) { e.printStackTrace(); }

        return "ERROR";
    }

示例II:

    public byte[] RSAEncrypt(final String plain) throws NoSuchAlgorithmException, NoSuchPaddingException,
            InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024);
        KeyPair kp = kpg.genKeyPair();
        PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(RSAUtils.PUBLIC_KEY.getBytes()));

        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(plain.getBytes());
        System.out.println("EEncrypted?????" + org.apache.commons.codec.binary.Hex.encodeHexString(encryptedBytes));
        return encryptedBytes;
    }

示例III:

 public static String encryptRSAToString(String text, String strPublicKey) {
        byte[] cipherText = null;
        String strEncryInfoData="";
        try {

            KeyFactory keyFac = KeyFactory.getInstance("RSA");
            KeySpec keySpec = new X509EncodedKeySpec(Base64.decode(strPublicKey.trim().getBytes(), Base64.DEFAULT));
            Key publicKey = keyFac.generatePublic(keySpec);

            // get an RSA cipher object and print the provider
            final Cipher cipher = Cipher.getInstance("RSA");
            // encrypt the plain text using the public key
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            cipherText = cipher.doFinal(text.getBytes());
            strEncryInfoData = new String(Base64.encode(cipherText,Base64.DEFAULT));

        } catch (Exception e) {
            e.printStackTrace();
        }
        return strEncryInfoData.replaceAll("(\\r|\\n)", "");
    }

任何帮助或建议都会对我有帮助。

Any help or suggestions would be really helpful to me. Thanks in advance.

推荐答案

尝试一下。

public static String PUBLIC_KEY = "YOUR PUBLIC KEY";

static String enccriptData(String txt)
{
  String encoded = "";
  byte[] encrypted = null;
    try {
        byte[] publicBytes = Base64.decode(PUBLIC_KEY, Base64.DEFAULT);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey pubKey = keyFactory.generatePublic(keySpec);
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING"); //or try with "RSA"
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        encrypted = cipher.doFinal(txt.getBytes());
        encoded = Base64.encodeToString(encrypted, Base64.DEFAULT);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    return encoded;
}

编辑:

您可以使用我的代码,但可以阅读James K Polk的评论,他是对的

You can use my code but read the comment of James K Polk, he's right

这篇关于使用RSA公钥的Android加密字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆