如何使用Bouncy Castle Crypto API来加密和解密数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Bouncy Castle Crypto API来加密和解密数据相关的知识,希望对你有一定的参考价值。

参考技术A 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() );



以上是关于如何使用Bouncy Castle Crypto API来加密和解密数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Bouncy Castle解密AES / CCM加密密文?

如何使用 Bouncy Castle 创建与 OpenSSH 兼容的 ED25519 密钥?

为 Bouncy Castle C# API 使用多个键

在没有 Bouncy Castle 的情况下,如何在 java 中从私有(ecdsa)生成公钥?

Bouncy Castle Java PGP加解密

markdown CSS 3D Bouncy Castle