RSA加密解密的Android [英] RSA Encryption Decryption in Android
问题描述
我在执行演示的RSA加密和解密的Android。我可以执行加密非常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加密解密的Android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!