Android中的RSA加密解密 [英] RSA Encryption Decryption in Android
问题描述
>> 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屋!