RSA Encryption Decryption in Android

前端 未结 5 951
时光取名叫无心
时光取名叫无心 2020-12-12 11:12

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.

5条回答
  •  自闭症患者
    2020-12-12 11:58

    Here is an example for Android of:

    • generating a private/public RSA key pair
    • encrypting a string
    • decrypting the encrypted string

    These methods deal with all the base 64 encoding/decoding.

        public void TestEncryptData(String dataToEncrypt) {
            // generate a new public/private key pair to test with (note. you should only do this once and keep them!)
            KeyPair kp = getKeyPair();
    
            PublicKey publicKey = kp.getPublic();
            byte[] publicKeyBytes = publicKey.getEncoded();
            String publicKeyBytesBase64 = new String(Base64.encode(publicKeyBytes, Base64.DEFAULT));
    
            PrivateKey privateKey = kp.getPrivate();
            byte[] privateKeyBytes = privateKey.getEncoded();
            String privateKeyBytesBase64 = new String(Base64.encode(privateKeyBytes, Base64.DEFAULT));
    
            // test encryption
            String encrypted = encryptRSAToString(dataToEncrypt, publicKeyBytesBase64);
    
            // test decryption
            String decrypted = decryptRSAToString(encrypted, privateKeyBytesBase64);
        }
    
        public static KeyPair getKeyPair() {
            KeyPair kp = null;
            try {
                KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
                kpg.initialize(2048);
                kp = kpg.generateKeyPair();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return kp;
        }
    
        public static String encryptRSAToString(String clearText, String publicKey) {
            String encryptedBase64 = "";
            try {
                KeyFactory keyFac = KeyFactory.getInstance("RSA");
                KeySpec keySpec = new X509EncodedKeySpec(Base64.decode(publicKey.trim().getBytes(), Base64.DEFAULT));
                Key key = keyFac.generatePublic(keySpec);
    
                // get an RSA cipher object and print the provider
                final Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
                // encrypt the plain text using the public key
                cipher.init(Cipher.ENCRYPT_MODE, key);
    
                byte[] encryptedBytes = cipher.doFinal(clearText.getBytes("UTF-8"));
                encryptedBase64 = new String(Base64.encode(encryptedBytes, Base64.DEFAULT));
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return encryptedBase64.replaceAll("(\\r|\\n)", "");
        }
    
        public static String decryptRSAToString(String encryptedBase64, String privateKey) {
    
            String decryptedString = "";
            try {
                KeyFactory keyFac = KeyFactory.getInstance("RSA");
                KeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(privateKey.trim().getBytes(), Base64.DEFAULT));
                Key key = keyFac.generatePrivate(keySpec);
    
                // get an RSA cipher object and print the provider
                final Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
                // encrypt the plain text using the public key
                cipher.init(Cipher.DECRYPT_MODE, key);
    
                byte[] encryptedBytes = Base64.decode(encryptedBase64, Base64.DEFAULT);
                byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
                decryptedString = new String(decryptedBytes);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return decryptedString;
        }
    

提交回复
热议问题