2016-08-21 35 views
2

私は、暗号を利用するAndroidプラットフォーム向けのアプリケーションを作成しています。これは安全なチャットで、diffie hellmanキーを持つclient-> server-> clientです。 クライアントはAndroid端末で、サーバーは自分のPCで動作しています。 私はソケット経由で公開鍵を送信しようとしていますが、私はこのエラーを取得しています:Java/Android Bouncy castle ClassNotFoundException

Server Up and Running 
Bouncy Castle provider is available 
Aug 21, 2016 4:47:03 PM Connection run 
SEVERE: null 
java.lang.ClassNotFoundException: com.android.org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPublicKey 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:348) 
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626) 
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 
at Connection.run(Connection.java:124) 

あなたが弾む城プロバイダを見ることができるようにすることは可能です。 はここで問題と私のコードです:

サーバー:

if (Security.getProvider("BC") == null){ 
     System.out.println("Bouncy Castle provider is NOT available"); 
} 
else{ 
    System.out.println("Bouncy Castle provider is available"); 
    } 

try { 
    pubkey = (PublicKey) instream.readObject(); 
}catch (IOException ex) {} 

アンドロイド:

PublicKey pubkey; 
kp23 = genDHKeyPair(); 
pubkey= kp23.getPublic(); 
//System.out.println(pubkey); 
outstream.writeObject(pubkey); 
outstream.flush(); 
+0

アンドロイドVMはJava VMではありません。 2つの間でオブジェクトを逆シリアル化することはできません。互換性はありません。 –

答えて

0

アンドロイドOS上で利用可能はBouncyCastleのバージョンがvery limitedで、どうやらそれはcom.android.org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPublicKeyが含まdoes't 。

完全なBouncyCastle機能を使用するには、SpongyCastle暗号化プロバイダであるAndroidで再パッケージされたバージョンを考慮する必要があります。

さらに詳しい説明はthis linkに従ってください。

+0

私はスポンジ城を追加しますが、私はまだ同じ問題を抱えていました – DeviLFisH

0

ClassNotFoundException を含むJavaバージョンのBouncyCastleではパッケージcom.android.org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPublicKeyが使用できないため、スローされます。

の次のプロパティを持つ新しいクラスを作成することをお勧めします。サーバーとクライアントアプリケーション。

import java.io.Serializable; 

public class PublicKeyProperties implements Serializable { 
    private static final long serialVersionUID = 1L; 
    public byte[] Encoded; 
    public String Format; 
    public String Algorithm; 
} 

クライアント側

は、PublicKeyPropertiesクラスの新しいインスタンスにPublicKeyの対応するプロパティを渡し、それをシリアル化し、それをサーバに送信します。

PublicKeyProperties prop = new PublicKeyProperties(); 
prop.Format = pubkey.getFormat(); 
prop.Algorithm = pubkey.getAlgorithm(); 
prop.Encoded = pubkey.getEncoded(); 
outstream.writeObject(prop); 


サーバー側

それをデシリアライズし、次のように新しいPublicKeyインスタンスを作成します。

PublicKeyProperties prop = (PublicKeyProperties) instream.readObject(); 

pubkey = new PublicKey() { 

       @Override 
       public String getAlgorithm() { 
        return prop.Algorithm; 
       } 

       @Override 
       public String getFormat() { 
        return prop.Format; 
       } 

       @Override 
       public byte[] getEncoded() { 
        return prop.Encoded; 
       } 
      }; 

希望するものがあります。

関連する問題