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)", "");
}
어떤 도움이나 제안이 나에게 정말 도움이 될 것입니다. 미리 감사드립니다.
맞아요. 유효하지 않은 base64 문자열 중간에 등호 ('=')가 있습니다. 열쇠를 제거하더라도 여전히 유효하지 않습니다. –
사실 나는 샘플 공개 키를 게시했습니다. 내가 사용하고있는 실제 키는 완전히 다릅니다. – Chandru
@JamesKPolk 실제 키를 찾으십시오. https://pastebin.com/7beLfTpK – Chandru