2017-04-21 6 views
2

RSA 공개 키를 사용하여 비밀번호를 암호화해야하는 프로젝트에서 일하고 있습니다. 나는 RSA using SpongyCastleRSA 공개 키를 사용하는 Android 암호화 문자열

  • Android RSA encryption from public string

      을 다음과 같이 SO에서 많은 샘플 및 솔루션을 시도하지만 해결책으로는 불행하게도 내 경우에는 작동하지 않습니다. 내가

      오류 로그 주위의 모든 작업과 함께하려고하면 나는 반복적으로 다음과 같은 예외를 얻고 있었다 :

      04-21 07:50:57.876 18842-18842/com.takeoffandroid.passwordencryption W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
      04-21 07:50:57.986 18842-18842/com.takeoffandroid.passwordencryption W/System.err: java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0890ba:ASN.1 encoding routines:asn1_check_tlen:WRONG_TAG 
      04-21 07:50:57.986 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at com.android.org.conscrypt.OpenSSLKey.getPublicKey(OpenSSLKey.java:250) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at com.android.org.conscrypt.OpenSSLRSAKeyFactory.engineGeneratePublic(OpenSSLRSAKeyFactory.java:47) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at java.security.KeyFactory.generatePublic(KeyFactory.java:172) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at com.takeoffandroid.passwordencryption.MainActivity.RSAEncrypt(MainActivity.java:181) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at com.takeoffandroid.passwordencryption.MainActivity.onCreate(MainActivity.java:80) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at android.app.Activity.performCreate(Activity.java:6532) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2383) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at android.app.ActivityThread.access$900(ActivityThread.java:157) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at android.os.Looper.loop(Looper.java:148) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5437) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err: Caused by: java.lang.RuntimeException: error:0c0890ba:ASN.1 encoding routines:asn1_check_tlen:WRONG_TAG 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at com.android.org.conscrypt.NativeCrypto.d2i_PUBKEY(Native Method) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err:  at com.android.org.conscrypt.OpenSSLKey.getPublicKey(OpenSSLKey.java:248) 
      04-21 07:50:57.987 18842-18842/com.takeoffandroid.passwordencryption W/System.err: ... 16 more 
      

      내 요구 사항 :

      나는 나와 함께 공개 키를 가지고 있고 암호화 싶어 그 공개 키로 edittext에 입력 된 텍스트. 예 : 암호 @ 123은 공개 키를 사용하여 암호화해야합니다.

      공개 키 :

      public static String PUBLIC_KEY = "-----BEGIN RSA PUBLIC KEY-----\n" + 
            "MMDDFDFK43545mmdf499Mdfdasl43ND/GGKLGKL4434safddEcBFfbTZUM517\n" + 
            "VDSVFS45fwdGJGGLKGGL332XSA3=d/S/2ETegJPFQ4sjiY7/DsS2o9Gr\n" + 
            "asBASF3465243FCDXSDCDxsSFC39NkDiNO2QKNXivAQVpuJeuoDeK\n" + 
            "wNGmwDkIsvxBn8u55QpOwvdaRBeLqllJ6xoF6OuwnD0IB4tVDL2MbMVj1U9GtEGL\n" + 
            "DJKHSJAH434jjhdds54KkhjbvGJGGGG/Vn4OYNooIWE9uuiyxm2M\n" + 
            "AFSDAFXZB546FGHxcvv324FDGJIYTaa346/9xQIDAQAB\n" + 
            "-----END RSA PUBLIC KEY-----"; 
      

      코드 구현 나는 시도 :

      샘플 I :

      public static String encryptDataRSA(final String data) throws IOException { 
           final byte[] dataToEncrypt = data.getBytes(); 
           byte[] encryptedData = null; 
      
           try { 
      
            PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(RSAUtils.PUBLIC_KEY.getBytes())); 
      
            final Cipher cipher = Cipher.getInstance("RSA"); 
            cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
            encryptedData = cipher.doFinal(dataToEncrypt); 
      
            try { 
             final String encryptedText = new String(Base64.encode(encryptedData, Base64.DEFAULT), "UTF-8"); 
             return encryptedText.toString(); 
            } 
            catch (final UnsupportedEncodingException e1) { return null; } 
           } catch (Exception e) { e.printStackTrace(); } 
      
           return "ERROR"; 
          } 
      

      샘플 II :

      public byte[] RSAEncrypt(final String plain) throws NoSuchAlgorithmException, NoSuchPaddingException, 
            InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException { 
           KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
           kpg.initialize(1024); 
           KeyPair kp = kpg.genKeyPair(); 
           PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(RSAUtils.PUBLIC_KEY.getBytes())); 
      
           Cipher cipher = Cipher.getInstance("RSA"); 
           cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
           byte[] encryptedBytes = cipher.doFinal(plain.getBytes()); 
           System.out.println("EEncrypted?????" + org.apache.commons.codec.binary.Hex.encodeHexString(encryptedBytes)); 
           return encryptedBytes; 
          } 
      

      샘플 III :

      public static String encryptRSAToString(String text, String strPublicKey) { 
           byte[] cipherText = null; 
           String strEncryInfoData=""; 
           try { 
      
            KeyFactory keyFac = KeyFactory.getInstance("RSA"); 
            KeySpec keySpec = new X509EncodedKeySpec(Base64.decode(strPublicKey.trim().getBytes(), Base64.DEFAULT)); 
            Key publicKey = keyFac.generatePublic(keySpec); 
      
            // get an RSA cipher object and print the provider 
            final Cipher cipher = Cipher.getInstance("RSA"); 
            // encrypt the plain text using the public key 
            cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
            cipherText = cipher.doFinal(text.getBytes()); 
            strEncryInfoData = new String(Base64.encode(cipherText,Base64.DEFAULT)); 
      
           } catch (Exception e) { 
            e.printStackTrace(); 
           } 
           return strEncryInfoData.replaceAll("(\\r|\\n)", ""); 
          } 
      

      어떤 도움이나 제안이 나에게 정말 도움이 될 것입니다. 미리 감사드립니다.

  • +1

    맞아요. 유효하지 않은 base64 문자열 중간에 등호 ('=')가 있습니다. 열쇠를 제거하더라도 여전히 유효하지 않습니다. –

    +0

    사실 나는 샘플 공개 키를 게시했습니다. 내가 사용하고있는 실제 키는 완전히 다릅니다. – Chandru

    +0

    @JamesKPolk 실제 키를 찾으십시오. https://pastebin.com/7beLfTpK – Chandru

    답변

    3

    시도해보십시오.

    public static String PUBLIC_KEY = "YOUR PUBLIC KEY"; 
    
    static String enccriptData(String txt) 
    { 
        String encoded = ""; 
        byte[] encrypted = null; 
        try { 
         byte[] publicBytes = Base64.decode(PUBLIC_KEY, Base64.DEFAULT); 
         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes); 
         KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
         PublicKey pubKey = keyFactory.generatePublic(keySpec); 
         Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING"); //or try with "RSA" 
         cipher.init(Cipher.ENCRYPT_MODE, pubKey); 
         encrypted = cipher.doFinal(txt.getBytes()); 
         encoded = Base64.encodeToString(encrypted, Base64.DEFAULT); 
        } 
        catch (Exception e) { 
         e.printStackTrace(); 
        } 
        return encoded; 
    } 
    

    편집 :

    당신은 내 코드를 사용하지만 제임스 K. 포크의 코멘트를 읽을 수있는, 그가 공개 키 명확하게 손상

    +0

    답장을 보내 주셔서 감사합니다. 다시 다음 예외가 발생했습니다 – Chandru

    +0

    https://pastebin.com/ukNUsL06 – Chandru

    +0

    예제와 같이 키를 넣으시겠습니까? X509EncodedKeySpec에서 DER로 인코딩 된 데이터가 필요하지 않습니다. PEM 코드가 올바르게 작동합니다. . – Israel