java des cipher在windows上有不同的结果

时间:2014-05-14 01:29:46

标签: java linux windows security encryption

我有一个API文档,需要加密密钥才能进行身份验证, 我设法构建并编译了他们的示例代码,但是windows上的结果与linux不同。

当我从Windows运行并进行测试时,所有内容似乎都是正确的,并且可以使用API​​。

Linux上的相同测试会输出不同的结果。我需要它在Linux上工作,因为那是主服务器。

我正在使用&在两个环境中运行相同的jar文件。

这是我尝试加密的密钥(它是一个动态密钥):

  

2136230 $ $ 486B91E1BEA5D082BA3601CD803585CE $二千○一十四万○四百○九$$二千○一十四万○四百○九ABCDEFGH $保留$ CTC

这是Windows上正确的输出(显然更长):

F7BE2B7E0CEAD9D09135FCF2A8AEB11E2937D26B33CCBC9B8132A29A3534040C9737B2A8E3F271A9DF6454696CF890F7886223AE9C86F81EF58E41AEAA3D34A80F7089154E64F4FD36E75C25A7C2DA7FF03D21F57DA950F5

这是Linux的错误输出:

F66D4CE1238B30EE54ABC74966D7AC3064FEA3ADFB9D37548E41509CE4FED9CB1D146651B491F2433169999A85F73DAF9ACD07A090DF3D85477BE4201ADC9E1A0181EA7CB763050A

造成这种情况的原因以及如何纠正它?

这是我们从API公司收到的程序的源代码:

public class DESUtil
{
    private static final String Algorithm = "DESede/ECB/PKCS5Padding";// DESede/ECB/PKCS5Padding;DESede

    private static final String DESede = "DESede";

    public static byte[] encrypt(byte[] keybyte, byte[] src)
    throws NoSuchAlgorithmException, NoSuchPaddingException, Exception
    {
        SecretKey deskey = new SecretKeySpec(keybyte, DESede);
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.ENCRYPT_MODE, deskey);
        return c1.doFinal(src);
    }

    public static byte[] decrypt(byte[] keybyte, byte[] src)
        throws NoSuchAlgorithmException, NoSuchPaddingException, Exception
    {
        SecretKey deskey = new SecretKeySpec(keybyte, DESede);
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.DECRYPT_MODE, deskey);
        return c1.doFinal(src);
    }

    public static String byte2hex(byte[] b)
    {
        StringBuffer hs = new StringBuffer();
        String stmp = "";
        for (int n = 0; n <b.length; n++)
        {
            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
            if (stmp.length() == 1)
                hs.append("0").append(stmp);
            else
                hs.append(stmp);
        }
        return hs.toString().toUpperCase(Locale.getDefault());
    }

    public static byte[] hex2byte(String hexStr)
    {
        if (hexStr.length() % 2 != 0)
        {
            AppLogger.error("hex2bytes's hexStr length is not even.");
            return null;
        }

        byte[] toBytes = new byte[hexStr.length() / 2];
        for (int i = 0, j = 0; i <hexStr.length(); j++, i = i + 2)
        {
            int tmpa = Integer.decode(
                "0X" + hexStr.charAt(i) + hexStr.charAt(i + 1)).intValue();
            toBytes[j] = (byte) (tmpa & 0XFF);
        }
        return toBytes;
    }


    public static void main(String[] args)
    {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        final byte[] rawKey = "db90e7eb".getBytes();
        final byte[] keyBytes = new byte[24];

        for (int i = 0; i <rawKey.length; i++)
        {
            keyBytes[i] = rawKey[i];
        }

        for (int i = rawKey.length; i <keyBytes.length; i++)
        {
            keyBytes[i] = (byte)0;
        }

        String szSrc = "20926330$AD75B1697FB5EB6345B2D412124030D2$10086$10086$10.164.111$ABCDEFGH$Reserved$CTC";
        System.out.println("string before encrypt:" + szSrc);
        byte[] encoded = null;

        try
        {
            encoded = encrypt(keyBytes, szSrc.getBytes());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println("string after encrypt::" + byte2hex(encoded));

        byte[] srcBytes = null;

        try
        {
            srcBytes = decrypt(keyBytes, encoded);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println("string before decode: :" + (new String(srcBytes)));
    }
}

1 个答案:

答案 0 :(得分:1)

几乎可以肯定你使用szSrc.getBytes()使用平台的默认字符编码。

如果szSrc.getBytes("ISO-8859-1")在Windows上工作,请尝试httpRequest.getCharacterEncoding(),但如果此字符串来自外部服务,则应动态确定编码方案(例如,如果通过Servlet使用{{1}})