为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: DM8
【操作系统】:WIN10
【CPU】:
【问题描述】*:Java AES128_ECB加密结果和达梦AES128_ECB加密结果不一样,Java应该怎么写
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
private static final int KEY_SIZE = 16;
public static void main(String[] args) throws Exception {
String input = "13607984987";
String key = "1234567891234567";
String encrypted = encrypt(input, key);
System.out.println("加密后的字符串:" + encrypted);
}
public static String encrypt(String input, String key) throws Exception {
if (key == null || key.length() != KEY_SIZE) {
throw new IllegalArgumentException("密钥必须是" + KEY_SIZE + "位");
}
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encryptedBytes = cipher.doFinal(input.getBytes(StandardCharsets.UTF_8));
return bytesToHex(encryptedBytes);
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", b));
}
return sb.toString();
}
}
一个建议,如果加密原始数据或密钥中存在汉字的话,建议转换数据类型时把字符集转成UTF8,免得与JAVA转换结果不一致。
--asc字符结果无区别
SELECT RAWTOHEX(DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW('13607984987','UTF8')
,DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5
,UTL_I18N.STRING_TO_RAW('1234567891234567','UTF8')
)
);
--含有汉字的数据建议转换一下
SELECT RAWTOHEX(DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW('测试一下','UTF8')
,DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5
,UTL_I18N.STRING_TO_RAW('测试一下测试一下','UTF8')
)
);
你试试下面这个办法是否可行
SELECT RAWTOHEX(DBMS_CRYPTO.ENCRYPT(CHARTOBIN('13607984987') ,DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5 ,CHARTOBIN('1234567891234567') ) )