Le Cryptage RSA, un Décryptage Android
Je me suis mise en œuvre d'une démo pour le RSA de Chiffrement et de Déchiffrement dans Android. Je peux Effectuer de Chiffrement très bien, mais Dans le Déchiffrement j'obtiens une 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;
}
Et je suis l'appel de la fonction à partir d'ici:
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);
}
}
});
Vous devez vous connecter pour publier un commentaire.
Au RSA, vous devez utiliser la clé publique pour le chiffrement et la clé privée de déchiffrement.
Votre exemple de code utilise pour le chiffrement et le déchiffrement de la clé publique - ce qui peut ne pas fonctionner.
De là, dans le déchiffrement de la partie, vous devez les initialiser l'algorithme de chiffrement de cette façon:
Furthermor votre code a un deuxième bug:
Vous à la conversion d'un tableau d'octets avec le contenu binaire à une Chaîne.
Jamais convertir des données binaires à une Chaîne!
Chaînes de caractères de la chaîne, pas de données binaires. Si vous souhaitez emballer les données binaires dans une Chaîne de codage de caractères imprimables, par exemple à l'aide de Hex ou Base64.
L'exemple suivant utilise le code hexadécimal de codeur bof org.apache.commun.codec paquet - un tiers bibliothèque doit être installé.
encodeHexString()
au lieu deencodeHex()
comme mentionné dans la question.Ma classe:
Voici un exemple pour Android de:
Ces méthodes traitent tous de la base 64 de codage/décodage.
Je pense que le problème est que vous devez utiliser la même paire de clé pour chiffrer et déchiffrer l'algorithme de chiffrement. Se référant à la JavaDoc:
lors de l'utilisation de RSAEcvypt méthode, son remplissage PublicKey et la clé privée.
Et quand votre Décrypter vos généré byte[], votre publicKey et privateKey être NULL.
Parce que de ce que vous obtenez cette erreur.
Vous devez utiliser les touches de votre statique;