使用BlackBerry Transcoder API集成第三方加密方案(三)

来源:互联网 发布:炫浪网络社区旧版 编辑:程序博客网 时间:2024/05/20 14:15

作者: 邓明轩

 

 

创建客户端程序

 

 

Transcoder  API BlackBerry 式存在于要创端的 加解使 BlackBerry 一个 BlackBerry 序。

本例使 BlackBerry  JDE  Plug-In  For  Eclipse  1.1 环境个名 TranscoderClient BlackBerry 有关 BlackBerry BlackBerry JDE Plug-In For Eclipse 的具 体使,本只描  TranscoderClient  中的关键 对项进行述。

   BlackBerry             java              java       使 

org.bbtesting.transcoder作为中创 Transcoder API 端的入口序, 名为 MainApp

注意般而 Transcoder API 用会以自要用 本例便式启单启端加 解密线程。

 MainApp 码进使代码:

package org.damon.transcoder;

 

 

import net.rim.device.api.ui.UiApplication;

import net.rim.device.api.ui.container.MainScreen;

 

 

public class MainApp extends UiApplication {

 

 

public static void main(String[] args) { MainApp _app = new MainApp();

_app.enterEventDispatcher();

}

 

 

public MainApp() {

MainScreen screen = new MyScreen();

this.pushScreen(screen);

}

 

 

}

 

 

如果细阅读  MainApp  中的法,类主入口 入口 MyScreen 的实出来作就 MyScreen  读者在按下步  MyScreen  之前译本项的话会现找 MyScreen 误。

在包 org.bbtesting.transcoder 建类 MyScreen建过继承 MainScreen 编辑 MyScreen 使其如以下码:

package org.bbtest.transcoder;

 

 

import net.rim.device.api.crypto.transcoder.TranscoderManager;

import net.rim.device.api.ui.MenuItem;

import net.rim.device.api.ui.UiApplication;

import net.rim.device.api.ui.component.EditField;

import net.rim.device.api.ui.container.MainScreen;

 

public class MyScreen extends MainScreen {

 

 

private MenuItem start = new MenuItem("start", 200000, 10) {

public void run() {

register();

}

};

 

 

private EditField logField = new EditField();

 

 

public MyScreen() {

this.addMenuItem(start); logField.setText("Transcoder Testing client"); this.add(logField);

}

 

 

private void register() { this.log("start to register"); try {

MyTranscoder transcoder = new MyTranscoder(); transcoder.SetScreen(this); TranscoderManager.register(transcoder);

} catch (Exception e) {

System.out.println("Exception while registering:" + e);

this.log("Exception while registering:" + e);

}

}

 

 

public void log(final String msg) {

UiApplication.getUiApplication().invokeLater(new Runnable() {

public void run() {

logField.setText(logField.getText() + "/n" + msg); System.out.println(msg);

}

});

}

 

 

}

 

 

在以 MyScreen 要是屏幕用户 这个解密是将  MyTranscoder  传递 让系时候用这 MyTranscoder 类。

因为 MyTranscoder 时编不到 MyTranscoder

类的是要 MyTranscoder ,这 Transcoder 客户

应用骤。

   org.bbtest.transcoder   中创    MyTranscoder   

net.rim.device.api.crypto.transcoder.Transcoder创建该类如下:

 

 

package org.bbtest.transcoder;

 

 

import java.io.InputStream;

import java.io.OutputStream;

import net.rim.device.api.crypto.transcoder.Transcoder;

import net.rim.device.api.util.IntHashtable;

 

 

public class MyTranscoder extends Transcoder {

 

 

private MyScreen screen = null;

 

 

public MyTranscoder() {

super((byte) 20);

}

 

 

public void SetScreen(MyScreen screen) {

this.screen = screen;

}

 

 

public boolean decode(InputStream input, OutputStream output, IntHashtable context) {

 

 

this.screen.log("decodeing");

try {

int readByte = input.read();

while (readByte != -1) { output.write(readByte); readByte = input.read();

}

output.flush();

} catch (Exception e) { this.screen.log("Exception in decode:" + e); return false;

}

return true;

}

 

 

public boolean encode(InputStream input, OutputStream output,

IntHashtable context) {

this.screen.log("encodeing");

 

try {

int readByte = input.read();

while (readByte != -1) { output.write(readByte); readByte = input.read();

}

output.flush();

} catch (Exception e) { this.screen.log("Exception in decode:" + e); return false;

}

return true;

}

 

 

public boolean willTranscode(IntHashtable context) {

return true;

}

 

 

}

完成该项使设置则在 的时开发境会行编。在译过现错的话系统错误行修

最终形成 cod 以用了。

 

 

 

加载客户端程序

 

 

在完就要序了成功户端 加解作用没有应加 解密应用户将接收数据时也服务测试候要 虑到产环是要用户 例只置过环境 为了先要进行解密使用到 了受控制 API的话户端请和 的使档。

对客以通 javaloader 将客户端程序 cod 通过 USB 连线 安装到  BlackBerry  机上择自  OTA   BlackBerry Desktop Manager 装到 BlackBerry 上。 安装 BlackBerry 能手机上发现程序 仍无  BlackBerry    Transcoder  使严格

BES 设置才可端运 Transcoder API 相关

要在运行 Transcoder API 相关须在 BES 服务器建一 IT Policy 并在 IT Policy 客户端程 hash 码。

获取 cod hash 码有多种发的 cod 在开发环 jad 得到 cod hash TranscoderClient.cod 应的 jad 文件

TranscoderClient.jad 9 RIM-COD-SHA1 cod 件的 has 码,

使                                                                     

01f2524f00fa590896052556b6f7f15545027e52  

 

  

 

 

 

如果他人  cod  应用有时附带供对  jad  文件可以过命

javaloader 一个 cod 件对 hash 码。Javaloader 下:

Javaloader siblinginfo <cod 文件>

本例 javaloader 令行输出 c:/temp/codinfo.txt 中:

javaloader siblinginfo transcoderclient.cod > c:/temp/codinfo.txt

 codinfo.txt 打开以后如图:

 

其中 Hash 的就 TranscoderClient.cod 对应的 hash 码。

获取 cod  hash  hash  IT  Policy 建的 IT  Policy,选择

Security下图是在 BES 5.0 Web 中得图:

在选Security标页后,Security Transcoder Cod File Hashes栏, 将上 hash 填入,如图:

 

 

 

 

 

 

 

完成 IT Policy,为测试分配 IT  Policy并向 IT Policy   IT Policy 于该测试户。

IT Policy TranscoderClient 用就行该 可以的“Start”菜密应

在启 BlackBerry 能手

                          

Transcoder 正常工作,  务器端应程。

 

配置服务器端程序

 

 

如之述的Transcoder 服务是通 BES 服务服务

  Transcoder  程序需要访  BES  务器将我们创的服务器端序,也就生成

MyTranscoder.dll  拷贝  BES  服务器上,本  MyTranscoder.dll  拷贝  BES  服务器的

c:/workspace/transcoder”目下。

然后 BES 所在 Windows  下运regedit册表编辑

                         HKEY_LOCAL_MACHINE/SOFTWARE/Research    In Motion/BlackBerry Enterprise Server/Dispatcher在初始状Dispatcher置中会出 面“Transcoder项目此时需要Dispatcher项点击右,选“新->在新 建项TranscoderTranscoderTranscoder 项打开该项,点击右键,选择“新->串值,在新建字符值对话框中,在名 栏输入Transcoder,在数据一栏输服务器端应  dll  文件的路径名,本例中

c:/workspace/transcoder/MyTranscoder.dll置后的结图:

 

完成重启 BES 服务 Dispatcher 任务置的 dll 入内 的时通过 Windows 的服以通过 BES 整个 BES 服务 例中 MyTranscoder.dll 载入时会c:/transcoder录下 生成如果使例的  MyTranscoder.dll启动  BES  服务 要手c:/transcoder出现错误 BES 启动

BES 5.0 Web 中重 BES

 

 

在服观察 BES  Dispatcher  BES 服务

 Logs    C:/Program   Files/Research   In   Motion/BlackBerry   Enterprise Server/Logs缺省Dispatcher 务的APP_DISP开头 APP_DISP_01_20100202_0001.txt”。

如果功的 Dispatcher Transcoder DLL loaded”一 句,

 

 

 

如果无加载话也会有对应的误,现无法加载错误话有能是注册表中输  dll 路径 Transcoder 如果 Dispatcher 有发 transcoder 相关则说表配注册置不 查注 Transcoder 项是

 

测试结果

 

 

对应如果正确部署 Transcoder 密解智能 手机因为 Transcoder 加密的加用, 并没操作中的表现有部 Transcoder 应用 的情 Transcoder (例为 c:/transcoder/  Transcoder-Log.txt) 看到交互据都 Transcoder 了。

代码分析

 

 

服务端代码分析

 

为了 Transcoder API 使下面对服

#include "stdafx.h"

#include "BESTranscoderAPI.h"

#include <iostream> 以上BESTranscoderAPI.h文件 Transcoder API 使的函

FILE * logFile;

char LogFileName[64]="c://Transcoder//Transcoder-Log.txt"; 以上与日志操 Transcoder API 使用 必要为了执行跟踪所以志文录相 信息名硬c://Transcoder//Transcoder-Log.txt者可 试环注意整变 LogFileName

DEFINE_BES_TRANSCODER_DLL

以上这句 Transcoder API 定义这句 Transcoder API 使关键,为让头 文件 BESTranscoderAPI.h ”中的相关定义可以在本程序中使用,必须通过语 DEFINE_BES_TRANSCODER_DLL 素引 c/c++预定义机 的读以了不深语句 Transcoder API 使用时必

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )

{

printf("Loading Dll");

return TRUE;

}

以上 dll dll 的载数在 dll 调用本例 只是Loading Dll行其

__declspec (dllexport)

int __cdecl LoadDLL()

{

logFile = fopen(LogFileName, "a"); fprintf(logFile,"trying to call LoadDll"); return 0;

}

以上代码 dll 适合入过,如 志文  dll  载入这里语句  fopen 此外日志了“trying to call LoadDll”字串。 在实入加加入连接 CA 取服 务器返回 0际环始化 行情如果返回其它 0 如果它非

0 ,该 dll 内存也不用。

 

__declspec (dllexport)

void __cdecl FreeDLL()

{

fprintf(logFile,"Dll free");

}

FreeDll dll 数,可等资源释需要释放资源, 以在志文Dll free”。

__declspec (dllexport)

unsigned char __cdecl GetID()

{

unsigned long TranscoderID=20; fprintf(logFile,"trying to get ID"); return (unsigned char) TranscoderID;

}

GetID ID使用 20 ID返回 20要确返回 unsigned char 类型。

__declspec (dllexport)

int __cdecl WillTranscode( const TranscoderContext *const context )

{

return 0;

}

WillTranscode 定是否需要进 操作返回 0消息都需作。

__declspec (dllexport)

int __cdecl Encode( TranscoderInputStream       *const input, TranscoderOutputStream  *const output, const TranscoderContext *const context )

{

函数 Encode 行加数有 inputoutputcontext,其中 input 系统output 为传函数 input 中获 据,通过 output 系统。

fprintf(logFile,"testing encode is running now");

以上出“testing encode is running now于记 Encode 件。

unsigned char readC;

fprintf(logFile,"     /nencode read char:");

 

 

while (input->Read(&readC))

{

fprintf(logFile,"%c",readC);

output->Write(readC);

}

以上了变 readC调用 input  Read 方法将数到变 readC  readC

输出 output  Write  readC  output

输出环可 input 据传 output 中。 本段键,  原封 output 输出 现实数据密操作后入到 output 输出流

return 0;

}

最后加密功。

__declspec (dllexport)

int __cdecl Decode( TranscoderInputStream       *const input, TranscoderOutputStream  *const output, const TranscoderContext *const context )

{ D

 

 

fprintf(logFile,"     /ndecode read char:");

 

 

 

 

 

unsigned char readC;

while (input->Read(&readC))

{

fprintf(logFile,"%c",readC);

output->Write(readC);

}

以上了变 readC似于 Encode 中的环将 input 中的 数据写入 output 环境 input 中读 后才写入 output 中。

return 0;

}

最后密成

 

 

手机代码分析

 

以下析:

手机调用 TranscoderManager register 客户到系 统中。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

25

private void register() { this.log("start to register"); try {

MyTranscoder transcoder = new MyTranscoder(); transcoder.SetScreen(this); TranscoderManager.register(transcoder);

} catch (Exception e) {

System.out.println("Exception while registering:" + e);

this.log("Exception while registering:" + e);


 

}

}

              MyTranscoder            transcoder     

TranscoderManager  register  transcoder 到系统中。

 

 

 

package org.bbtest.transcoder;

 

 

import java.io.InputStream;

import java.io.OutputStream;

import net.rim.device.api.crypto.transcoder.Transcoder;

import net.rim.device.api.util.IntHashtable; 以上代为包义语关类import主要一点import名为 net.rim.device.api.crypto.transcoder.Transcoder的类。

public class MyTranscoder extends Transcoder {

以上为MyTranscoder类定义句,MyTranscoder类是Transcoder的子类。

private MyScreen screen = null;

以上为属性义,定义screen个属性,用于更主屏

public MyTranscoder() {

super((byte) 20);

} 此处为MyTranscoder造函数适合关的代。注在加化代码 必须通过super语句类的构要注super时要入客端加解应用 ID。在上章Transcoder客户端用时提到客户端用需getID方法的 和服务端应相关的ID在本例superID父类Transcoder,从而使用 父类的getID数,不用自getID

public void SetScreen(MyScreen screen) {

this.screen = screen;

} 本函数screen性指定对象MyTranscoder实例化被主幕类调用主要作 MyTranscoder存屏幕的句,从主屏幕相关法以屏幕显 内容。函数在Transcoder API使用过中必不是必须的。

 

 

public boolean decode(InputStream input, OutputStream output, IntHashtable context) {

 

 

this.screen.log("decodeing");

try {

int readByte = input.read();

 

 

 

 

 

 

 

 

 

 

 

while (readByte != -1) { output.write(readByte); readByte = input.read();

}

output.flush();


 

} catch (Exception e) { this.screen.log("Exception in decode:" + e); return false;

}

return true;

}

 

public boolean encode(InputStream input, OutputStream output,

IntHashtable context) { this.screen.log("encodeing"); try {

int readByte = input.read();

while (readByte != -1) { output.write(readByte); readByte = input.read();

}

output.flush();

} catch (Exception e) { this.screen.log("Exception in decode:" + e); return false;

}

return true;

}

encode用于对据进行加密操作因为inputread操作和outputwirte操作有 会抛出常,以需try,catch语句捕try段中义了readByte 通过调用inputread数将数读入到readByte中,然再将readByte的数据入到 output中。最本函数返true表示密成

public boolean willTranscode(IntHashtable context) {

return true;

}

}

WillTranscode 于确定是息都返回 true表示 对所操作。

 

 

 

  

 

 

BlackBerry SDK下载

 

  • BlackBerry Java Plug-in for Eclipse v1.1
  • Java Plug-in for Eclipse Update Site
  • BlackBerry Web Plug-in v2.0
  • BlackBerry Widget SDK v1.0
  • BlackBerry Theme Studio v5.0
  • Plazmic Content Developer’s Kit v4.7
  • BlackBerry smartphone simulators
  •  

     

    相关链接:

    使用BlackBerry Transcoder API集成第三方加密方案(一)

    使用BlackBerry Transcoder API集成第三方加密方案(二)

    使用BlackBerry Transcoder API集成三方加密方案(三)

    原创粉丝点击