IT资讯
联系方式
IT资讯您当前的位置:主页 > IT资讯 >

Android jPBC 2.0.0配置与测试

发布于:2019-01-26 作者:环亚

我在前面的一片博客中,介绍了jPBC 2.0.0在PC平台上面的配置和测试。既然jPBC是Java平台上面实现的,那么jPBC能不能在Android这个以Java为主要语言的平台上运行呢?这样一来,各种在jPBC上撰写的有关双线性对的函数就都能够在移动终端上面用了。我个人的想法就是把最新的密码学算法应用到工程里面,而这确实是我想法的一个很好的跨越。因此,我在第一时间公开整个配置的过程以及我测试的方法,以供广大国内密码学研究者们进行尝试。整个配置过程实际上是非常简单的,这也要感谢jPBC库的编写者们的辛勤工作。在整个配置过程中,我几乎可以确定,jPBC的开发者们在2.0.0版本中完全抛离了GMP库和PBC库,而是将整个PBC在Java上进行了完整的实现。而唯一没有实现的部分,也就是椭圆曲线常数产生部分,作者也使用了相同的配置格式,以使得PBC中使用的椭圆曲线常数可以在jPBC中直接使用。

用到的库工具 Android Development Tools

首先用到的当然是Android的开发工具啦。我使用的是Windows下面的ADT工具。这个工具已经被Google统一打包。也就是说,现在大家开发Android的时候,再也不用下载Eclipse,下载Android SDK,下载Android ADT,进行各种复杂的配置后才能使用了。Google将整个开发工具集成在了一起。这个集成工具的下载地址为:http://developer.android.com/sdk/index.html。里面包含了包括Eclipse,Android SDK Manager,Android ADT在内的全套工具。

然而,如果是Linux平台下面的开发者,虽然Google也提供了Linux下面的Android打包开发工具,但是我建议大家不要使用这一打包工具,而是手动进行一步一步地配置。实际上,如果大家在网上进行检索,会发现网上已经有很多很多的人在抱怨Linux下面Android打包开发工具的各种问题。所以,本着不给自己找麻烦的初衷,大家还是老老实实手动配置吧~

jPBC 2.0.0

jPBC 2.0.0也是必不可少的。其官方网站为:http://gas.dia.unisa.it/projects/jpbc/index.html。需要指出的是,虽然网站中专门有一项是Android,但是里面没有给出任何配置或者使用的方法,有的只是下面的一段话:

JPBC runs out of box on Android (2.1+ version).

A Benchmark App

Download the following APK to benchmark JPBC on your terminal. Once the benchmark is finished the results can be found on the external memory in a file called "benchmark.out".

If you don’t mind it sending me the results with a description of the characteristics of the terminal used pleasecontact me.


所以如果大家想使用Android jPBC,确实需要自己摸索一下怎么配置,这也是我写这篇博客的根本目的。同时,这一段话也可以让我们确信jPBC是可以在Android上面运行的,毕竟连APK都已经有了嘛~

jpbc-android运行

我们首先尝试将jPBC中提供的APK文件恢复成工程文件。我们将分三步介绍恢复的方法:整理并准备需要的文件、Android-jpbc工程的建立和配置、运行Benchmark并显示结果。

需要的文件

下载好jPBC 2.0.0的源文件后,解压,观察一下解压的结果。我们可以发现,在解压文件中有个文件夹名字为jpbc-android,这里面存放了一些源文件,同时也存放了打包好的APK文件。原文件中包括了APK文件中使用的resources,有icon、layout、甚至可以找到AndroidManifest.xml。同时,在src文件中可以找到APK工程中需要的三个java源代码:AndroidBenchmark.java、Benchmark.java以及JPBCBenchmarkActivity.java。在asserts文件夹下,存放了4个用于测试的椭圆曲线常数Properties:a.properties、d159.properties、d201.properties,以及d224.properties。这四个文件也是回复APK工程的必要文件。以上这些就是jpbc-android里面所需要的全部文件了。

对于jPBC 2.0.0中的jar文件夹,里面的两个必要jar文件也是我们需要的library:jpbc-api-2.0.0.jar和jpbc-plaf-2.0.0.jar。

好啦,所有必要的文件都准备完毕,开始进行工程的建立。

工程的建立与配置

1. 在Eclipse的Android开发环境中建立一个新的空工程。在我的测试中,我的工程名称为Android-jPBC。

2. 将给出的AndroidManifest.xml引入到工程中。

这一步比较简单,大家可以直接打开工程中的AndroidManifest.xml文件,然后用jpbc-android文件夹下面的同名文件对此文件进行覆盖,当然也可以使用其他任意的方法。修改结果如图。在此跟大家道个歉,我截图的时候正好QQ上有一个好友上线提醒了… 为了保护朋友的隐私我把QQ上面的信息抹掉了,这也是这个图里面我唯一手动改动的部分。

vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140517/2014051709103196.jpg" + message);
2. 特别要注意Properties的路径需要修改成Android下面的路径:assets/a.properties。因此,在TestBBGHIBE.java中,需要做如下修改:

BBGHIBEMasterKey msk = bbgHIBE.Setup("assets/a.properties", 7);  

其他地方呢,就是为了让Android成功调用TestBBGHIBE函数所作出的修改啦。后面我会放置所有需要修改的源代码。我们尝试运行一下,运行两次测试,两次都能得到正确的结果,并且两次的消息都不相同,这证明jpbc-android确实能够在Android下面正确的运行。

= secretKey.identityVector.length); //the identity vector for the secret key should match the receiver's identity vector for (int i=0; i

BBGHIBEActivity.java

package cn.edu.buaa.crypto;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class BBGHIBEActivity extends Activity implements View.OnClickListener {
    private static final String tag = "JPBCBenchmarkActivity";
    
    private Button benchmark;

    /**
     * Called when the activity is first created.
     */
    public void onCreate(Bundle savedInstanceState) {
        // Init UI
        super.onCreate(savedInstanceState);
        setContentView(R.layout.bbghibe);

        benchmark = (Button) findViewById(R.id.button);
        benchmark.setOnClickListener(this);
    }

    public void onClick(View view) {
    	if (view == benchmark){
    		TestBBGHIBE.testBBEHIBE();
    	}
    }
}

BBGHIBECiphertext.java

package cn.edu.buaa.crypto;


import it.unisa.dia.gas.jpbc.Element;  

public class BBGHIBECiphertext {  
    Element C_0;  
    Element C_1;  
    Element C_2;  
} 

BBGHIBEMasterKey.java

package cn.edu.buaa.crypto;


import it.unisa.dia.gas.jpbc.Element;  

public class BBGHIBEMasterKey {  
    public Element alpha;  
} 

BBGHIBESecretKey.java

package cn.edu.buaa.crypto;


import it.unisa.dia.gas.jpbc.Element;  

public class BBGHIBESecretKey {  
    public String[] identityVector;  
    public Element K_1;  
    public Element K_2;  
    public Element[] E;  
}  

TestBBGHIBE.java

package cn.edu.buaa.crypto;


import android.util.Log;

public class TestBBGHIBE {  
	private static final String tag = "TestBBGHIBE";
    public static void testBBEHIBE() {  
        BBGHIBE bbgHIBE = new BBGHIBE();  
        BBGHIBEMasterKey msk = bbgHIBE.Setup("assets/a.properties", 7);  
        String[] testI1 = {"Depth 1"};  
        String testI2 = "Depth 2";  
        String testI3 = "Depth 3";  
        String testI4 = "Depth 4";  
        String testI5 = "Depth 5";  
        String testI6 = "Depth 6";  
        String testI7 = "Depth 7";  
        String[] receiver = new String[7];  
        receiver[0] = testI1[0];  
        receiver[1] = testI2;  
        receiver[2] = testI3;  
        receiver[3] = testI4;  
        receiver[4] = testI5;  
        receiver[5] = testI6;  
        receiver[6] = testI7;  
        String[] ciphertextIV = new String[7];  
        System.arraycopy(receiver, 0, ciphertextIV, 0, 7);  
        //KeyGen for 永发depth 1  
        if (BBGHIBE.isDebug){  
            Log.i(tag, "Generate secret key for user at depth 1");  
        }  
        BBGHIBESecretKey SKDepth1 = bbgHIBE.KeyGen(msk, testI1);  
          
        //Delegation for depth 2  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Generate secret key for user at depth 2");  
        }  
        BBGHIBESecretKey SKDepth2 = bbgHIBE.Delegate(SKDepth1, testI2);  
  
        //Delegation for depth 3  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Generate secret key for user at depth 3");  
        }  
        BBGHIBESecretKey SKDepth3 = bbgHIBE.Delegate(SKDepth2, testI3);  
          
        //Delegation for depth 4  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Generate secret key for user at depth 4");  
        }  
        BBGHIBESecretKey SKDepth4 = bbgHIBE.Delegate(SKDepth3, testI4);  
          
        //Delegation for depth 5  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Generate secret key for user at depth 5");  
        }  
        BBGHIBESecretKey SKDepth5 = bbgHIBE.Delegate(SKDepth4, testI5);  
          
        //Delegation for depth 6  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Generate secret key for user at depth 6");  
        }  
        BBGHIBESecretKey SKDepth6 = bbgHIBE.Delegate(SKDepth5, testI6);  
          
        //Delegation for depth 7  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Generate secret key for user at depth 7");  
        }  
        BBGHIBESecretKey SKDepth7 = bbgHIBE.Delegate(SKDepth6, testI7);  
          
        //encryption  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Encryption");  
        }  
        BBGHIBECiphertext ciphertext = bbgHIBE.Encrypt(ciphertextIV);  
          
        //Decryption for depth 1  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Dncryption for user at depth 1");  
        }  
        bbgHIBE.decrypt(ciphertextIV, ciphertext, SKDepth1);  
          
        //Decryption for depth 2  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Dncryption for user at depth 2");  
        }  
        bbgHIBE.decrypt(ciphertextIV, ciphertext, SKDepth2);  
          
        //Decryption for depth 3  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Dncryption for user at depth 3");  
        }  
        bbgHIBE.decrypt(ciphertextIV, ciphertext, SKDepth3);  
          
        //Decryption for depth 4  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Dncryption for user at depth 4");  
        }  
        bbgHIBE.decrypt(ciphertextIV, ciphertext, SKDepth4);  
          
        //Decryption for depth 5  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Dncryption for user at depth 5");  
        }  
        bbgHIBE.decrypt(ciphertextIV, ciphertext, SKDepth5);  
          
        //Decryption for depth 6  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Dncryption for user at depth 6");  
        }  
        bbgHIBE.decrypt(ciphertextIV, ciphertext, SKDepth6);  
          
        //Decryption for depth 7  
        if (BBGHIBE.isDebug){  
        	Log.i(tag, "Dncryption for user at depth 7");  
        }  
        bbgHIBE.decrypt(ciphertextIV, ciphertext, SKDepth7);  
    }  
      
//    public static void main(String[] args){  
//        testBBEHIBE();  
//    }  
}  

Util.java

package cn.edu.buaa.crypto;


import it.unisa.dia.gas.jpbc.Element;  
import it.unisa.dia.gas.jpbc.Pairing;  
  
public class Util {  
    public static Element hash_id(Pairing pairing, String id){  
        byte[] byte_identity = id.getBytes();  
        Element hash = pairing.getZr().newElement().setFromHash(byte_identity, 0, byte_identity.length);  
        return hash;  
    }  
} 

Layout: bbghibe.xml




    

AndroidManifest.xml




    
        
            
                
                
            
        
    



http://www.bkjia.com/Androidjc/771521.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/771521.htmlTechArticle我在前面的一片博客中,介绍了jPBC 2.0.0在PC平台上面的配置和测试。既然jPBC是Java平台上面实现的,那么jPBC能不能在Android这个以Java为主要...

本文源自: 凯发国际