RSA加密解密的Andr​​oid [英] RSA Encryption Decryption in Android

查看:185
本文介绍了RSA加密解密的Andr​​oid的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在执行演示的RSA加密和解密的Andr​​oid。我可以执行加密非常well.But解密我得到了一个异常.. >> java.security.InvalidKeyException:传递给RSA未知的密钥类型

请查看我的code和帮助我..

在此先感谢。

 的KeyPairGenerator KPG;
    密钥对KP;
    公钥公钥;
    PrivateKey privateKey;
    byte []的encryptedBytes,decryptedBytes;
    密码加密,cipher1;
    字符串加密,解密;

    公共字符串RSAEncrypt(最后弦乐纯)抛出抛出:NoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException将,IllegalBlockSizeException,BadPaddingException
    {
        KPG = KeyPairGenerator.getInstance(RSA);
        kpg.initialize(1024);
        KP = kpg.genKeyPair();
        公钥= kp.getPublic();
        privateKey = kp.getPrivate();

        密码= Cipher.getInstance(RSA);
        cipher.init(Cipher.ENCRYPT_MODE,公钥);
        encryptedBytes = cipher.doFinal(plain.getBytes());
        加密=新的String(encryptedBytes);
        的System.out.println(EEncrypted ?????+加密);
        返回加密;

    }

    公共字符串RSADecrypt(最后弦乐结果)抛出抛出:NoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException将,IllegalBlockSizeException,BadPaddingException
    {

        cipher1 = Cipher.getInstance(RSA);
        cipher1.init(Cipher.DECRYPT_MODE,PrivateKey)对其;
        decryptedBytes = cipher1.doFinal(result.getBytes());
        解密=新的String(decryptedBytes);
        的System.out.println(DDecrypted ?????+解密);
        返回解密;

    }



 而我是从这里调用函数..

encrypt.setOnClickListener(新OnClickListener()
        {
            公共无效的onClick(查看arg0中)
            {

                    尝试
                    {

                        RSAEncrypt rsaencrypt =新RSAEncrypt();
                        rsaencrypt.RSAEncrypt(名称);

                        结果= rsaencrypt.RSAEncrypt(名称);
                        Toast.makeText(getBaseContext(),result.toString(),Toast.LENGTH_SHORT).show();

                        的System.out.println(结果:+结果);
                    }
                    赶上(例外五)
                    {
                        e.printStackTrace();
                        Toast.makeText(getBaseContext(),e.​​toString(),Toast.LENGTH_LONG).show();
                    }

            }
        });

        decrypt.setOnClickListener(新OnClickListener()
        {
            公共无效的onClick(查看arg0中)
            {

                {
                    尝试
                    {
                        RSAEncrypt rsadecrypt =新RSAEncrypt();

                        rsadecrypt.RSADecrypt(结果);

                        ANS = rsadecrypt.RSADecrypt(结果);
                        的System.out.println(结果是+ ANS);
                        Toast.makeText(getBaseContext(),ans.toString(),Toast.LENGTH_LONG).show();

                    }
                    赶上(例外五)
                    {
                        e.printStackTrace();
                        Toast.makeText(getBaseContext(),e.​​toString(),Toast.LENGTH_LONG).show();
                        的System.out.println(异常是>>+ E);
                    }

            }
        });
 

解决方案

在RSA,你应该使用公共密钥进行加密,私钥用于解密。

您样品code采用加密和解密的公共密钥 - 这可不行

因此​​,在解密部分,你应该初始化密码是这样的:

  cipher1.init(Cipher.DECRYPT_MODE,PrivateKey)对其;
 

Furthermor您code的第二显著错误:

您正在转换为字节数组与二进制内容为一个字符串。

永远不要转换成二进制数据字符串!

字符串是一串字符,而不是二进制数据。如果要打包的二进制数据到一个字符串连接code到可打印的字符,例如使用十六进制或Base64。

下面的示例使用十六进制EN codeR来回 org.apache.common。codeC 包 - 与第三方库必须安装

 公共字节[] RSAEncrypt(最后弦乐纯)抛出抛出:NoSuchAlgorithmException,NoSuchPaddingException,
        InvalidKeyException将,IllegalBlockSizeException,BadPaddingException {
    KPG = KeyPairGenerator.getInstance(RSA);
    kpg.initialize(1024);
    KP = kpg.genKeyPair();
    公钥= kp.getPublic();
    privateKey = kp.getPrivate();

    密码= Cipher.getInstance(RSA);
    cipher.init(Cipher.ENCRYPT_MODE,公钥);
    encryptedBytes = cipher.doFinal(plain.getBytes());
    的System.out.println(EEncrypted ?????+ org.apache.commons codec.binary.Hex.en codeHexString(encryptedBytes)。);
    返回encryptedBytes;
}

公共字符串RSADecrypt(最后一个字节[] encryptedBytes)抛出抛出:NoSuchAlgorithmException,NoSuchPaddingException,
        InvalidKeyException将,IllegalBlockSizeException,BadPaddingException {

    cipher1 = Cipher.getInstance(RSA);
    cipher1.init(Cipher.DECRYPT_MODE,PrivateKey)对其;
    decryptedBytes = cipher1.doFinal(encryptedBytes);
    解密=新的String(decryptedBytes);
    的System.out.println(DDecrypted ?????+解密);
    返回解密;
}
 

I am implementing a demo for RSA Encryption and Decryption in Android. I can Perform Encryption very well.But In Decryption I got an Exception..>>java.security.InvalidKeyException: unknown key type passed to RSA

Please Review my code and Help me..

Thanks in Advance..

    KeyPairGenerator kpg;
    KeyPair kp;
    PublicKey publicKey;
    PrivateKey privateKey;
    byte [] encryptedBytes,decryptedBytes;
    Cipher cipher,cipher1;
    String encrypted,decrypted;

    public String RSAEncrypt (final String plain) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException 
    {
        kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024);
        kp = kpg.genKeyPair();
        publicKey = kp.getPublic();
        privateKey = kp.getPrivate();

        cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        encryptedBytes = cipher.doFinal(plain.getBytes());
        encrypted = new String(encryptedBytes);
        System.out.println("EEncrypted?????"+encrypted);
        return encrypted;

    }

    public String RSADecrypt (final String result) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException 
    {

        cipher1=Cipher.getInstance("RSA");
        cipher1.init(Cipher.DECRYPT_MODE, privateKey);
        decryptedBytes = cipher1.doFinal(result.getBytes());
        decrypted = new String(decryptedBytes);
        System.out.println("DDecrypted?????"+decrypted);
        return decrypted;

    }



 And I am calling Function from Here..

encrypt.setOnClickListener(new OnClickListener()
        { 
            public void onClick(View arg0) 
            {

                    try
                    {

                        RSAEncrypt rsaencrypt=new RSAEncrypt();
                        rsaencrypt.RSAEncrypt(name);

                        result=rsaencrypt.RSAEncrypt(name);
                        Toast.makeText(getBaseContext(), result.toString(),Toast.LENGTH_SHORT).show();

                        System.out.println("Result:"+result);
                    }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                        Toast.makeText(getBaseContext(), e.toString(),Toast.LENGTH_LONG).show();
                    } 

            }
        });

        decrypt.setOnClickListener(new OnClickListener()
        { 
            public void onClick(View arg0) 
            {

                {
                    try
                    {
                        RSAEncrypt rsadecrypt=new RSAEncrypt();

                        rsadecrypt.RSADecrypt(result);

                        ans=rsadecrypt.RSADecrypt(result);
                        System.out.println("Result is"+ans);
                        Toast.makeText(getBaseContext(), ans.toString(),Toast.LENGTH_LONG).show();

                    }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                        Toast.makeText(getBaseContext(), e.toString(),Toast.LENGTH_LONG).show();
                        System.out.println("Exception is>>"+e);
                    } 

            }
        });

解决方案

In RSA you should use the public key for encryption and the private key for decryption.

Your sample code uses for encryption and decryption the public key - this can not work.

Hence in the decryption part you should initialize the cipher this way:

cipher1.init(Cipher.DECRYPT_MODE, privateKey);

Furthermor your code has a second significant bug:

You are converting a byte array with binary content to a String.

Never ever convert binary data to a String!

Strings are for string characters, not binary data. If you want to pack binary data into a String encode it to printable characters for example using Hex or Base64.

The following example uses the hexadecimal encoder fro org.apache.common.codec package - a third party library with has to be installed.

public byte[] RSAEncrypt(final String plain) throws NoSuchAlgorithmException, NoSuchPaddingException,
        InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    kpg = KeyPairGenerator.getInstance("RSA");
    kpg.initialize(1024);
    kp = kpg.genKeyPair();
    publicKey = kp.getPublic();
    privateKey = kp.getPrivate();

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

public String RSADecrypt(final byte[] encryptedBytes) throws NoSuchAlgorithmException, NoSuchPaddingException,
        InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

    cipher1 = Cipher.getInstance("RSA");
    cipher1.init(Cipher.DECRYPT_MODE, privateKey);
    decryptedBytes = cipher1.doFinal(encryptedBytes);
    decrypted = new String(decryptedBytes);
    System.out.println("DDecrypted?????" + decrypted);
    return decrypted;
}

这篇关于RSA加密解密的Andr​​oid的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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