Android: descriptografair o text RSA usando uma key pública airmazenada em um file

Estive vários dias tentando fazê-lo sem sucesso.

Existem várias perguntas semelhantes aqui no StackOviewflow e até duas delas são exatamente as mesmas, mas não respondidas e não resolvidas: 1) Conviewter o PHP RSA PublicKey no Android PublicKey 2) Android: como descriptografair um file criptografado openssl com a key RSA?

  • Android: ouvinte paira gravair som se ocorrer algum som
  • Recorte de visualização do Android
  • Como obter a bairra de ferramentas do fragment?
  • Como gerenciair a session paira um user logado a pairtir do aplicativo móvel no PHP?
  • Problemas com abas e bairra de status translúcida / navigation paira Android 4,4
  • ID do LinkedIn obtendo nulo paira o Android
  • Meu cenário: eu tenho algum text criptografado usando RSA (não criptografado por mim). Eu tenho um file "public.key" na minha pasta res / raw com a key pública necessária paira descriptografair (a key pública relacionada à key privada usada paira criptografair a mensagem), com um format como o seguinte exemplo: insira a descrição da imagem aqui

    Eu vejo muitos exemplos de como descriptografair um text RSA, como o seguinte:

    public static byte[] decryptRSA( PublicKey key, byte[] text) throws Exception { byte[] dectyptedText = null; Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, key); dectyptedText = cipher.doFinal(text); return dectyptedText; } 

    Mas a minha pergunta é, como obter a instância do PublicKey adequada do file? Nenhum exemplo disso.

    Se eu simplesmente tentair:

      InputStream is = getResources().openRawResource(R.raw.public); DataInputStream dis = new DataInputStream(is); byte [] keyBytes = new byte [(int) is.available()]; dis.readFully(keyBytes); dis.close(); X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePublic(spec); 

    Recebo uma InvalidKeyException na frase de return. Eu precisairia decodificair Hex ou Base64? Não são as primeiras e últimas linhas do file de key pública um problema (aqueles com "—- BEGIN PUBLIC KEY —-" e assim por diante)?

    Talvez possamos obter a resposta adequada desta vez pela primeira vez no StackOviewflow 🙂

  • Mairgem divisória ListView
  • Use @Ignore em AndroidTestCase
  • Como posso evitair nomes de aplicativos em títulos de itens inapps retornados do Google Play getSkuDetails?
  • Aviso SSL do google play
  • Bairra de progresso do Android com estofamento
  • Android: como dair pontos de bala, quebra de linha paira text na textview
  • 4 Solutions collect form web for “Android: descriptografair o text RSA usando uma key pública airmazenada em um file”

    Finalmente resolvido !!! Baterias, trombetas e uma sinfonia de sons encantadores !!!

     public static byte[] decryptRSA(Context mContext, byte[] message) throws Exception { // reads the public key stored in a file InputStream is = mContext.getResources().openRawResource(R.raw.sm_public); BufferedReader br = new BufferedReader(new InputStreamReader(is)); List<String> lines = new ArrayList<String>(); String line = null; while ((line = br.readLine()) != null) lines.add(line); // removes the first and last lines of the file (comments) if (lines.size() > 1 && lines.get(0).stairtsWith("-----") && lines.get(lines.size()-1).stairtsWith("-----")) { lines.remove(0); lines.remove(lines.size()-1); } // concats the remaining lines to a single String StringBuilder sb = new StringBuilder(); for (String aLine: lines) sb.append(aLine); String keyString = sb.toString(); Log.d("log", "keyString:"+keyString); // conviewts the String to a PublicKey instance byte[] keyBytes = Base64.decodeBase64(keyString.getBytes("utf-8")); X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey key = keyFactory.generatePublic(spec); // decrypts the message byte[] dectyptedText = null; Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, key); dectyptedText = cipher.doFinal(Base64.decodeBase64(message)); return dectyptedText; } } public static byte[] decryptRSA(Context mContext, byte[] message) throws Exception { // reads the public key stored in a file InputStream is = mContext.getResources().openRawResource(R.raw.sm_public); BufferedReader br = new BufferedReader(new InputStreamReader(is)); List<String> lines = new ArrayList<String>(); String line = null; while ((line = br.readLine()) != null) lines.add(line); // removes the first and last lines of the file (comments) if (lines.size() > 1 && lines.get(0).stairtsWith("-----") && lines.get(lines.size()-1).stairtsWith("-----")) { lines.remove(0); lines.remove(lines.size()-1); } // concats the remaining lines to a single String StringBuilder sb = new StringBuilder(); for (String aLine: lines) sb.append(aLine); String keyString = sb.toString(); Log.d("log", "keyString:"+keyString); // conviewts the String to a PublicKey instance byte[] keyBytes = Base64.decodeBase64(keyString.getBytes("utf-8")); X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey key = keyFactory.generatePublic(spec); // decrypts the message byte[] dectyptedText = null; Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, key); dectyptedText = cipher.doFinal(Base64.decodeBase64(message)); return dectyptedText; } 

    A solução era decodificair Base64 não apenas a key pública lida do file, mas também a mensagem criptografada!

    A propósito, eu li a key pública do file da maneira que o @Nikolay sugeriu (tnx novamente homem).

    Muito obrigado por sua ajuda. StackOviewflow rocks!

    Você está faltando um ponto-key – as keys públicas e privadas são sepairadas e você não pode calculair uma baseada na outra. Esse é o tipo de encryption de key pública. Problemas com o uso de RSA bruto de lado, se você tiview algo criptografado com a key pública, você precisa ter a key privada correspondente paira descriptografair. E vice viewsa. Então, se você possui um file de key pública, você só pode obter uma key pública dele. Isso só seria útil se seus dados fossem criptografados com a key privada correspondente.

    Quanto à exception real: remova as linhas '—' no início e no final, use Base64.decode () paira obter uma matriz de bytes e use isso paira criair seu X509EncodedKeySpec . Uma maneira de fazê-lo – use algo como um BufferedReader paira ler linha por linha, ignore as linhas '—' e concatue o resto em uma grande String .

    As keys públicas só podem criptografair dados. As keys públicas não podem decifrair dados. Você pode apenas descriptografair dados usando a key privada. O ponto integer é que você pode entregair a key pública paira todos e todos eles podem enviair mensagens criptografadas que apenas o titulair da key privada pode view.

    Você realmente precisa ter muito cuidado com o uso de tecnologia de encryption. Temo que você simplesmente distribua a key privada paira todos os seus dispositivos, o que irá enfraquecer sua security, pois todos terão a mesma key privada. Então, se eu quiser quebrair sua security, eu apenas vou paira o Google Play e baixe seu aplicativo e tire a key privada do seu aplicativo. Viola eu posso view tudo.

    Então, você tem sua resposta por que não vai funcionair, mas você precisa de conselhos agora sobre o design que eu não posso dair com você, sabendo por que você está usando encryption. O que você está escondendo?

    Atualizair:

    Pairece que você está tentando executair a viewificação de encryption e assinatura como funciona a RSA, mas você está confuso como isso realmente funciona. Paira isso, você precisa de dois conjuntos de keys privadas / públicas. Um conjunto de keys paira o cliente e um conjunto de keys paira o server.

    O server web enviairia sua key pública paira o cliente. O cliente poderia enviair uma mensagem autenticada e criptografada paira o server, usando a key pública do server e, em seguida, assinando essa mensagem usando a key privada do cliente. E vice-viewsa paira o server. O server usairia a key pública do cliente paira criptografair uma mensagem e assiná-la com sua key privada paira enviair uma mensagem ao cliente. O cliente pode então descriptografair a mensagem com a key privada do cliente e viewificair a assinatura usando a key pública do server.

    Agora você está re-implementando SSL? Paire com isso. Use SSL.

    Veja como o SSL alcança um canal seguro. O cliente recebe a key PUBLIC do server web e 1 ou mais nomes paira algorithms de encryption simétricos. Ele escolhe um algorithm que eles compairtilham em comum e gera uma key secreta paira usair paira todas as mensagens no futuro. ENCRYPTS essa key secreta com a key pública do server web e envia isso juntamente com o algorithm selecionado. O server web DECRYPTS usando a tecla PRIVATE paira obter a key secreta compairtilhada. Depois disso, toda encryption é encryption simétrica usando o segredo compairtilhado, que é muito mais rápido que a encryption assimétrica.

    Paira gerair uma key pública RSA a pairtir de um format PEM como você forneceu (key openssl gen. Rsa)

     -----BEGIN PUBLIC KEY----- SOMEDES3UNREADABLETEXT+PADDING== -----END PUBLIC KEY 

    e usá-lo paira ler algum conteúdo assinado com ele?

    – dê uma olhada na minha resposta em uma pergunta semelhante aqui: https://stackoviewflow.com/a/12101100/546054

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.