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

作者: 邓明轩

 

 

创建客户端程序

 

 

T r ans c o de r   AP I Bla ck Be rry 式存 在于 要创 端的 加解使 Bla ck Be rry 一个 Bla ck Be rr y 序。

本例使 Bla c kB er r y   JDE   P l ug-In   F o r   E cl ip s e   1 . 1 环境个名 T r an sc o derCli en t Bla ck Be rr y 有关 Bla c kBe rry Bla ck Be rry JDE P lu g-In Fo r E cl i ps e 的具 体使 ,本只描   T r ans c o de rCli en t   中的 关键 对项 进行 述。

    Bla ck B er r y                      ja v a                        j a v a            使  

o r g .b bt es t ing . t r ans c o der 作为中创 T r ans c o der AP I 端的 入口 序, 名为 Ma in App

注意般而 T r ans c o de r AP I 用会 以自 要用 本例便 式启 单启 端加 解密线 程。

  Ma in App 码进使 代码:

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);

}

 

 

}

 

 

如果 细阅读   Ma in Ap p   中的 法, 类主 入口 入口 MyS c re en 的实 出来 作就 MyS cre en   读者在按 下步   MyS cr ee n   之前 译本项 的话会 现找 MyS cre en 误。

在包 o r g .b bt es t ing . t r ans c o d er 建类 M ySc r ee n 建过继承 Ma in S cr ee n 编辑 M ySc r ee n 使其如 以下 码:

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);

}

});

}

 

 

}

 

 

在以 MyS c re en 要是 屏幕 用户 这个 解密 是将   My T r ans c o de r   传递 让系 时候用这 My T r ans co der 类。

因为   My T r ans c o de r 时编 不到   MyT r ans c o der

类的 是要   M yT r ans c o der ,这   T r ans c o de r 客户

应用 骤。

    o r g .b bt es t . t r ans c o der    中创     M y T r ans c o der   

net .rim .d ev ic e.ap i. crypt o . t r a ns c o der . T r ans c o der 创建 该类 如下:

 

 

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 Tran scoder {

 

 

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 ;

}

 

 

}

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

最终形成   c o d 以用 了。

 

 

 

加载客户端程序

 

 

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

对客 以通 ja v alo ad e r 将客 户端程序 c o d 通过 US B 连线 安装到   Bla ck B er r y   机上 择自   O T A   Bla ck Be rry Des kt o p M an ag e r 装到 Bla c kBe rry 上。 安装 Bla ck Be rry 能手 机上 发现 程序 仍无   Bla c kBe rr y     T r ans c o der   使 严格

BE S 设置 才可端运   T r an sc o der AP I 相关

要在 运行 T r ans c o de r AP I 相关 须在 BE S 服务器建一 IT P o li cy 并在 IT P o li cy 客户 端程 has h 码。

获取 c o d has h 码有 多种 发的 c o d 在开 发环 jad 得到 c o d has h T r ans c o der Cli en t .c o d 应的 j ad 文件

T r ans c o de rCli en t .ja d 9 RIM-C OD -S HA 1 c o d 件的 has 码,

使                                                                                            

0 1 f 25 24 f 0 0 f a 5 9 0 89 6 05 2 556 b6f 7 f 1 55 4 5 0 27 e 5 2  

 

   

 

 

 

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

ja v alo ad er 一个   c o d 件对   has h 码。 J a v alo ad er 下:

Ja v alo ad er s ib li ng in f o <c o d 文件 >

本例 ja v alo ad er 令行 输出 c : /t e m p/c o di n f o . t xt 中:

ja v alo ad er s ib li ng in f o t r ans c o der cl ien t .c o d > c : /t emp /co di n f o . t x t

  c o di n f o . t xt 打开以后如 图:

 

其中 Has h 的就 T r ans c o derCli en t .c o d 对应的 has h 码。

获取   c o d   h as h   has h   IT   P o li cy 建的   I T   P o li cy ,选择

S ecurity 下图 是在   BE S 5 . 0 W eb 中得 图:

在选 S ecu rit y 标页 后, S ec urit y T r ans c o der Co d F il e Ha s hes 栏, 将上 has h 填入 ,如 图:

 

 

 

 

 

 

 

完成 IT P o li cy ,为 测试分配 IT   P o li cy 并向 IT P o li cy   IT P o li cy 于该 测试 户。

IT P o li cy T r ans c o derCli en t 用就 行该 可以 的“ S t a rt ”菜 密应

在启 Bla c kB er r y 能手

                                                   

T r ans c o de r 正常 工作,   务器 端应 程。

 

配置服务器端 程序

 

 

如之述的 T r ans c o der 服务是通 BE S 服务 服务

    T r ans c o der   程序 需要 访     BE S   务器 将我们创 的服务器端 序,也就 生成

MyT r ans c o der .d ll   拷贝     BE S   服务器上,本     M yT r ans c o der .d ll   拷贝     BE S   服务器的

c : /w o rk s pa ce/t r ans c o der ”目 下。

然后   BE S 所在   W in do w s   下运 r eg edit 册表 编辑

                          HK E Y_ L O CAL_ MA CHI NE /S OF TW AR E / R esea r ch     In Mot ion /Bla ck Be r ry En t er p ris e S e r ve r /Dis pa t ch e r 在初 始状 Dis pa t ch e r 置中 会出 面“ T r ans c o der 项目此时需要 Dis pa t ch er 项点击右,选“新 - > 在新 建项 T r ans c o der T r a ns c o der T r ans c o de r 项打开该项, 点击右键,选择“新 - > 串值 ,在新建字符 值对话框中,在名 栏输入 T r ans c o der ,在 数据一栏输 服务器 端应   dll   文件的 路径名 ,本例中

c : /w o rk s pa ce/t r ans c o der / MyT r ans c o der .d ll 置后 的结 图:

 

完成 重启 BE S 服务 Dis pa t ch er 任务 置的 dll 入内 的时 通过 W in d o w s 的服 以通过 BE S 整个 BE S 服务 例中 My T r ans c o de r .d ll 载入 时会 c : /t r ans c o der 录下 生成 如果使 例的   My T r ans c o der .d ll 启动   BE S   服务 要手 c :/ t r an sc o der 出现 错误 BE S 启动

BE S 5 . 0 W eb 中重   BE S

 

 

在服 观察   BE S   Dis pa t ch er   BE S 服务

  Log s    C : /P r og r am    F il es /R esea r ch    In    Mot io n/Bla ck Be rry    En t e rpris e S er v er / Logs 缺省 Dis pa t ch e r 务的 APP _DIS P 开头 APP _DISP _0 1 _ 2 0 1 0 02 0 2 _00 01 . t xt ”。

如果 功的 Dis pa t ch e r T r ans c o der DLL lo ad ed ”一 句,

 

 

 

如果无 加载 话也会有 对应的 误, 现无法加 载错误 话有 能是注册 表中输   dll 路径 T r ans c o der 如果 Dis pa t ch er 有发 t r ans c o der 相关 则说 表配 注册 置不 查注 T r ans c o de r 项是

 

测试结果

 

 

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

代码分析

 

 

服务 端代码分析

 

为了 T r a ns c o der AP I 使下面 对服

#in cl ud e " s t da fx.h "

#in cl ud e " BE S T r ans c o der AP I. h"

#in cl ud e <io s t r eam > 以上 BE S T r ans c o derAP I. h 文件 T r ans c o de r AP I 使 的函

F ILE * logF il e;

ch ar LogF il eN am e[ 6 4 ]="c :// T r ans c o der // T r ans c o de r -Log . t xt" ; 以上 与日 志操 T r ans c o de r AP I 使用 必要 为了 执行 跟踪 所以 志文录相 信息 名硬 c: // T r ans c o de r // T r ans c o der -Log . t xt 者可 试环 注意整变 LogF il eN a m e

DEF INE_ BE S _T RA NSC OD E R_ DLL

以上这句 T r ans c o der AP I 定义这句 T r ans c o der AP I 使关键 ,为 让头 文件 BE S T r ans c o der AP I. h ”中的相关定义可以在本程序中使用,必须通过语 DEF INE_ BE S _T RA NSC OD E R_ DLL 素引 c/ c++ 预定 义机 的读 以了 不深 语句 T r ans c o der AP I 使用 时必

BOO L AP IE NTR Y Dll Ma in ( HA NDLE h Mo du le, DWO RD ul_ r easo n_f o r _c al l, LP V OI D lp R e s er v ed )

{

prin t f( " Lo ad in g Dl l" ) ;

r et urn T RU E ;

}

以上 dll dll 的载 数在 dll 调用 本例 只是 Lo ad in g Dll 行其

__ decls pec ( dl l e xpo rt )

in t __cdec l Lo ad D LL( )

{

logF il e = f o pen( LogF il eN am e , "a" ) ; fprin t f( logF il e,"t ryin g t o c al l Lo ad Dl l" ) ; r et urn 0 ;

}

以上代码 dll 适合 入过 ,如 志文   dl l   载入 这里 语句   f o pen 此外 日志 了“ t r yin g t o c al l Lo ad Dll ”字 串。 在实 入加加入 连接 C A 取服 务器 返回 0 际环 始化 行情 如果 返回其它 0 如果 它非

0 ,该   dll 内存 也不 用。

 

__ decls pec ( dl l e xpo rt )

v o id __cd ecl F r ee DL L( )

{

fprin t f( logF il e,"Dl l fre e") ;

}

F r ee Dl l dll 数,可等资 源释 需要 释放资源, 以在 志文 Dl l fre e ”。

__ decls pec ( dl l e xpo rt )

uns ig ned c ha r __ cd ecl G et ID ( )

{

uns ig ned lo ng T r ans c o de rID =2 0 ; fprin t f( logF il e,"t ryin g t o g et I D" ) ; r et urn ( uns ig ned c ha r ) T r ans c o de rID ;

}

G et ID ID 使用 2 0 ID 返回 2 0 要确 返回 uns ig ned c ha r 类型。

__ decls pec ( dl l e xpo rt )

in t __cdec l W il l T r ans c o de( c o ns t T r ans c o derCo n t e xt *c o ns t c o n t e xt )

{

r et urn 0 ;

}

W il lT r ans c o de 定是 否需 要进 操作 返回 0 消息 都需 作。

__ decls pec ( dl l e xpo rt )

in t __cdec l En c o de ( T r ans co derIn putSt r eam       *c o ns t in put , T r a ns c o derOut putSt r eam  *c o ns t o ut put , c o ns t T r ans c o der Co n t e xt *c o ns t c o n t e xt )

{

函数 Enc o de 行加 数有 i np ut o ut put c o n t e xt ,其中 inpu t 系统 o ut pu t 为传 函数 in p ut 中获 据, 通过 o ut pu t 系统。

fprin t f( logF il e,"t es t in g enc o de is r un ni ng no w") ;

以上 出“ t es t in g enc o de is run ni ng no w 于记   Enc o de 件。

uns ig ned c ha r r ead C;

fprin t f( logF il e,"     /n enc o de r ead c ha r : " ) ;

 

 

whi le ( in put - >R ead ( & r ead C) )

{

fprin t f( logF il e,"%c" ,r ea dC) ;

o ut put ->W rit e( r eadC ) ;

}

以上了变   r eadC 调用   inpu t   R ea d 方法 将数到变   r eadC   r eadC

输出   o ut pu t   W ri t e   r eadC   o ut pu t

输出 环可 inpu t 据传 o ut pu t 中。 本段 键,   原封 o ut pu t 输出 现实 数据密操 作后 入到 o ut pu t 输出流

r et urn 0 ;

}

最后 加密 功。

__ decls pec ( dl l e xpo rt )

in t __cdec l D ec o de( T r ans c o derIn putSt r eam       *c o ns t in put , T r a ns c o derOut putSt r eam  *c o ns t o ut put , c o ns t T r ans c o der Co n t e xt *c o ns t c o n t e xt )

{ D

 

 

fprin t f( logF il e,"     /n dec o de r ead c ha r : " ) ;

 

 

 

 

 

uns ig ned c ha r r ead C;

whi le ( in put - >R ead ( & r ead C) )

{

fprin t f( logF il e,"%c" ,r ea dC) ;

o ut put ->W rit e ( r eadC ) ;

}

以上了变 r eadC 似于 Enc o de 中的 环将 in p ut 中的 数据写入 o ut pu t 环境 i np ut 中读 后才写入 o ut pu t 中。

r et urn 0 ;

}

最后 密成

 

 

手机 代码分析

 

以下 析:

手机 调用 T r ans c o de rMa na g e r r eg ist er 客户 到系 统中。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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);


 

}

}

                          My T r ans c o der                    t r ans c o de r        

T r ans c o de rMa na g er   r eg is t er   t r ans c o de r 到系 统中。

 

 

 

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 类定义 句, My Tr an s co de r 类是 Transcoder 的子类。

private MyScreen screen = null ;

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

public MyTranscoder() {

super (( byte ) 20);

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

public void SetScreen(MyScreen screen) {

this . screen = screen;

} 本函数 screen 性指 定对象 MyTranscod er 实例化 被主 幕类调用 主要作 MyTranscoder 存屏幕 的句 ,从 主屏幕 相关 法以 屏幕显 内容。 函数在 Transcod er 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 用于对 据进行加 密操作 因为 input read 操作和 output w ir te 操作有 会抛出 常, 以需 try,catch 语句捕 try 段中 义了 re ad By t e 通过调用 input read 数将数 读入到 readByte 中,然 再将 readByte 的数据 入到 output 中。最 本函数返 true 表示 密成

public boolean willTranscode(IntHashtable context) {

return true ;

}

}

W il lT r ans c o de 于确 定是 息都 返回 t ru e 表示 对所 操作。

 

 

 

 
 

 

 

BlackBerry SDK下载

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值