打印

DES加密跨平台问题啊。。。。。。。。。。。

DES加密跨平台问题啊。。。。。。。。。。。


   KeyGenerator kg = KeyGenerator.getInstance("DES");
   kg.init(new SecureRandom(strKey.getBytes()));
在Win下生成的密文,在Linux下解开时候就抛出异常!
不知道有人遇到过吗?

TOP

具体抛出什么样的异常呢?
拥抱智慧地球!地球守护使者!

TOP

5555555555555555

javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at DesUtil.createDecryptor(DesUtil.java:106)
at DesUtil.main(DesUtil.java:144)
Exception in thread "main" java.lang.NullPointerException
at java.io.FileOutputStream.write(Unknown Source)
at DesUtil.main(DesUtil.java:147)

异常。。。。。。。。。。。


我看网上说用base64一下就可以了,我按照他说的依旧不行啊。

TOP

看你的exception stack trace,应该是打开的文件读密文。
1、密文是不是ftp传送的,如果是,大概模式不对,应该用binary 模式;
2、如果不是,把两边传送的机制说一下,看能不能帮上忙。

TOP

import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.MessageDigest;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* Security 提供了一个安全算法类,其中包括对称密码算法和散列算法
*/
public final class EbotongSecurity {
// The length of Encryptionstring should be 8 bytes and not be
// a weak key
private final static BASE64Encoder base64encoder = new BASE64Encoder();
private final static BASE64Decoder base64decoder = new BASE64Decoder();
private final static String encoding = "UTF-8";
/**
* 加密字符串
*/
public static String ebotongEncrypto(String str) {
String result = str;
if (str != null && str.length() > 0) {
try {
byte[] encodeByte = symmetricEncrypto(str.getBytes(encoding));
result = base64encoder.encode(encodeByte);
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
/**
* 解密字符串
*/
public static String ebotongDecrypto(String str) {
String result = str;
if (str != null && str.length() > 0) {
try {
byte[] encodeByte = base64decoder.decodeBuffer(str);
byte[] decoder = EbotongSecurity.symmetricDecrypto(encodeByte);
result = new String(decoder, encoding);
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
/**
* 对称加密方法
*  
* @param byteSource
*            需要加密的数据
* @return 经过加密的数据
* @throws Exception
*/
public static byte[] symmetricEncrypto(byte[] byteSource) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
int mode = Cipher.ENCRYPT_MODE;
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
byte[] keyData = { 1, 9, 8, 2, 0, 8, 2, 1 };
DESKeySpec keySpec = new DESKeySpec(keyData);
Key key = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(mode, key);
byte[] result = cipher.doFinal(byteSource);
return result;
} catch (Exception e) {
throw e;
} finally {
baos.close();
}
}
/**
* 对称解密方法
*  
* @param byteSource
*            需要解密的数据
* @return 经过解密的数据
* @throws Exception
*/
public static byte[] symmetricDecrypto(byte[] byteSource) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
int mode = Cipher.DECRYPT_MODE;
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
byte[] keyData = { 1, 9, 8, 2, 0, 8, 2, 1 };
DESKeySpec keySpec = new DESKeySpec(keyData);
Key key = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(mode, key);
byte[] result = cipher.doFinal(byteSource);
return result;
} catch (Exception e) {
throw e;
} finally {
baos.close();
}
}
/**
* 散列算法
*  
* @param byteSource
*            需要散列计算的数据
* @return 经过散列计算的数据
* @throws Exception
*/
public static byte[] hashMethod(byte[] byteSource) throws Exception {
try {
MessageDigest currentAlgorithm = MessageDigest.getInstance("SHA-1");
currentAlgorithm.reset();
currentAlgorithm.update(byteSource);
return currentAlgorithm.digest();
} catch (Exception e) {
throw e;
}
}
}

TOP

我想你加密解密算法可能是没问题的。因此你给我的这个程序文件不见得有帮助。

我的意思是如何从密文 Win 传到 Linux 下,在传送过程中的密文数据大概出了问题。

TOP

无法提供解决方案,如果是我会尝试以下思考办法,可以参考一下:

建议:
1、算法问题:
     在本机对一个源串测试加解密,看看本算法能否验证通过。

2、源串问题
   
     加密:假设源串是”中文“两个字,在中文操作系统下,加密算法能正确加密(密文如"01001");解密也能解成”中文“两字。
    传输:密文"01001"能正确传送到Linux
    解密:解密算法正常,在支持中文的操作系统下,应该能解密成”中文“两个字。
              【但如果Linux环境不支持中文】那么,解密出来的String将不是”中文“两字,而是一个乱码(从代码看出来,你的程序需要构造一个字符串并返回,所以这个是有可能的),若此时以解密出来的String来判断解密是否正常,那么就会失败。

3、JDK问题
    建议在win和linux使用同样的jdk。从报错来看,难以分析原因,所以尝试使用同样的jdk应该对排查问题有帮助。

[ 本帖最后由 kbzhao 于 2010-4-15 10:16 编辑 ]

TOP

1、后面提供的源码里居然没有
KeyGenerator kg = KeyGenerator.getInstance("DES");
kg.init(new SecureRandom(strKey.getBytes()));
这两行代码?

2、在后面所提供的代码里增加了一下
public static void main(String[] args)
{
        String orgString = args[0];
        System.out.println(orgString);
        System.out.println(ebotongEncrypto(orgString));
}

3、在Windows下编译运行了一下SUN 1.5.0的JDK
C:\>java -version
java version "1.5.0_20"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_20-b02)
Java HotSpot(TM) Client VM (build 1.5.0_20-b02, mixed mode, sharing)

C:\>java EbotongSecurity abc
abc
uiLIttWmv9M=

4、在AIX 5.3上运行了一下
$ /opt/IBM/InformationServer/ASBNode/apps/jre/bin/java -classpath . EbotongSecurity abc
abc
uiLIttWmv9M=
$ /opt/IBM/InformationServer/ASBNode/apps/jre/bin/java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pap64devifx-20080906 (SR8a + IZ29767 + IZ30684 + IZ31214 + IZ31213))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9vmap6423ifx-20080811 (JIT enabled)
J9VM - 20080809_21892_BHdSMr
JIT  - 20080620_1845_r8
GC   - 200806_19)
JCL  - 20080906

IBM JDK不同版本Windows的测试结果
C:\>d:\IBM\WebSphere\AppServer\5.1\java\bin\java -cp . EbotongSecurity abc
abc
uiLIttWmv9M=

C:\>d:\IBM\WebSphere\AppServer\6.0\java\bin\java -cp . EbotongSecurity abc
abc
uiLIttWmv9M=

C:\>d:\IBM\WebSphere\AppServer\6.1\java\bin\java -cp . EbotongSecurity abc
abc
uiLIttWmv9M=

C:\>d:\IBM\WebSphere\AppServer\7.0\java\bin\java -cp . EbotongSecurity abc
abc
uiLIttWmv9M=

AIX上不同JDK的测试结果
$ /ibm/YuLimin/WebSphere/AppServer61/java/bin/java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pap64devifx-20090506 (SR9-SSU +PK76176+IZ44410+IZ44495))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9vmap6423ifx-20090225 (JIT enabled)
J9VM - 20090224_30451_BHdSMr
JIT  - 20081112_1511ifx1_r8
GC   - 200811_07)
JCL  - 20090506
$ /ibm/YuLimin/WebSphere/AppServer70/java/bin/java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pap6460sr6ifix-20091015_01(SR6+152211+155930+156106))
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 AIX ppc64-64 jvmap6460sr6-20091001_43491 (JIT enabled, AOT enabled)
J9VM - 20091001_043491
JIT  - r9_20090902_1330ifx1
GC   - 20090817_AA)
JCL  - 20091006_01
$ /ibm/YuLimin/WebSphere/AppServer70/java/bin/java -cp . EbotongSecurity abc
abc
Apr 15, 2010 2:58:32 PM java.util.prefs.FileSystemPreferences$2 run
WARNING: Couldn't create user preferences directory. User preferences are unusable.
Apr 15, 2010 2:58:32 PM java.util.prefs.FileSystemPreferences$2 run
WARNING: java.io.IOException: A file or directory in the path name does not exist.
uiLIttWmv9M=

手上没有Linux的测试环境,回头再测试一下看

[ 本帖最后由 YuLimin 于 2010-4-15 15:00 编辑 ]
简单就是美!
我的Java:http://www.Java2Class.net

TOP