メインコンテンツまでスキップ

暗号・復号化プログラム

プログラムの用途実装するJavaインターフェース適用する設定画面
暗号・復号化プログラムSecurityBlockProcessBase Setting Management > Encryption Information

暗号・復号化プログラムは、機関およびシステムで暗号・復号化を使用する場合に開発して適用する。

開発方法

BXIで提供するSEED-256、ARIA-256、AES-256、T-DESなどの基本暗号化アルゴリズムを使用する場合には、別途プログラム開発なしに、BXIで提供するプログラムを使用することができる。(ex.AesCipher、AesSecurityなど)

暗号化API

電文や特定フィールドのデータを暗号化してEncodingする。

@Override
public byte[] encrypt(String secretKey, SecurityBlockTypeEnum blockType,
EncodingDecodingWayEnum encoding, byte[] textMessage) throws Exception {

// If the library is not loaded, loading
if (!loadFlag) {
return null;
}

String message = new String(textMessage, CharsetUtil.DEFAULT_CHARSET);
String msgLen = message.substring(8, 16);
int len = Integer.parseInt(msgLen);

logger.debug("std Message Len [{}], textMessage Len [{}]", len, textMessage.length);

if (len == textMessage.length) {
return textMessage;
}

byte[] textByte = new byte[textMessage.length - len];
System.arraycopy(textMessage, len, textByte, 0, textMessage.length - len);

/** encrypt Library Call */
byte[] secretMessage = CryptionBlockProcessImpl.encrypt(secretKey, textByte, textByte.length);
if (ObjectUtil.isEmpty(secretMessage)) {
return textMessage;
}

/** encrypt Message Composit */
byte[] array = new byte[secretMessage.length + len];
System.arraycopy(textMessage, 0, array, 0, len);
System.arraycopy(secretMessage, 0, array, len, secretMessage.length);

return EncDecodingUtil.encoding(encoding, array);
}

Nativeで開発された暗号化モジュールを呼び出して暗号化し、Encodingの種類によってEncodingする。 暗号化開始位置は、電文の長さ部を除いて、暗号化を始まる位置を表す。

☑ 入力

  • secretKey : 暗号化キー
  • blockType : textMessageを暗号化する時に使用するBlockタイプ
  • encoding : 暗号化後、暗号化されたデータをEncodingする方式
  • textMessage : 一般テキストデータ

☑ 出力

  • 暗号化してEncodingしたデータ

復号化API

暗号化されたデータをDecodingして復号化する。

@Override
public byte[] decrypt(String secretKey, SecurityBlockTypeEnum blockType,
EncodingDecodingWayEnum decoding, byte[] secretMessage) throws Exception {

// If the library is not loaded, loading
if (!loadFlag) {
return null;
}

byte[] inBytes = EncDecodingUtil.decoding(decoding, secretMessage);
String message = new String(inBytes, CharsetUtil.DEFAULT_CHARSET);
String msgLen = message.substring(8, 16);
int len = Integer.parseInt(msgLen);

logger.debug("std Message Len [{}], secretMessage Len [{}]", len, secretMessage.length);

if (len == secretMessage.length) {
return secretMessage;
}

byte[] secretByte = new byte[secretMessage.length - len];
System.arraycopy(secretMessage, len, secretByte, 0, secretMessage.length - len);

/** decrypt Library Call */
byte[] plainMessage = CryptionBlockProcessImpl.decrypt(secretKey, secretByte, secretByte.length);
if (ObjectUtil.isEmpty(plainMessage)) {
return secretMessage;
}

/** decrypt Message Composit */
byte[] array = new byte[plainMessage.length + len];

/** Total Message Len */
String value = String.valueOf(array.length);
value = ConversionUtil.numericToString(value, 8);
System.arraycopy(value.getBytes(CharsetUtil.DEFAULT_CHARSET), 0, array, 0, 8);

System.arraycopy(secretMessage, 8, array, 8, len - 8);
System.arraycopy(plainMessage, 0, array, len, plainMessage.length);

return array;
}

まず、暗号化されたデータをDecodingし、Nativeで開発された復号化モジュールを呼び出して復号化する。 復号化開始位置は、電文の長さ部を除いて、復号化を始まる位置を表す。

☑ 入力

  • secretKey : 復号化キー
  • blockType : secretMessageを復号化する時に使用するBlockタイプ
  • decoding : 復号化前に暗号化されたデータをDecodingする方式
  • secretMessage : 暗号化されたデータ

☑ 出力

  • 復号化データ

全体例

import java.nio.charset.Charset;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import bxi.api.SecurityBlockProcess;
import bxi.common.utility.CharsetUtil;
import bxi.common.utility.ObjectUtil;
import bxi.parser.conversion.ConversionUtil;

@Component
public class CryptionBlockProcessImpl implements SecurityBlockProcess {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

/** Library name */
private static final String LIBRARY_NAME = "vicc";

/** Encryption function */
private native static byte[] encrypt(String ucDerivationData, byte[] plainStr, int plainLen);

/** Decryption function */
private native static byte[] decrypt(String ucDerivationData, byte[] encStr, int encLen);

/** Library loading whether */
private static boolean loadFlag = false;

/** Encryption/Decryption library loading */
static {
try {
System.loadLibrary(LIBRARY_NAME);
loadFlag = true;
} catch (Exception e) {
loadFlag = false;
}
}

@Override
public byte[] encrypt(String secretKey, String textMessage, String charsetName) throws Exception {
return encrypt(secretKey, SecurityBlockTypeEnum.CBC, EncodingDecodingWayEnum.NONE,
textMessage, charsetName);
}

@Override
public byte[] encrypt(String secretKey, byte[] textMessage) throws Exception {
return encrypt(secretKey, SecurityBlockTypeEnum.CBC, EncodingDecodingWayEnum.NONE,
textMessage);
}

@Override
public byte[] encrypt(String secretKey, SecurityBlockTypeEnum blockType,
EncodingDecodingWayEnum encoding, String textMessage, String charsetName)
throws Exception {

Charset charset = (ObjectUtil.isEmpty(charsetName))
? CharsetUtil.DEFAULT_CHARSET : CharsetUtil.getCharset(charsetName);
byte[] message = textMessage.getBytes(charset);

return encrypt(secretKey, blockType, encoding, message);
}

@Override
public byte[] encrypt(String secretKey, SecurityBlockTypeEnum blockType,
EncodingDecodingWayEnum encoding, byte[] textMessage) throws Exception {

// If the library is not loaded, loading
if (!loadFlag) {
return null;
}

String message = new String(textMessage, CharsetUtil.DEFAULT_CHARSET);
String msgLen = message.substring(8, 16);
int len = Integer.parseInt(msgLen);

logger.debug("std Message Len [{}], textMessage Len [{}]", len, textMessage.length);

if (len == textMessage.length) {
return textMessage;
}

byte[] textByte = new byte[textMessage.length - len];
System.arraycopy(textMessage, len, textByte, 0, textMessage.length - len);

/** encrypt Library Call */
byte[] secretMessage = CryptionBlockProcessImpl.encrypt(secretKey, textByte, textByte.length);
if (ObjectUtil.isEmpty(secretMessage)) {
return textMessage;
}

/** encrypt Message Composit */
byte[] array = new byte[secretMessage.length + len];
System.arraycopy(textMessage, 0, array, 0, len);
System.arraycopy(secretMessage, 0, array, len, secretMessage.length);

return EncDecodingUtil.encoding(encoding, array);
}

@Override
public byte[] decrypt(String secretKey, String secretMessage, String charsetName) throws Exception {
return decrypt(secretKey, SecurityBlockTypeEnum.CBC, EncodingDecodingWayEnum.NONE,
secretMessage, charsetName);
}

@Override
public byte[] decrypt(String secretKey, byte[] secretMessage) throws Exception {
return decrypt(secretKey, SecurityBlockTypeEnum.CBC, EncodingDecodingWayEnum.NONE,
secretMessage);
}

@Override
public byte[] decrypt(String secretKey, SecurityBlockTypeEnum blockType,
EncodingDecodingWayEnum decoding, String secretMessage, String charsetName)
throws Exception {

Charset charset = (ObjectUtil.isEmpty(charsetName))
? CharsetUtil.DEFAULT_CHARSET : CharsetUtil.getCharset(charsetName);
byte[] message = secretMessage.getBytes(charset);

return decrypt(secretKey, blockType, decoding, message);
}

@Override
public byte[] decrypt(String secretKey, SecurityBlockTypeEnum blockType,
EncodingDecodingWayEnum decoding, byte[] secretMessage) throws Exception {

// If the library is not loaded, loading
if (!loadFlag) {
return null;
}

byte[] inBytes = EncDecodingUtil.decoding(decoding, secretMessage);
String message = new String(inBytes, CharsetUtil.DEFAULT_CHARSET);
String msgLen = message.substring(8, 16);
int len = Integer.parseInt(msgLen);

logger.debug("std Message Len [{}], secretMessage Len [{}]", len, secretMessage.length);

if (len == secretMessage.length) {
return secretMessage;
}

byte[] secretByte = new byte[secretMessage.length - len];
System.arraycopy(secretMessage, len, secretByte, 0, secretMessage.length - len);

/** decrypt Library Call */
byte[] plainMessage = CryptionBlockProcessImpl.decrypt(secretKey, secretByte, secretByte.length);
if (ObjectUtil.isEmpty(plainMessage)) {
return secretMessage;
}

/** decrypt Message Composit */
byte[] array = new byte[plainMessage.length + len];

/** Total Message Len */
String value = String.valueOf(array.length);
value = ConversionUtil.numericToString(value, 8);
System.arraycopy(value.getBytes(CharsetUtil.DEFAULT_CHARSET), 0, array, 0, 8);

System.arraycopy(secretMessage, 8, array, 8, len - 8);
System.arraycopy(plainMessage, 0, array, len, plainMessage.length);

return array;
}
}