当使用Java应用3des加密时,与3des在线工具和oracle DB脚本相比,java代码生成错误的结果
3des加密,Java
SET SERVEROUTPUT ON;
declare
l_mod_ofb pls_integer;
l_mod_ecb pls_integer;
v_key raw(32);
v_iv raw(16);
v_test_in raw(16); v_ciphertext raw(16);
begin
l_mod_ecb := dbms_crypto.ENCRYPT_3DES_2KEY + dbms_crypto.CHAIN_CBC + DBMS_CRYPTO.PAD_NONE ;
v_key := hextoraw ('1FB3F48A6D51832CE91C1C734554086D');
v_iv := hextoraw ('041234FFFFFFFFFF');
v_test_in := hextoraw ('0000211111111110');
v_ciphertext := dbms_crypto.encrypt(src => v_test_in,
TYP => l_mod_ecb,
key => v_key,
iv => v_iv);
dbms_output.put_line(' Ciphertext : '||rawtohex(v_ciphertext));
end;
------------------- Java代码
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
public class TripleDes {
private static String SHARED_KEY = "1FB3F48A6D51832CE91C1C734554086D";
private static String ivString = "041234FFFFFFFFFF";
private static String valueStr = "0000211111111110";
static final String HEXES = "041217DB6AEFF7CF";
public static void main(String[] args) throws DecoderException, Exception {
TripleDes tr = new TripleDes();
byte[] plain = Hex.decodeHex(valueStr.toCharArray());
byte[] codedtext = tr.encrypt(plain);
System.out.println("Encrypted Result = " + getHex(codedtext));
}
public byte[] encrypt(byte[] plainTextBytes) throws Exception {
TripleDes tr = new TripleDes();
byte[] keyValue = getKey(Hex.decodeHex(SHARED_KEY.toCharArray()));
System.out.println(Hex.encodeHex(keyValue));
IvParameterSpec iv = new IvParameterSpec(Hex.decodeHex(ivString.toCharArray()));
//DESede
final SecretKey key = new SecretKeySpec(keyValue, "DESede");
final Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
final byte[] cipherText = cipher.doFinal(plainTextBytes);
return cipherText;
}
public static byte[] getKey(byte[] keyBytes) {
byte[] key;
if (keyBytes.length == 16) {
key = new byte[24];
System.arraycopy(keyBytes, 0, key, 0, 16);
System.arraycopy(keyBytes, 0, key, 16, 8);
} else {
key = keyBytes;
}
return key;
}
public static String getHex(byte[] raw) {
if (raw == null) {
return null;
}
final StringBuilder hex = new StringBuilder(2 * raw.length);
for (final byte b : raw) {
hex.append(HEXES.charAt((b & 0xF0) >> 4))
.append(HEXES.charAt((b & 0x0F)));
}
return hex.toString();
}
}
---------------在线工具
使用以下参数
Input type: Text
Input text:(hex)0000211111111110
Function: 3DES
Mode: CBS
Key: (hex)1FB3F48A6D51832CE91C1C734554086D1FB3F48A6D51832C
Init. vector: 041234FFFFFFFFFF
预期的结果是63CA0F38548CC8B5
在线工具和oracle脚本的结果与预期结果相同
Java代码结果:D2FE0F26716FF6F7
java参考方案
HEXES变量的值不正确,因此将其替换为0123456789ABCDEF
byte [] plain = Hex.decodeHex(valueStr.toCharArray());错误的分配
替换为DatatypeConverter.parseHexBinary(valueStr);
有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…
Java-如何将此字符串转换为日期? - java我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…
从方法返回数组-Java - javaprivate static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…
Java Swing SearchBox模型 - java我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。
JAVA:如何检查对象数组中的所有对象是否都是子类的对象? - java我有一个对象数组。现在,我要检查所有这些对象是否都是MyObject的实例。有没有比这更好的选择:boolean check = true; for (Object o : justAList){ if (!(o instanceof MyObject)){ check = false; break; } } java大神给出的解决方案 如果您不喜欢循环,则…