2016-05-11 11 views
3

私は、ユーザーが他の公開鍵を使用してメッセージを暗号化できるようにしたいAndroidアプリケーションに取り組んでいます。システムは公開鍵/秘密鍵ペアを生成し、メッセージを他のユーザに密かに送ることができます。公開ストリングからのAndroid RSA暗号化

私は、メッセージの暗号化/復号化を処理する暗号化クラスを作成しています。残念ながら私はいくつか問題があります。

この方法では、ユーザーの秘密(秘密キー)と暗号化したいメッセージを渡したいと思います。私は秘密をユーザ定義(例えば "MySecretPassword")したいと思います。次のように

public static void lock(String secret, String textToEncrypt) { 
    try { 
     //Convert the public key string into a key 
     byte[] encodedPublicKey = Base64.decode(secret.getBytes("utf-8"),Base64.DEFAULT); 
     X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedPublicKey); 
     KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
     PublicKey publickey = keyFactory.generatePublic(spec); //Crash Here 
     PrivateKey privateKey = keyFactory.generatePrivate(spec); 

     //Encrypt Message 
     Cipher cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.ENCRYPT_MODE, publickey); 
     byte[] encryptedBytes = cipher.doFinal(textToEncrypt.getBytes()); 
     Log.d(TAG,"Encrypted: "+new String(encryptedBytes)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

例外は次のとおりです。

java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0740b0:ASN.1 encoding routines:ASN1_get_object:TOO_LONG 

は、私はここで何をしないのですか?明らかに何かを見逃しているのですか、あるいは私はこれらのツールの仕組みを誤解していますか?私はthisの公開鍵/秘密鍵の暗号化のためにjavascriptライブラリを使用しています。ここで同様のことをしようとしています。誰かが正しい方向で私を指すことができれば感謝します:)

+1

"他のユーザーのメッセージが自分の公開鍵を使って復号化することができます。"誰もが公開鍵を知っているので、彼らは秘密ではありませんか?あなたのエラー:X509でエンコードされたデータに基づいてキーを生成したくない場合は、パスワードに基づいてキーを生成したい:http://stackoverflow.com/a/992413/995891 – zapl

+0

。ユーザーは、ターゲットの公開鍵を使用してメッセージを暗号化する必要があります(たとえば、友人にメッセージを送信する場合は、その公開鍵を使用して暗号化します)。あなたが投稿したリンクを見てみましょう:) – Pancake

+1

多分、それはちょうどタイプミスですが、公開鍵は誰でも知っている、あなたは*受信者(=秘密鍵の所有者) can * de * crypt。メッセージを送信するのが安全な方法です。編集:うん。 – zapl

答えて

2

秘密は公開鍵ではありません。

受信者の公開鍵で暗号化します。その値はpublicであり、誰でもそれを調べることができます。あなたは、相手方の公開鍵の価値を得て、それをあなたのコードに送り、自分の秘密鍵を送る必要はありません。これを行う適切な方法は秘密を必要としません!

通常、RSAでメッセージを直接暗号化するのではなく、RSAでAESキー(または他の対称キー)を暗号化し、AESキーを使用してメッセージを暗号化します。あなたのメッセージが本当に短い場合は、RSAを直接使うことができますが、長いメッセージにはうまくいかないでしょう。ここで

は、Android上でRSAを実装する方法を示したカップルのリンクです:

関連する問題