暗号・復号化プログラム
プログラムの用途 | 実装するJavaインターフェース | 適用する設定画面 |
---|---|---|
暗号・復号化プログラム | SecurityBlockProcess | Base 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;
}
}