當前位置:編程學習大全網 - 編程語言 - 如何使用Bouncy Castle Crypto API來加密和解密數據

如何使用Bouncy Castle Crypto API來加密和解密數據

import org.bouncycastle.crypto.*;

import org.bouncycastle.crypto.engines.*;

import org.bouncycastle.crypto.modes.*;

import org.bouncycastle.crypto.params.*;

// 壹個簡單的例子說明了如何使用Bouncy Castle

// 加密API來執行對任意數據的DES加密

public class Encryptor {

private BufferedBlockCipher cipher;

private KeyParameter key;

// 初始化加密引擎.

// 數組key的長度至少應該是8個字節.

public Encryptor( byte[] key ){

/*

cipher = new PaddedBlockCipher(

new CBCBlockCipher(

new DESEngine() ) );

*/

cipher = new PaddedBlockCipher(

new CBCBlockCipher(

new BlowfishEngine() ) );

this.key = new KeyParameter( key );

}

// 初始化加密引擎.

// 字符串key的長度至少應該是8個字節.

public Encryptor( String key ){

this( key.getBytes() );

}

// 做加密解密的具體工作

private byte[] callCipher( byte[] data )

throws CryptoException {

int size =

cipher.getOutputSize( data.length );

byte[] result = new byte[ size ];

int olen = cipher.processBytes( data, 0,

data.length, result, 0 );

olen += cipher.doFinal( result, olen );

if( olen < size ){

byte[] tmp = new byte[ olen ];

System.arraycopy(

result, 0, tmp, 0, olen );

result = tmp;

}

return result;

}

// 加密任意的字節數組,以字節數組的方式返回被加密的數據

public synchronized byte[] encrypt( byte[] data )

throws CryptoException {

if( data == null || data.length == 0 ){

return new byte[0];

}

cipher.init( true, key );

return callCipher( data );

}

// 加密壹個字符串

public byte[] encryptString( String data )

throws CryptoException {

if( data == null || data.length() == 0 ){

return new byte[0];

}

return encrypt( data.getBytes() );

}

// 解密壹個字節數組

public synchronized byte[] decrypt( byte[] data )

throws CryptoException {

if( data == null || data.length == 0 ){

return new byte[0];

}

cipher.init( false, key );

return callCipher( data );

}

// 解密壹個字符串

public String decryptString( byte[] data )

throws CryptoException {

if( data == null || data.length == 0 ){

return "";

}

return new String( decrypt( data ) );

}

}

下邊的代碼演示如何使用上邊的Encryptor類來加密解密數據

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

import javax.microedition.rms.*;

import org.bouncycastle.crypto.*;

import java.math.BigInteger;

public class CryptoTest extends MIDlet {

private Display display;

private Command exitCommand = new Command( "Exit", Command.EXIT, 1 );

private Command okCommand = new Command( "OK", Command.OK, 1 );

private Encryptor encryptor;

private RecordStore rs;

/** 構造函數*/

public CryptoTest() {

}

private void initialize() {

}

public void startApp() {

initialize();

if( display == null ){ // first time called...

initMIDlet();

}

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

exitMIDlet();

}

private void initMIDlet(){

display = Display.getDisplay( this );

// 打開名為"test3"的RecordStore

try {

rs = RecordStore.openRecordStore( "test3",

true );

} catch( RecordStoreException e ){

}

display.setCurrent( new AskForKey() );

}

public void exitMIDlet(){

try {

if( rs != null ){

rs.closeRecordStore();

}

} catch( RecordStoreException e ){

}

notifyDestroyed();

}

private void displayException( Exception e ){

Alert a = new Alert( "Exception" );

a.setString( e.toString() );

a.setTimeout( Alert.FOREVER );

display.setCurrent( a, new AskForKey() );

}

class AskForKey extends TextBox

implements CommandListener {

public AskForKey(){

super( "Enter a secret key:", "", 8, 0 );

setCommandListener( this );

addCommand( okCommand );

addCommand( exitCommand );

}

public void commandAction( Command c,

Displayable d ){

if( c == exitCommand ){

exitMIDlet();

}

String key = getString();

if( key.length() < 8 ){

Alert a = new Alert( "Key too short" );

a.setString( "The key must be " +

"8 characters long" );

setString( "" );

display.setCurrent( a, this );

return;

}

encryptor = new Encryptor( key );

try {

if( rs.getNextRecordID() == 1 ){

display.setCurrent(

new EnterMessage() );

} else {

byte[] data = rs.getRecord( 1 );

String str =

encryptor.decryptString( data );

Alert a =

new Alert( "Decryption" );

a.setTimeout( Alert.FOREVER );

a.setString(

"The decrypted string is '" +

str + "'" );

display.setCurrent( a, this );

}

} catch( RecordStoreException e ){

displayException( e );

} catch( CryptoException e ){

displayException( e );

}

}

}

class EnterMessage extends TextBox

implements CommandListener {

public EnterMessage(){

super( "Enter a message to encrypt:", "",

100, 0 );

BigInteger bigInt = new BigInteger("199999");

setCommandListener( this );

addCommand( okCommand );

}

public void commandAction( Command c,

Displayable d ){

String msg = getString();

try {

byte[] data =

encryptor.encryptString( msg );

rs.addRecord( data, 0, data.length );

} catch( RecordStoreException e ){

displayException( e );

} catch( CryptoException e ){

displayException( e );

}

display.setCurrent( new AskForKey() );

}

}

}

  • 上一篇:華南理工大學哪個專業好
  • 下一篇:幼兒園小班遊戲老鷹捉小雞教案
  • copyright 2024編程學習大全網