2012-04-24 7 views
3

私は他の場所で暗号化された文字列を解読しようとしています。ここに私のコードです:RSA解読のAndroid/JVMの違い

private void test() { 

    try { 
     String stringMessage="Sf3O7Lr2+WN5szGyLejL3CjuBRZtQ72+ZBmgVTgWnatQZxUElzaBqFa1p0SVBqe9VWVxCxdEkejMVtDGEr0UJSVSK8EB/fPI6v8JE8dIu0JN0mMs4xlowhITy0tQR+1pcBtDFjzOl33xxQcq5JuPezxRDxFIp+IVkD8FdpqlttEKf2Tvqw9tqsdgiBKb5xDvKrkIDQXdLBh1gbAVZDSJYGHRkcOA8vz2ty/PeooKkfDK6IOn7KBwOBgSRgQr/MLBF3Xk2vRWgVGRh/fRkzu21EWo99Q5moWKxWl3HW/bbgTBQTb097XP3NTID9kSPhCfL0BEfBxonuNse5GBoeRnCw=="; 
     //Convert String back to Byte[] and decrpt 
     byte[] byteMessage = Base64.decodeBase64(stringMessage.getBytes("UTF-8")); 
     System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length); 

     String decryptedMsg = decryptString(byteMessage, loadCASPrivateKey()); 
     System.out.println(decryptedMsg); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return; 
    } 
} 

private static String decryptString(byte[] message, Key privateKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { 
    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.DECRYPT_MODE, privateKey); 

    byte[] cipherData = cipher.doFinal(message); 
    return new String(cipherData, "UTF-8"); 
} 

private PrivateKey loadCASPrivateKey() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { 
    InputStream is = getClass().getResourceAsStream("/keys/app-private.key"); 
    if (is == null) { 
     System.out.println("NULL"); 
    } 
    byte[] encodedPrivateKey = new byte[(int) 2000]; 
    is.read(encodedPrivateKey); 
    is.close(); 

    // Generate KeyPair. 
    KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 

    PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey); 
    PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec); 

    return privateKey; 

} 

この作品、私はAndroidのエミュレータでそれを実行した場合しかし、私は取得するには、私のデスクトップJVMの下でそれをしたいと思いますどのように100%:

4月24日22: 42:21.011:I/System.out(1041): k _ * ݣ 93 ̍0 ̍4 y) Q k ; *A e #��A� �oiu:�����[email protected]$�w�j��uS R Ocx& l w '/ d 8uA { 4$ U 0 {Ԑ t!9 n a 'Jdt2 t T D k+k ; GF \ r ڼ>] Y +^< w「はE {8R]ZHyuζ軟ށ掱{#のȟ

私は自分を想定します問題はエンコーディングにまで下がりましたが、私は一日中何を解決しようと努力しましたが、本当に困っています。

文字列が元々使用して暗号化されています

private void test() { 
    String message="22223334490384903432221"; 
try { 
    //Encrypt message 
    byte[] encryptedMsg = Base64.encodeBase64(encryptString(message, temp.loadCASPublicKey())); 
} catch (Exception e) { 
e.printStackTrace(); 
     return; 
} 

} 

private static byte[] encryptString(String message, Key publicKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { 
    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.ENCRYPT_MODE, publicKey); 

    byte[] cipherData = cipher.doFinal(message.getBytes("UTF-8"));  
    return cipherData; 
} 
+1

デフォルトを使用しないでください。プラットフォームによって異なる場合があります。 'Cipher.getInstance()'は* algorithm/mode/padding *からなる文字列引数をとります。あなたは*アルゴリズム*のみを提供しており、他の2つのデフォルトを取得しています。 –

+0

また、 'encryptString'メソッドを表示して、' decryptString'メソッドと比較できるようにする必要があります。 –

+0

@GregS - ありがとう。私はencryptStringの部分を追加しました。私はCipher.getInstanceを調べるでしょう、私はそれがより多くの部分を取ったことを認識していませんでした。 – Joseph

答えて

1

コメントのGregSのおかげで、これは私のために働いた解決策です。

private void test() { 

      try { 
       String stringMessage="GEQRpAPA577ks/QveudNkk7H9DjItKGLDYW6xhH1YJGabCVzrkejkBh6S+APwEXxB84UV/q0sO5rqkgXWONJQ8CoMTfqXtUkAAwkYHSc86eGewkM8WpctA0AyNVFonOxDCXm84Uq8JRMzqskSH5VXHmMxvHIvpFgdhmt9Ir0cKWzoLsuvgfY9hfypfEyBXGZcoptQeKhsZxRGIlxbXhrFl/LqhC+F6vYtZ/j5pv2LUP38wh2rTCKnAQ+xvC+7wn5SVzt/Wbr/q7GjCoJuU9uFHQSS49KQDt+BzJL2XNwAMmdbC+XHYkEBBWxVSS+0hdSQxoaKVZZJk4hTnHwQlBAkw=="; 
       //Convert String back to Byte[] and decrpt 
       byte[] byteMessage = Base64.decodeBase64(stringMessage.getBytes("UTF-8")); 
       System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length); 

       String decryptedMsg = decryptString(byteMessage, loadCASPrivateKey()); 
       System.out.println(decryptedMsg); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return; 
      } 
     } 

     private static String decryptString(byte[] message, Key privateKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, NoSuchProviderException { 
      Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

      Cipher cipher = Cipher.getInstance("RSA/None/NoPadding","BC"); 
      cipher.init(Cipher.DECRYPT_MODE, privateKey); 

      byte[] cipherData = cipher.doFinal(message); 
      return new String(cipherData, "UTF-8"); 
     } 

     private PrivateKey loadCASPrivateKey() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { 
      InputStream is = getClass().getResourceAsStream("/keys/app-private.key"); 
      if (is == null) { 
       System.out.println("NULL"); 
      } 
      byte[] encodedPrivateKey = new byte[(int) 1216]; 
      is.read(encodedPrivateKey); 
      is.close(); 

      // Generate KeyPair. 
      KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 

      PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey); 
      PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec); 

      return privateKey; 

     } 
1

あなたは2000バイト配列に読んでいると、あなたの鍵は、おそらく128(1024ビット)または256のようなものであるので、それはあなたがKeyFactoryゴミを供給可能です(2048ビット)バイトの長さである。さらに、実際にはRSAを暗号化に直接使用するべきではありません。これは、暗号化できるデータサイズがRSAキーサイズによって制限されるというセキュリティ上の問題があります。

+0

バイト配列を置き換えることをお勧めしますか? KeyFactoryへのフィード方法はJVMとAndroidの違いはありますか?私は固定長のランダムなハッシュを暗号化するためにRSAを使用しています。ありがとう。 – Joseph

+0

ストリームを読み込み、ファイル/アセットにあるバイト数だけ使用します。あなたが何をしようとしているのか分かりませんが、ハッシュを暗号化することは一般に「署名」と呼ばれ、秘密鍵で行われ、公開されたもので検証されます。 –

+0

正しいバイト数を設定しても、まったく同じ問題が発生します... – Joseph

関連する問題