Android中的RSA加密解密 [英] RSA Encryption Decryption in Android

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

问题描述

我正在Android中实现RSA加密和解密的演示。我可以执行加密,但在解密中我得到一个例外:>> java.security.InvalidKeyException:传递给RSA的未知密钥类型

  KeyPairGenerator kpg; 
KeyPair kp;
PublicKey publicKey;
PrivateKey privateKey;
byte [] encryptedBytes,decryptledBytes;
密码密码,密码1;
加密,解密的字符串

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 ?????+加密);
返回加密;

}

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());
decryptpted = new String(decryptptedBytes);
System.out.println(DDecrypted ?????+解密);
返回解密;

}

我从这里调用函数:

  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(异常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);
}
}
});


解决方案

在RSA中,您应该使用公钥进行加密,用于解密的私钥。



您的示例代码用于加密和解密公钥 - 这不行。



因此在解密部分你应该以这种方式初始化密码:

  cipher1.init(Cipher.DECRYPT_MODE,privateKey); 

进一步你的代码有一个第二个重要的错误:



从不将二进制数据转换为String!

>

字符串用于字符串字符,而不是二进制数据。如果要将二进制数据打包成字符串,将其编码为可打印字符,例如使用Hex或Base64。



以下示例使用十六进制编码器, org.apache.common.codec 包 - 必须安装的第三方库。

  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));
返回encryptedBytes;


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

cipher1 = Cipher。的getInstance( RSA);
cipher1.init(Cipher.DECRYPT_MODE,privateKey);
decryptptedBytes = cipher1.doFinal(encryptedBytes);
decryptpted = new String(decryptptedBytes);
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 get an Exception: >>java.security.InvalidKeyException: unknown key type passed to RSA.

    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 the 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;
}

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

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